ZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGM2NDQwMWEuLjI2OGJhZWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtNCwxMyArNCwxMyBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CiBJbXBvcnQtUGFja2FnZTogb3JnLmFwYWNoZS50b29scy5hbnQsCi0gb3JnLmVjbGlwc2UuamdpdC5hbnQudGFza3M7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFudC50YXNrczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdC9wb20ueG1sCmluZGV4IDY0YjhmODEuLjRiZmJjOWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50LnRlc3QvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC50ZXN0L3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hbnQudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMDA0MDBiYy4uNmRmMzA5MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMTEgKzMsMTEgQEAKIEJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hbnQKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuYW50Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKIEltcG9ydC1QYWNrYWdlOiBvcmcuYXBhY2hlLnRvb2xzLmFudCwKLSAgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIgorICBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlUHJvdmlkZXItTmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYW50LnRhc2tzO3ZlcnNpb249IjQuMTEuOCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hbnQudGFza3M7dmVyc2lvbj0iNS4wLjQiOwogIHVzZXM6PSJvcmcuYXBhY2hlLnRvb2xzLmFudC50eXBlcyxvcmcuYXBhY2hlLnRvb2xzLmFudCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LmFudC9wb20ueG1sCmluZGV4IDdkODY3MTguLmEyODgzNjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYW50L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hbnQvcG9tLnhtbApAQCAtNDgsNyArNDgsNyBAQAogCTxwYXJlbnQ+CiAJCTxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotCQk8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisJCTx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogCTwvcGFyZW50PgogCiAJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hbnQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggMDVkMTZhYi4uMzI4NWVlNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOApAQCAtMTMsMTUgKzEzLDE1IEBACiAgb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLmNvbXByZXNzb3JzLmJ6aXAyO3ZlcnNpb249IlsxLjQsMi4wKSIsCiAgb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLmNvbXByZXNzb3JzLmd6aXA7dmVyc2lvbj0iWzEuNCwyLjApIiwKICBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuY29tcHJlc3NvcnMueHo7dmVyc2lvbj0iWzEuNCwyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5vc2dpLmZyYW1ld29yazt2ZXJzaW9uPSJbMS4zLjAsMi4wLjApIgogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS5Gb3JtYXRBY3RpdmF0b3IKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNC4xMS44IjsKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmFwaSwKICAgIG9yZy5hcGFjaGUuY29tbW9ucy5jb21wcmVzcy5hcmNoaXZlcnMsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgppbmRleCA1MDBjOWM5Li5mODU1NTFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlIC0gU291cmNlcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlLnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSI0LjExLjgucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmU7dmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIjtyb290cz0iLiIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKaW5kZXggNGI4YjdlZC4uNGJmYTE3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGFyRm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQppbmRleCA3NTU5YWRhLi45ZWQ2MGQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYXJGb3JtYXQuamF2YQpAQCAtNDIsNiArNDIsOCBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTgyLDIyICs4NCwxNCBAQCBwdWJsaWMgQXJjaGl2ZU91dHB1dFN0cmVhbSBjcmVhdGVBcmNoaXZlT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBzKQogCUBPdmVycmlkZQogCXB1YmxpYyBBcmNoaXZlT3V0cHV0U3RyZWFtIGNyZWF0ZUFyY2hpdmVPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHMsCiAJCQlNYXA8U3RyaW5nLCBPYmplY3Q+IG8pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVRhckFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IFRhckFyY2hpdmVPdXRwdXRTdHJlYW0ocywgIlVURi04Iik7IC8vJE5PTi1OTFMtMSQKKwkJVGFyQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgVGFyQXJjaGl2ZU91dHB1dFN0cmVhbShzLAorCQkJCUNIQVJBQ1RFUl9FTkNPRElORyk7CiAJCW91dC5zZXRMb25nRmlsZU1vZGUoVGFyQXJjaGl2ZU91dHB1dFN0cmVhbS5MT05HRklMRV9QT1NJWCk7CiAJCW91dC5zZXRCaWdOdW1iZXJNb2RlKFRhckFyY2hpdmVPdXRwdXRTdHJlYW0uQklHTlVNQkVSX1BPU0lYKTsKIAkJcmV0dXJuIGFwcGx5Rm9ybWF0T3B0aW9ucyhvdXQsIG8pOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQERlcHJlY2F0ZWQKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKLQkJCVN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcHV0RW50cnkob3V0LCBudWxsLCBwYXRoLCBtb2RlLGxvYWRlcik7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKIAkJCU9iamVjdElkIHRyZWUsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQpAQCAtMTA2LDcgKzEwMCw3IEBAIHB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAogCQkJZmluYWwgVGFyQXJjaGl2ZUVudHJ5IGVudHJ5ID0gbmV3IFRhckFyY2hpdmVFbnRyeSgKIAkJCQkJcGF0aCwgVGFyQ29uc3RhbnRzLkxGX1NZTUxJTkspOwogCQkJZW50cnkuc2V0TGlua05hbWUobmV3IFN0cmluZygKLQkJCQkJbG9hZGVyLmdldENhY2hlZEJ5dGVzKDEwMCksICJVVEYtOCIpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQlsb2FkZXIuZ2V0Q2FjaGVkQnl0ZXMoMTAwKSwgQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJCQlvdXQucHV0QXJjaGl2ZUVudHJ5KGVudHJ5KTsKIAkJCW91dC5jbG9zZUFyY2hpdmVFbnRyeSgpOwogCQkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGJ6MkZvcm1hdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVGJ6MkZvcm1hdC5qYXZhCmluZGV4IDJmOTVmNmQuLmZhNmE3YjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1RiejJGb3JtYXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UYnoyRm9ybWF0LmphdmEKQEAgLTgzLDE1ICs4Myw2IEBAIHB1YmxpYyBBcmNoaXZlT3V0cHV0U3RyZWFtIGNyZWF0ZUFyY2hpdmVPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHMsCiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KLQlARGVwcmVjYXRlZAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAotCQkJU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwdXRFbnRyeShvdXQsIG51bGwsIHBhdGgsIG1vZGUsbG9hZGVyKTsKLQl9Ci0KLQkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAogCQkJT2JqZWN0SWQgdHJlZSwgU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UZ3pGb3JtYXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1RnekZvcm1hdC5qYXZhCmluZGV4IGIyMmE2MmQuLjM2OGI0ZjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1RnekZvcm1hdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1RnekZvcm1hdC5qYXZhCkBAIC04MywxNSArODMsNiBAQCBwdWJsaWMgQXJjaGl2ZU91dHB1dFN0cmVhbSBjcmVhdGVBcmNoaXZlT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBzLAogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCi0JQERlcHJlY2F0ZWQKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKLQkJCVN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcHV0RW50cnkob3V0LCBudWxsLCBwYXRoLCBtb2RlLGxvYWRlcik7Ci0JfQotCi0JLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgdm9pZCBwdXRFbnRyeShBcmNoaXZlT3V0cHV0U3RyZWFtIG91dCwKIAkJCU9iamVjdElkIHRyZWUsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvVHh6Rm9ybWF0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UeHpGb3JtYXQuamF2YQppbmRleCBkMjNkMmI2Li4zNjYxNmVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UeHpGb3JtYXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LmFyY2hpdmUvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXJjaGl2ZS9UeHpGb3JtYXQuamF2YQpAQCAtODMsMTUgKzgzLDYgQEAgcHVibGljIEFyY2hpdmVPdXRwdXRTdHJlYW0gY3JlYXRlQXJjaGl2ZU91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gcywKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwotCUBEZXByZWNhdGVkCi0JQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCi0JCQlTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKLQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXB1dEVudHJ5KG91dCwgbnVsbCwgcGF0aCwgbW9kZSxsb2FkZXIpOwotCX0KLQotCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIHZvaWQgcHV0RW50cnkoQXJjaGl2ZU91dHB1dFN0cmVhbSBvdXQsCiAJCQlPYmplY3RJZCB0cmVlLCBTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwgT2JqZWN0TG9hZGVyIGxvYWRlcikKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcmNoaXZlL1ppcEZvcm1hdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvWmlwRm9ybWF0LmphdmEKaW5kZXggZGM4ZmI0NC4uODQ4MzgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvWmlwRm9ybWF0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5hcmNoaXZlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FyY2hpdmUvWmlwRm9ybWF0LmphdmEKQEAgLTg0LDE1ICs4NCw2IEBAIHB1YmxpYyBBcmNoaXZlT3V0cHV0U3RyZWFtIGNyZWF0ZUFyY2hpdmVPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHMsCiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KLQlARGVwcmVjYXRlZAotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAotCQkJU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlwdXRFbnRyeShvdXQsIG51bGwsIHBhdGgsIG1vZGUsbG9hZGVyKTsKLQl9Ci0KLQkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHB1dEVudHJ5KEFyY2hpdmVPdXRwdXRTdHJlYW0gb3V0LAogCQkJT2JqZWN0SWQgdHJlZSwgU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUsIE9iamVjdExvYWRlciBsb2FkZXIpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA2NzVhMjcyLi42OWZiNDdjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlUHJvdmlkZXItTmFtZQpAQCAtMjMsMTAgKzIzLDEwIEBACiAgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50O3ZlcnNpb249Ils0LjMuMCw1LjAuMCkiLAogIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm47dmVyc2lvbj0iWzQuMy4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLnBhcmFtczt2ZXJzaW9uPSJbNC4zLjAsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuYXBhY2hlLmh0dHAuY2xpZW50LAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cCwKICAgIG9yZy5hcGFjaGUuaHR0cC5lbnRpdHksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3BvbS54bWwKaW5kZXggMjc2NzYyNy4uYmM3MWZhYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvcG9tLnhtbApAQCAtNDgsNyArNDgsNyBAQAogCTxwYXJlbnQ+CiAJCTxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAJCTxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotCQk8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisJCTx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogCTwvcGFyZW50PgogCiAJPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZTwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L2h0dHAvYXBhY2hlL0h0dHBDbGllbnRDb25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9odHRwL2FwYWNoZS9IdHRwQ2xpZW50Q29ubmVjdGlvbi5qYXZhCmluZGV4IDI4MTkzMDAuLjdmMWZlY2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L2h0dHAvYXBhY2hlL0h0dHBDbGllbnRDb25uZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvaHR0cC9hcGFjaGUvSHR0cENsaWVudENvbm5lY3Rpb24uamF2YQpAQCAtNDIxLDcgKzQyMSw3IEBAIHB1YmxpYyB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRIb3N0bmFtZVZlcmlmaWVyKGZpbmFsIEhvc3RuYW1lVmVyaWZpZXIgaG9zdG5hbWV2ZXJpZmllcikgeworCXB1YmxpYyB2b2lkIHNldEhvc3RuYW1lVmVyaWZpZXIoSG9zdG5hbWVWZXJpZmllciBob3N0bmFtZXZlcmlmaWVyKSB7CiAJCXRoaXMuaG9zdG5hbWV2ZXJpZmllciA9IGhvc3RuYW1ldmVyaWZpZXI7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA2ODg4MTgzLi5jOTdiOTI3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMTMgKzMsMTMgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcgogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcgotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249IjQuMTEuOCIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5nbHVlO3ZlcnNpb249IjQuMTEuOCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5nbHVlO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9ImphdmF4LnNlcnZsZXQsamF2YXguc2VydmxldC5odHRwIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLnJlc29sdmVyO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci5yZXNvbHZlcjt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCkBAIC0xOCwxMiArMTgsMTIgQEAKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CiBJbXBvcnQtUGFja2FnZTogamF2YXguc2VydmxldDt2ZXJzaW9uPSJbMi41LjAsMy4yLjApIiwKICBqYXZheC5zZXJ2bGV0Lmh0dHA7dmVyc2lvbj0iWzIuNS4wLDMuMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3BvbS54bWwKaW5kZXggM2EyMjU3ZC4uNmY3MDA4MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvcG9tLnhtbApAQCAtNTIsNyArNTIsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Bc0lzRmlsZUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9Bc0lzRmlsZUZpbHRlci5qYXZhCmluZGV4IDdmODI2ZDQuLjllOWYyNWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvQXNJc0ZpbGVGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0FzSXNGaWxlRmlsdGVyLmphdmEKQEAgLTY2LDcgKzY2LDcgQEAKIGNsYXNzIEFzSXNGaWxlRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKIAlwcml2YXRlIGZpbmFsIEFzSXNGaWxlU2VydmljZSBhc0lzOwogCi0JQXNJc0ZpbGVGaWx0ZXIoZmluYWwgQXNJc0ZpbGVTZXJ2aWNlIGdldEFueUZpbGUpIHsKKwlBc0lzRmlsZUZpbHRlcihBc0lzRmlsZVNlcnZpY2UgZ2V0QW55RmlsZSkgewogCQl0aGlzLmFzSXMgPSBnZXRBbnlGaWxlOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9GaWxlU2VuZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0ZpbGVTZW5kZXIuamF2YQppbmRleCAwZDkzNWZjLi4wNTUxMGEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0ZpbGVTZW5kZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0ZpbGVTZW5kZXIuamF2YQpAQCAtODQsNyArODQsNyBAQCBmaW5hbCBjbGFzcyBGaWxlU2VuZGVyIHsKIAogCXByaXZhdGUgbG9uZyBlbmQ7CiAKLQlGaWxlU2VuZGVyKGZpbmFsIEZpbGUgcGF0aCkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisJRmlsZVNlbmRlcihGaWxlIHBhdGgpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogCQl0aGlzLnBhdGggPSBwYXRoOwogCQl0aGlzLnNvdXJjZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKHBhdGgsICJyIik7CiAKQEAgLTIxNyw3ICsyMTcsNyBAQCBwcml2YXRlIGJvb2xlYW4gaW5pdFJhbmdlUmVxdWVzdChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldFJhbmdlKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKKwlwcml2YXRlIHN0YXRpYyBFbnVtZXJhdGlvbjxTdHJpbmc+IGdldFJhbmdlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKIAkJcmV0dXJuIHJlcS5nZXRIZWFkZXJzKEhEUl9SQU5HRSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9HaXRTZXJ2bGV0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQppbmRleCBlZTIzNjc3Li5kMGVhN2I2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0dpdFNlcnZsZXQuamF2YQpAQCAtMTgzLDcgKzE4Myw3IEBAIHB1YmxpYyB2b2lkIGFkZFJlY2VpdmVQYWNrRmlsdGVyKEZpbHRlciBmaWx0ZXIpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgaW5pdChmaW5hbCBTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGluaXQoU2VydmxldENvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKIAkJZ2l0RmlsdGVyLmluaXQobmV3IEZpbHRlckNvbmZpZygpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIFN0cmluZyBnZXRGaWx0ZXJOYW1lKCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUGFja3NTZXJ2bGV0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0luZm9QYWNrc1NlcnZsZXQuamF2YQppbmRleCA4MzBlMDYxLi41MmFhZjUxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0luZm9QYWNrc1NlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0luZm9QYWNrc1NlcnZsZXQuamF2YQpAQCAtNjcsNyArNjcsNyBAQCBwdWJsaWMgdm9pZCBkb0dldChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogCQlzZW5kUGxhaW5UZXh0KHBhY2tMaXN0KHJlcSksIHJlcSwgcnNwKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFja0xpc3QoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBwYWNrTGlzdChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZmluYWwgT2JqZWN0RGF0YWJhc2UgZGIgPSBnZXRSZXBvc2l0b3J5KHJlcSkuZ2V0T2JqZWN0RGF0YWJhc2UoKTsKIAkJaWYgKGRiIGluc3RhbmNlb2YgT2JqZWN0RGlyZWN0b3J5KSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0luZm9SZWZzU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9JbmZvUmVmc1NlcnZsZXQuamF2YQppbmRleCA0ZjcwY2Y3Li4wZjQ2MzNiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0luZm9SZWZzU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSW5mb1JlZnNTZXJ2bGV0LmphdmEKQEAgLTQ0LDE4ICs0NCwxNSBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyOwogCiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuU2VydmxldFV0aWxzLmdldFJlcG9zaXRvcnk7Ci1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlZkFkdmVydGlzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0OwpAQCAtNzksNyArNzYsNyBAQCBwdWJsaWMgdm9pZCBkb0dldChmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLAogCQkJCUNvbnN0YW50cy5DSEFSU0VUKSkgewogCQkJZmluYWwgUmVmQWR2ZXJ0aXNlciBhZHYgPSBuZXcgUmVmQWR2ZXJ0aXNlcigpIHsKIAkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCB3cml0ZU9uZShmaW5hbCBDaGFyU2VxdWVuY2UgbGluZSkKKwkJCQlwcm90ZWN0ZWQgdm9pZCB3cml0ZU9uZShDaGFyU2VxdWVuY2UgbGluZSkKIAkJCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJCS8vIFdob2V2ZXIgZGVjaWRlZCB0aGF0IGluZm8vcmVmcyBzaG91bGQgdXNlIGEgZGlmZmVyZW50CiAJCQkJCS8vIGRlbGltaXRlciB0aGFuIHRoZSBuYXRpdmUgZ2l0Oi8vIHByb3RvY29sIHNob3VsZG4ndApAQCAtOTQsMTAgKzkxLDcgQEAgcHJvdGVjdGVkIHZvaWQgZW5kKCkgewogCQkJfTsKIAkJCWFkdi5pbml0KGRiKTsKIAkJCWFkdi5zZXREZXJlZlRhZ3ModHJ1ZSk7Ci0KLQkJCU1hcDxTdHJpbmcsIFJlZj4gcmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOwotCQkJcmVmcy5yZW1vdmUoQ29uc3RhbnRzLkhFQUQpOwotCQkJYWR2LnNlbmQocmVmcyk7CisJCQlhZHYuc2VuZChkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnNCeVByZWZpeChDb25zdGFudHMuUl9SRUZTKSk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL0lzTG9jYWxGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSXNMb2NhbEZpbHRlci5qYXZhCmluZGV4IGIwYjgzMWYuLmIzNzk5ODMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSXNMb2NhbEZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvSXNMb2NhbEZpbHRlci5qYXZhCkBAIC04OCw3ICs4OCw3IEBAIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKIAkJCSgoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2UpLnNlbmRFcnJvcihTQ19GT1JCSURERU4pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMb2NhbChmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xvY2FsKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldE9iamVjdERhdGFiYXNlKCkgaW5zdGFuY2VvZiBPYmplY3REaXJlY3Rvcnk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9PYmplY3RGaWxlU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9PYmplY3RGaWxlU2VydmxldC5qYXZhCmluZGV4IDUwZGM2OGYuLjYyZjA3NWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvT2JqZWN0RmlsZVNlcnZsZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL09iamVjdEZpbGVTZXJ2bGV0LmphdmEKQEAgLTc1LDcgKzc1LDcgQEAgc3RhdGljIGNsYXNzIExvb3NlIGV4dGVuZHMgT2JqZWN0RmlsZVNlcnZsZXQgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCVN0cmluZyBldGFnKGZpbmFsIEZpbGVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgZXRhZyhGaWxlU2VuZGVyIHNlbmRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBMb25nLnRvSGV4U3RyaW5nKHNlbmRlci5nZXRMYXN0TW9kaWZpZWQoKSk7CiAJCX0KIAl9CkBAIC04OCw3ICs4OCw3IEBAIHByaXZhdGUgc3RhdGljIGFic3RyYWN0IGNsYXNzIFBhY2tEYXRhIGV4dGVuZHMgT2JqZWN0RmlsZVNlcnZsZXQgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCVN0cmluZyBldGFnKGZpbmFsIEZpbGVTZW5kZXIgc2VuZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlTdHJpbmcgZXRhZyhGaWxlU2VuZGVyIHNlbmRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBzZW5kZXIuZ2V0VGFpbENoZWNrc3VtKCk7CiAJCX0KIAl9CkBAIC0xMTEsNyArMTExLDcgQEAgc3RhdGljIGNsYXNzIFBhY2tJZHggZXh0ZW5kcyBQYWNrRGF0YSB7CiAKIAlwcml2YXRlIGZpbmFsIFN0cmluZyBjb250ZW50VHlwZTsKIAotCU9iamVjdEZpbGVTZXJ2bGV0KGZpbmFsIFN0cmluZyBjb250ZW50VHlwZSkgeworCU9iamVjdEZpbGVTZXJ2bGV0KFN0cmluZyBjb250ZW50VHlwZSkgewogCQl0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGU7CiAJfQogCkBAIC0xNzAsNyArMTcwLDcgQEAgcHJpdmF0ZSB2b2lkIHNlcnZlKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBGaWxlIG9iamVjdHMoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCXByaXZhdGUgc3RhdGljIEZpbGUgb2JqZWN0cyhIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CiAJCWZpbmFsIFJlcG9zaXRvcnkgZGIgPSBnZXRSZXBvc2l0b3J5KHJlcSk7CiAJCXJldHVybiAoKE9iamVjdERpcmVjdG9yeSkgZGIuZ2V0T2JqZWN0RGF0YWJhc2UoKSkuZ2V0RGlyZWN0b3J5KCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9SZXBvc2l0b3J5RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1JlcG9zaXRvcnlGaWx0ZXIuamF2YQppbmRleCBjODlhNWQ3Li4wMjBiZTRmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1JlcG9zaXRvcnlGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1JlcG9zaXRvcnlGaWx0ZXIuamF2YQpAQCAtMTAwLDEzICsxMDAsMTMgQEAgcHVibGljIGNsYXNzIFJlcG9zaXRvcnlGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgewogCSAqICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnl9IGluc3RhbmNlIGZvciB0aGUKIAkgKiAgICAgICAgICAgIGN1cnJlbnQgd2ViIHJlcXVlc3QuCiAJICovCi0JcHVibGljIFJlcG9zaXRvcnlGaWx0ZXIoZmluYWwgUmVwb3NpdG9yeVJlc29sdmVyPEh0dHBTZXJ2bGV0UmVxdWVzdD4gcmVzb2x2ZXIpIHsKKwlwdWJsaWMgUmVwb3NpdG9yeUZpbHRlcihSZXBvc2l0b3J5UmVzb2x2ZXI8SHR0cFNlcnZsZXRSZXF1ZXN0PiByZXNvbHZlcikgewogCQl0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBpbml0KGZpbmFsIEZpbHRlckNvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBjb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKIAkJY29udGV4dCA9IGNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpOwogCX0KIApAQCAtMTQwLDkgKzE0MCw5IEBAIHB1YmxpYyB2b2lkIGRvRmlsdGVyKGZpbmFsIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsCiAJCQlyZXR1cm47CiAJCX0KIAotCQlmaW5hbCBSZXBvc2l0b3J5IGRiOwotCQl0cnkgewotCQkJZGIgPSByZXNvbHZlci5vcGVuKHJlcSwgbmFtZSk7CisJCXRyeSAoUmVwb3NpdG9yeSBkYiA9IHJlc29sdmVyLm9wZW4ocmVxLCBuYW1lKSkgeworCQkJcmVxdWVzdC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1JFUE9TSVRPUlksIGRiKTsKKwkJCWNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKIAkJfSBjYXRjaCAoUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKIAkJCXNlbmRFcnJvcihyZXEsIHJlcywgU0NfTk9UX0ZPVU5EKTsKIAkJCXJldHVybjsKQEAgLTE1NSwxMyArMTU1LDggQEAgcHVibGljIHZvaWQgZG9GaWx0ZXIoZmluYWwgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKIAkJfSBjYXRjaCAoU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uIGUpIHsKIAkJCXNlbmRFcnJvcihyZXEsIHJlcywgZS5nZXRTdGF0dXNDb2RlKCksIGUuZ2V0TWVzc2FnZSgpKTsKIAkJCXJldHVybjsKLQkJfQotCQl0cnkgewotCQkJcmVxdWVzdC5zZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1JFUE9TSVRPUlksIGRiKTsKLQkJCWNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKIAkJfSBmaW5hbGx5IHsKIAkJCXJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKEFUVFJJQlVURV9SRVBPU0lUT1JZKTsKLQkJCWRiLmNsb3NlKCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NlcnZsZXRVdGlscy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TZXJ2bGV0VXRpbHMuamF2YQppbmRleCBmMWZmNTQ3Li45NjAxYzhjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NlcnZsZXRVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU2VydmxldFV0aWxzLmphdmEKQEAgLTkwLDcgKzkwLDcgQEAgcHVibGljIGZpbmFsIGNsYXNzIFNlcnZsZXRVdGlscyB7CiAJICogICAgICAgICAgICAgdGhlIGZpbHRlciBydW5zIGJlZm9yZSB0aGUgc2VydmxldC4KIAkgKiBAc2VlICNBVFRSSUJVVEVfUkVQT1NJVE9SWQogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KGZpbmFsIFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCXB1YmxpYyBzdGF0aWMgUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlSZXBvc2l0b3J5IGRiID0gKFJlcG9zaXRvcnkpIHJlcS5nZXRBdHRyaWJ1dGUoQVRUUklCVVRFX1JFUE9TSVRPUlkpOwogCQlpZiAoZGIgPT0gbnVsbCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSHR0cFNlcnZlclRleHQuZ2V0KCkuZXhwZWN0ZWRSZXBvc2l0b3J5QXR0cmlidXRlKTsKQEAgLTExMCw3ICsxMTAsNyBAQCBwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeShmaW5hbCBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgYW4gaW5wdXQgb3Igb3V0cHV0IGV4Y2VwdGlvbiBvY2N1cnJlZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpCisJcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShIdHRwU2VydmxldFJlcXVlc3QgcmVxKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSW5wdXRTdHJlYW0gaW4gPSByZXEuZ2V0SW5wdXRTdHJlYW0oKTsKIAkJZmluYWwgU3RyaW5nIGVuYyA9IHJlcS5nZXRIZWFkZXIoSERSX0NPTlRFTlRfRU5DT0RJTkcpOwpAQCAtMjIwLDEyICsyMjAsOSBAQCBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZFBsYWluVGV4dChmaW5hbCBTdHJpbmcgY29udGVudCwKIAlwdWJsaWMgc3RhdGljIHZvaWQgc2VuZChieXRlW10gY29udGVudCwgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAkJCWZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcnNwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQljb250ZW50ID0gc2VuZEluaXQoY29udGVudCwgcmVxLCByc3ApOwotCQlmaW5hbCBPdXRwdXRTdHJlYW0gb3V0ID0gcnNwLmdldE91dHB1dFN0cmVhbSgpOwotCQl0cnkgeworCQl0cnkgKE91dHB1dFN0cmVhbSBvdXQgPSByc3AuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKIAkJCW91dC53cml0ZShjb250ZW50KTsKIAkJCW91dC5mbHVzaCgpOwotCQl9IGZpbmFsbHkgewotCQkJb3V0LmNsb3NlKCk7CiAJCX0KIAl9CiAKQEAgLTI0MSw3ICsyMzgsNyBAQCBwdWJsaWMgc3RhdGljIHZvaWQgc2VuZChieXRlW10gY29udGVudCwgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKIAkJcmV0dXJuIGNvbnRlbnQ7CiAJfQogCi0Jc3RhdGljIGJvb2xlYW4gYWNjZXB0c0d6aXBFbmNvZGluZyhmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CisJc3RhdGljIGJvb2xlYW4gYWNjZXB0c0d6aXBFbmNvZGluZyhIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB7CiAJCXJldHVybiBhY2NlcHRzR3ppcEVuY29kaW5nKHJlcS5nZXRIZWFkZXIoSERSX0FDQ0VQVF9FTkNPRElORykpOwogCX0KIApAQCAtMjYxLDcgKzI1OCw3IEBAIHN0YXRpYyBib29sZWFuIGFjY2VwdHNHemlwRW5jb2RpbmcoU3RyaW5nIGFjY2VwdHMpIHsKIAkJcmV0dXJuIGZhbHNlOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBjb21wcmVzcyhmaW5hbCBieXRlW10gcmF3KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBjb21wcmVzcyhieXRlW10gcmF3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBpbnQgbWF4TGVuID0gcmF3Lmxlbmd0aCArIDMyOwogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbShtYXhMZW4pOwogCQlmaW5hbCBHWklQT3V0cHV0U3RyZWFtIGd6ID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0ob3V0KTsKQEAgLTI3MSw3ICsyNjgsNyBAQCBzdGF0aWMgYm9vbGVhbiBhY2NlcHRzR3ppcEVuY29kaW5nKFN0cmluZyBhY2NlcHRzKSB7CiAJCXJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXRhZyhmaW5hbCBieXRlW10gY29udGVudCkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBldGFnKGJ5dGVbXSBjb250ZW50KSB7CiAJCWZpbmFsIE1lc3NhZ2VEaWdlc3QgbWQgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOwogCQltZC51cGRhdGUoY29udGVudCk7CiAJCXJldHVybiBPYmplY3RJZC5mcm9tUmF3KG1kLmRpZ2VzdCgpKS5nZXROYW1lKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0T3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0T3V0cHV0U3RyZWFtLmphdmEKaW5kZXggNGViOTRhMy4uYWQ1ZThkNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TbWFydE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU21hcnRPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTEwLDExICsxMTAsOCBAQCBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlpZiAoMjU2IDwgb3V0Lmxlbmd0aCgpICYmIGFjY2VwdHNHemlwRW5jb2RpbmcocmVxKSkgewogCQkJCVRlbXBvcmFyeUJ1ZmZlciBnemJ1ZiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcChMSU1JVCk7CiAJCQkJdHJ5IHsKLQkJCQkJR1pJUE91dHB1dFN0cmVhbSBnemlwID0gbmV3IEdaSVBPdXRwdXRTdHJlYW0oZ3pidWYpOwotCQkJCQl0cnkgeworCQkJCQl0cnkgKEdaSVBPdXRwdXRTdHJlYW0gZ3ppcCA9IG5ldyBHWklQT3V0cHV0U3RyZWFtKGd6YnVmKSkgewogCQkJCQkJb3V0LndyaXRlVG8oZ3ppcCwgbnVsbCk7Ci0JCQkJCX0gZmluYWxseSB7Ci0JCQkJCQlnemlwLmNsb3NlKCk7CiAJCQkJCX0KIAkJCQkJaWYgKGd6YnVmLmxlbmd0aCgpIDwgb3V0Lmxlbmd0aCgpKSB7CiAJCQkJCQlvdXQgPSBnemJ1ZjsKQEAgLTEzMSwxMiArMTI4LDkgQEAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJLy8gaGFyZGNvZGVkIExJTUlUIGNvbnN0YW50IGFib3ZlIGFzc3VyZXMgdXMgd2Ugd291bGRuJ3Qgc3RvcmUKIAkJCS8vIG1vcmUgdGhhbiAyIEdpQiBvZiBjb250ZW50IGluIG1lbW9yeS4KIAkJCXJzcC5zZXRDb250ZW50TGVuZ3RoKChpbnQpIG91dC5sZW5ndGgoKSk7Ci0JCQlmaW5hbCBPdXRwdXRTdHJlYW0gb3MgPSByc3AuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChPdXRwdXRTdHJlYW0gb3MgPSByc3AuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQlvdXQud3JpdGVUbyhvcywgbnVsbCk7CiAJCQkJb3MuZmx1c2goKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJb3MuY2xvc2UoKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU21hcnRTZXJ2aWNlSW5mb1JlZnMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvU21hcnRTZXJ2aWNlSW5mb1JlZnMuamF2YQppbmRleCA2NDE3ODc3Li4xOTVkZmY5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1NtYXJ0U2VydmljZUluZm9SZWZzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9TbWFydFNlcnZpY2VJbmZvUmVmcy5qYXZhCkBAIC03NSw3ICs3NSw3IEBAIGFic3RyYWN0IGNsYXNzIFNtYXJ0U2VydmljZUluZm9SZWZzIGltcGxlbWVudHMgRmlsdGVyIHsKIAogCXByaXZhdGUgZmluYWwgRmlsdGVyW10gZmlsdGVyczsKIAotCVNtYXJ0U2VydmljZUluZm9SZWZzKGZpbmFsIFN0cmluZyBzZXJ2aWNlLCBmaW5hbCBMaXN0PEZpbHRlcj4gZmlsdGVycykgeworCVNtYXJ0U2VydmljZUluZm9SZWZzKFN0cmluZyBzZXJ2aWNlLCBMaXN0PEZpbHRlcj4gZmlsdGVycykgewogCQl0aGlzLnN2YyA9IHNlcnZpY2U7CiAJCXRoaXMuZmlsdGVycyA9IGZpbHRlcnMudG9BcnJheShuZXcgRmlsdGVyW2ZpbHRlcnMuc2l6ZSgpXSk7CiAJfQpAQCAtMTMzLDkgKzEzMyw3IEBAIHByaXZhdGUgdm9pZCBzZXJ2aWNlKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKIAkJCXJlcy5zZXRDb250ZW50VHlwZShpbmZvUmVmc1Jlc3VsdFR5cGUoc3ZjKSk7CiAKIAkJCWZpbmFsIFBhY2tldExpbmVPdXQgb3V0ID0gbmV3IFBhY2tldExpbmVPdXQoYnVmKTsKLQkJCW91dC53cml0ZVN0cmluZygiIyBzZXJ2aWNlPSIgKyBzdmMgKyAiXG4iKTsKLQkJCW91dC5lbmQoKTsKLQkJCWFkdmVydGlzZShyZXEsIG5ldyBQYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlcihvdXQpKTsKKwkJCXJlc3BvbmQocmVxLCBvdXQsIHN2Yyk7CiAJCQlidWYuY2xvc2UoKTsKIAkJfSBjYXRjaCAoU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gZSkgewogCQkJcmVzLnNlbmRFcnJvcihTQ19VTkFVVEhPUklaRUQsIGUuZ2V0TWVzc2FnZSgpKTsKQEAgLTE3OCw2ICsxNzYsMzcgQEAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgYWR2ZXJ0aXNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAJCQlQYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlciBwY2spIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCVNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLCBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKIAorCS8qKgorCSAqIFdyaXRlcyB0aGUgYXBwcm9wcmlhdGUgcmVzcG9uc2UgdG8gYW4gaW5mby9yZWZzIHJlcXVlc3QgcmVjZWl2ZWQgYnkKKwkgKiBhIHNtYXJ0IHNlcnZpY2UuIEluIHByb3RvY29sIHYwLCB0aGlzIHN0YXJ0cyB3aXRoICIjCisJICogc2VydmljZT1zZXJ2aWNlTmFtZSIgZm9sbG93ZWQgYnkgYSBmbHVzaCBwYWNrZXQsIGJ1dCB0aGlzIGlzIG5vdAorCSAqIG5lY2Vzc2FyaWx5IHRoZSBjYXNlIGluIG90aGVyIHByb3RvY29sIHZlcnNpb25zLgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdyaXRlcyAiIyBzZXJ2aWNlPXNlcnZpY2VOYW1lIiBhbmQgYQorCSAqIGZsdXNoIHBhY2tldCwgdGhlbiBjYWxscyB7QGxpbmsgI2FkdmVydGlzZX0uIFN1YmNsYXNzZXMgc2hvdWxkCisJICogb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBzdXBwb3J0IHByb3RvY29sIHZlcnNpb25zIG90aGVyIHRoYW4KKwkgKiBwcm90b2NvbCB2MC4KKwkgKgorCSAqIEBwYXJhbSByZXEKKwkgKiAgICAgICAgICAgIHJlcXVlc3QKKwkgKiBAcGFyYW0gcGNrT3V0CisJICogICAgICAgICAgICBkZXN0aW5hdGlvbiBvZiByZXNwb25zZQorCSAqIEBwYXJhbSBzZXJ2aWNlTmFtZQorCSAqICAgICAgICAgICAgc2VydmljZSBuYW1lIHRvIGJlIHdyaXR0ZW4gb3V0IGluIHByb3RvY29sIHYwOyBtYXkgb3IgbWF5CisJICogICAgICAgICAgICBub3QgYmUgdXNlZCBpbiBvdGhlciB2ZXJzaW9ucworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiBAdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uCisJICogQHRocm93cyBTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbgorCSAqLworCXByb3RlY3RlZCB2b2lkIHJlc3BvbmQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKwkJCVBhY2tldExpbmVPdXQgcGNrT3V0LCBTdHJpbmcgc2VydmljZU5hbWUpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAorCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQlwY2tPdXQud3JpdGVTdHJpbmcoIiMgc2VydmljZT0iICsgc3ZjICsgJ1xuJyk7IC8vJE5PTi1OTFMtMSQKKwkJcGNrT3V0LmVuZCgpOworCQlhZHZlcnRpc2UocmVxLCBuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIocGNrT3V0KSk7CisJfQorCiAJcHJpdmF0ZSBjbGFzcyBDaGFpbiBpbXBsZW1lbnRzIEZpbHRlckNoYWluIHsKIAkJcHJpdmF0ZSBpbnQgZmlsdGVySWR4OwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1RleHRGaWxlU2VydmxldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9UZXh0RmlsZVNlcnZsZXQuamF2YQppbmRleCAwMDg1MWNmLi5iMjQ2NmQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1RleHRGaWxlU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVGV4dEZpbGVTZXJ2bGV0LmphdmEKQEAgLTY0LDcgKzY0LDcgQEAgY2xhc3MgVGV4dEZpbGVTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgewogCiAJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsZU5hbWU7CiAKLQlUZXh0RmlsZVNlcnZsZXQoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlUZXh0RmlsZVNlcnZsZXQoU3RyaW5nIG5hbWUpIHsKIAkJdGhpcy5maWxlTmFtZSA9IG5hbWU7CiAJfQogCkBAIC04MCw3ICs4MCw3IEBAIHB1YmxpYyB2b2lkIGRvR2V0KGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAJCX0KIAl9CiAKLQlwcml2YXRlIGJ5dGVbXSByZWFkKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBieXRlW10gcmVhZChIdHRwU2VydmxldFJlcXVlc3QgcmVxKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBGaWxlIGdpdGRpciA9IGdldFJlcG9zaXRvcnkocmVxKS5nZXREaXJlY3RvcnkoKTsKIAkJaWYgKGdpdGRpciA9PSBudWxsKQogCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbihmaWxlTmFtZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tTZXJ2bGV0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL1VwbG9hZFBhY2tTZXJ2bGV0LmphdmEKaW5kZXggM2U5YzFmZS4uY2E2Yjc0OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9VcGxvYWRQYWNrU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvVXBsb2FkUGFja1NlcnZsZXQuamF2YQpAQCAtNzYsNiArNzYsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5JbnRlcm5hbEh0dHBTZXJ2ZXJHbHVlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlBhY2tldExpbmVPdXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVmQWR2ZXJ0aXNlci5QYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5TZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVXBsb2FkUGFjazsKQEAgLTExNyw2ICsxMTgsMjUgQEAgcHJvdGVjdGVkIHZvaWQgYWR2ZXJ0aXNlKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEsCiAJCQkJdXAuc2V0QmlEaXJlY3Rpb25hbFBpcGUoZmFsc2UpOwogCQkJCXVwLnNlbmRBZHZlcnRpc2VkUmVmcyhwY2spOwogCQkJfSBmaW5hbGx5IHsKKwkJCQkvLyBUT0RPKGpvbmF0aGFudGFubXkpOiBNb3ZlIHJlc3BvbnNpYmlsaXR5IGZvciBjbG9zaW5nIHRoZQorCQkJCS8vIFJldldhbGsgdG8gVXBsb2FkUGFjaywgZWl0aGVyIGJ5IG1ha2luZyBpdCBBdXRvQ2xvc2VhYmxlCisJCQkJLy8gb3IgYnkgbWFraW5nIHNlbmRBZHZlcnRpc2VkUmVmcyBjbGVhbiB1cCBhZnRlciBpdHNlbGYuCisJCQkJdXAuZ2V0UmV2V2FsaygpLmNsb3NlKCk7CisJCQl9CisJCX0KKworCQlAT3ZlcnJpZGUKKwkJcHJvdGVjdGVkIHZvaWQgcmVzcG9uZChIdHRwU2VydmxldFJlcXVlc3QgcmVxLAorCQkJCVBhY2tldExpbmVPdXQgcGNrT3V0LCBTdHJpbmcgc2VydmljZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwKKwkJCQlTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQkJVXBsb2FkUGFjayB1cCA9IChVcGxvYWRQYWNrKSByZXEuZ2V0QXR0cmlidXRlKEFUVFJJQlVURV9IQU5ETEVSKTsKKwkJCXRyeSB7CisJCQkJdXAuc2V0QmlEaXJlY3Rpb25hbFBpcGUoZmFsc2UpOworCQkJCXVwLnNlbmRBZHZlcnRpc2VkUmVmcyhuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIocGNrT3V0KSwgc2VydmljZU5hbWUpOworCQkJfSBmaW5hbGx5IHsKKwkJCQkvLyBUT0RPKGpvbmF0aGFudGFubXkpOiBNb3ZlIHJlc3BvbnNpYmlsaXR5IGZvciBjbG9zaW5nIHRoZQorCQkJCS8vIFJldldhbGsgdG8gVXBsb2FkUGFjaywgZWl0aGVyIGJ5IG1ha2luZyBpdCBBdXRvQ2xvc2VhYmxlCisJCQkJLy8gb3IgYnkgbWFraW5nIHNlbmRBZHZlcnRpc2VkUmVmcyBjbGVhbiB1cCBhZnRlciBpdHNlbGYuCiAJCQkJdXAuZ2V0UmV2V2FsaygpLmNsb3NlKCk7CiAJCQl9CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9FcnJvclNlcnZsZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9FcnJvclNlcnZsZXQuamF2YQppbmRleCA1N2ZkZGRhLi42ZjI3YjI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvRXJyb3JTZXJ2bGV0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL0Vycm9yU2VydmxldC5qYXZhCkBAIC02NCw3ICs2NCw3IEBAIHB1YmxpYyBjbGFzcyBFcnJvclNlcnZsZXQgZXh0ZW5kcyBIdHRwU2VydmxldCB7CiAJICogQHBhcmFtIHN0YXR1cwogCSAqICAgICAgICAgICAgdGhlIEhUVFAgc3RhdHVzIGNvZGUgdG8gYWx3YXlzIHNlbmQuCiAJICovCi0JcHVibGljIEVycm9yU2VydmxldChmaW5hbCBpbnQgc3RhdHVzKSB7CisJcHVibGljIEVycm9yU2VydmxldChpbnQgc3RhdHVzKSB7CiAJCXRoaXMuc3RhdHVzID0gc3RhdHVzOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4R3JvdXBGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9SZWdleEdyb3VwRmlsdGVyLmphdmEKaW5kZXggYTNkYzZjMy4uZjI2ZWJjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4R3JvdXBGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvUmVnZXhHcm91cEZpbHRlci5qYXZhCkBAIC03NSw3ICs3NSw3IEBAIHB1YmxpYyBjbGFzcyBSZWdleEdyb3VwRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKIAkgKiBAcGFyYW0gZ3JvdXBJZHgKIAkgKiAgICAgICAgICAgIGNhcHR1cmUgZ3JvdXAgbnVtYmVyLCAxIHRocm91Z2ggdGhlIG51bWJlciBvZiBncm91cHMuCiAJICovCi0JcHVibGljIFJlZ2V4R3JvdXBGaWx0ZXIoZmluYWwgaW50IGdyb3VwSWR4KSB7CisJcHVibGljIFJlZ2V4R3JvdXBGaWx0ZXIoaW50IGdyb3VwSWR4KSB7CiAJCWlmIChncm91cElkeCA8IDEpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlIdHRwU2VydmVyVGV4dC5nZXQoKS5pbnZhbGlkSW5kZXgsIHZhbHVlT2YoZ3JvdXBJZHgpKSk7CkBAIC0xMDgsNyArMTA4LDcgQEAgcHVibGljIHZvaWQgZG9GaWx0ZXIoZmluYWwgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKIAkJCQkJdmFsdWVPZihncm91cElkeCArIDEpKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgV3JhcHBlZFJlcXVlc3RbXSBncm91cHNGb3IoZmluYWwgU2VydmxldFJlcXVlc3QgcikgeworCXByaXZhdGUgc3RhdGljIFdyYXBwZWRSZXF1ZXN0W10gZ3JvdXBzRm9yKFNlcnZsZXRSZXF1ZXN0IHIpIHsKIAkJcmV0dXJuIChXcmFwcGVkUmVxdWVzdFtdKSByLmdldEF0dHJpYnV0ZShNZXRhRmlsdGVyLlJFR0VYX0dST1VQUyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4UGlwZWxpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9SZWdleFBpcGVsaW5lLmphdmEKaW5kZXggYmYyZDZkYi4uMDEwODEwNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1JlZ2V4UGlwZWxpbmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvUmVnZXhQaXBlbGluZS5qYXZhCkBAIC04NywxMSArODcsMTEgQEAgY2xhc3MgUmVnZXhQaXBlbGluZSBleHRlbmRzIFVybFBpcGVsaW5lIHsKIAlzdGF0aWMgY2xhc3MgQmluZGVyIGV4dGVuZHMgU2VydmxldEJpbmRlckltcGwgewogCQlwcml2YXRlIGZpbmFsIFBhdHRlcm4gcGF0dGVybjsKIAotCQlCaW5kZXIoZmluYWwgU3RyaW5nIHApIHsKKwkJQmluZGVyKFN0cmluZyBwKSB7CiAJCQlwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKHApOwogCQl9CiAKLQkJQmluZGVyKGZpbmFsIFBhdHRlcm4gcCkgeworCQlCaW5kZXIoUGF0dGVybiBwKSB7CiAJCQlwYXR0ZXJuID0gcDsKIAkJfQogCkBAIC0xMTAsNyArMTEwLDcgQEAgVXJsUGlwZWxpbmUgY3JlYXRlKCkgewogCX0KIAogCUBPdmVycmlkZQotCWJvb2xlYW4gbWF0Y2goZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCWJvb2xlYW4gbWF0Y2goSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlmaW5hbCBTdHJpbmcgcGF0aEluZm8gPSByZXEuZ2V0UGF0aEluZm8oKTsKIAkJcmV0dXJuIHBhdGhJbmZvICE9IG51bGwgJiYgcGF0dGVybi5tYXRjaGVyKHBhdGhJbmZvKS5tYXRjaGVzKCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9nbHVlL1N1ZmZpeFBpcGVsaW5lLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvU3VmZml4UGlwZWxpbmUuamF2YQppbmRleCA2NzQyYzlmLi40ZmQ5OWM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvU3VmZml4UGlwZWxpbmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvU3VmZml4UGlwZWxpbmUuamF2YQpAQCAtNjcsNyArNjcsNyBAQCBjbGFzcyBTdWZmaXhQaXBlbGluZSBleHRlbmRzIFVybFBpcGVsaW5lIHsKIAlzdGF0aWMgY2xhc3MgQmluZGVyIGV4dGVuZHMgU2VydmxldEJpbmRlckltcGwgewogCQlwcml2YXRlIGZpbmFsIFN0cmluZyBzdWZmaXg7CiAKLQkJQmluZGVyKGZpbmFsIFN0cmluZyBzdWZmaXgpIHsKKwkJQmluZGVyKFN0cmluZyBzdWZmaXgpIHsKIAkJCXRoaXMuc3VmZml4ID0gc3VmZml4OwogCQl9CiAKQEAgLTg5LDcgKzg5LDcgQEAgVXJsUGlwZWxpbmUgY3JlYXRlKCkgewogCX0KIAogCUBPdmVycmlkZQotCWJvb2xlYW4gbWF0Y2goZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworCWJvb2xlYW4gbWF0Y2goSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgewogCQlmaW5hbCBTdHJpbmcgcGF0aEluZm8gPSByZXEuZ2V0UGF0aEluZm8oKTsKIAkJcmV0dXJuIHBhdGhJbmZvICE9IG51bGwgJiYgcGF0aEluZm8uZW5kc1dpdGgoc3VmZml4KTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL2dsdWUvVXJsUGlwZWxpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9VcmxQaXBlbGluZS5qYXZhCmluZGV4IDU2ZTRlMjIuLmMwMjM5OWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9VcmxQaXBlbGluZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvZ2x1ZS9VcmxQaXBlbGluZS5qYXZhCkBAIC03OSw3ICs3OSw3IEBAIGFic3RyYWN0IGNsYXNzIFVybFBpcGVsaW5lIHsKIAkvKiogSW5zdGFuY2UgdGhhdCBtdXN0IGdlbmVyYXRlIHRoZSByZXNwb25zZTsgbmV2ZXIgbnVsbC4gKi8KIAlwcml2YXRlIGZpbmFsIEh0dHBTZXJ2bGV0IHNlcnZsZXQ7CiAKLQlVcmxQaXBlbGluZShmaW5hbCBGaWx0ZXJbXSBmaWx0ZXJzLCBmaW5hbCBIdHRwU2VydmxldCBzZXJ2bGV0KSB7CisJVXJsUGlwZWxpbmUoRmlsdGVyW10gZmlsdGVycywgSHR0cFNlcnZsZXQgc2VydmxldCkgewogCQl0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzOwogCQl0aGlzLnNlcnZsZXQgPSBzZXJ2bGV0OwogCX0KQEAgLTk5LDcgKzk5LDcgQEAgYWJzdHJhY3QgY2xhc3MgVXJsUGlwZWxpbmUgewogCSAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgZmlsdGVyIG9yIHNlcnZsZXQgaXMgdW5hYmxlIHRvIGluaXRpYWxpemUuCiAJICovCi0Jdm9pZCBpbml0KGZpbmFsIFNlcnZsZXRDb250ZXh0IGNvbnRleHQsIGZpbmFsIFNldDxPYmplY3Q+IGluaXRlZCkKKwl2b2lkIGluaXQoU2VydmxldENvbnRleHQgY29udGV4dCwgU2V0PE9iamVjdD4gaW5pdGVkKQogCQkJdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gewogCQlmb3IgKEZpbHRlciByZWYgOiBmaWx0ZXJzKQogCQkJaW5pdEZpbHRlcihyZWYsIGNvbnRleHQsIGluaXRlZCk7CkBAIC0xNjUsNyArMTY1LDcgQEAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpIHsKIAkgKiAgICAgICAgICAgIGRlc3Ryb3llZCBhIHNlY29uZCB0aW1lLiBGaWx0ZXJzIGFuZCBzZXJ2bGV0cyB0aGF0IGFyZSBmaXJzdAogCSAqICAgICAgICAgICAgZGVzdHJveWVkIGJ5IHRoaXMgcGlwZWxpbmUgd2lsbCBiZSBhZGRlZCB0byB0aGlzIHNldC4KIAkgKi8KLQl2b2lkIGRlc3Ryb3koZmluYWwgU2V0PE9iamVjdD4gZGVzdHJveWVkKSB7CisJdm9pZCBkZXN0cm95KFNldDxPYmplY3Q+IGRlc3Ryb3llZCkgewogCQlmb3IgKEZpbHRlciByZWYgOiBmaWx0ZXJzKQogCQkJZGVzdHJveUZpbHRlcihyZWYsIGRlc3Ryb3llZCk7CiAJCWRlc3Ryb3lTZXJ2bGV0KHNlcnZsZXQsIGRlc3Ryb3llZCk7CkBAIC0yMzAsNyArMjMwLDcgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2hhaW4gaW1wbGVtZW50cyBGaWx0ZXJDaGFpbiB7CiAKIAkJcHJpdmF0ZSBpbnQgZmlsdGVySWR4OwogCi0JCUNoYWluKGZpbmFsIEZpbHRlcltdIGZpbHRlcnMsIGZpbmFsIEh0dHBTZXJ2bGV0IHNlcnZsZXQpIHsKKwkJQ2hhaW4oRmlsdGVyW10gZmlsdGVycywgSHR0cFNlcnZsZXQgc2VydmxldCkgewogCQkJdGhpcy5maWx0ZXJzID0gZmlsdGVyczsKIAkJCXRoaXMuc2VydmxldCA9IHNlcnZsZXQ7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvQXNJc0ZpbGVTZXJ2aWNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0FzSXNGaWxlU2VydmljZS5qYXZhCmluZGV4IDExYWQ1ZTAuLjlhOTI4YjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvQXNJc0ZpbGVTZXJ2aWNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9Bc0lzRmlsZVNlcnZpY2UuamF2YQpAQCAtNzMsNyArNzMsNyBAQCBwdWJsaWMgdm9pZCBhY2Nlc3MoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgUmVwb3NpdG9yeSBkYikKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJ2aWNlQ29uZmlnIHsKIAkJZmluYWwgYm9vbGVhbiBlbmFibGVkOwogCi0JCVNlcnZpY2VDb25maWcoZmluYWwgQ29uZmlnIGNmZykgeworCQlTZXJ2aWNlQ29uZmlnKENvbmZpZyBjZmcpIHsKIAkJCWVuYWJsZWQgPSBjZmcuZ2V0Qm9vbGVhbigiaHR0cCIsICJnZXRhbnlmaWxlIiwgdHJ1ZSk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvRGVmYXVsdFJlY2VpdmVQYWNrRmFjdG9yeS5qYXZhCmluZGV4IDk1ZWI4ZDUuLjA2YThmNWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvRGVmYXVsdFJlY2VpdmVQYWNrRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvRGVmYXVsdFJlY2VpdmVQYWNrRmFjdG9yeS5qYXZhCkBAIC03NCw3ICs3NCw3IEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlcnZpY2VDb25maWcgewogCiAJCWZpbmFsIGJvb2xlYW4gZW5hYmxlZDsKIAotCQlTZXJ2aWNlQ29uZmlnKGZpbmFsIENvbmZpZyBjZmcpIHsKKwkJU2VydmljZUNvbmZpZyhDb25maWcgY2ZnKSB7CiAJCQlzZXQgPSBjZmcuZ2V0U3RyaW5nKCJodHRwIiwgbnVsbCwgInJlY2VpdmVwYWNrIikgIT0gbnVsbDsKIAkJCWVuYWJsZWQgPSBjZmcuZ2V0Qm9vbGVhbigiaHR0cCIsICJyZWNlaXZlcGFjayIsIGZhbHNlKTsKIAkJfQpAQCAtODIsNyArODIsNyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBTZXJ2aWNlQ29uZmlnIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFJlY2VpdmVQYWNrIGNyZWF0ZShmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBmaW5hbCBSZXBvc2l0b3J5IGRiKQorCXB1YmxpYyBSZWNlaXZlUGFjayBjcmVhdGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgUmVwb3NpdG9yeSBkYikKIAkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gewogCQlmaW5hbCBTZXJ2aWNlQ29uZmlnIGNmZyA9IGRiLmdldENvbmZpZygpLmdldChTZXJ2aWNlQ29uZmlnOjpuZXcpOwogCQlTdHJpbmcgdXNlciA9IHJlcS5nZXRSZW1vdGVVc2VyKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9odHRwL3NlcnZlci9yZXNvbHZlci9EZWZhdWx0VXBsb2FkUGFja0ZhY3RvcnkuamF2YQppbmRleCBmNWFmYTFlLi5hNjlmYWIwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvc2VydmVyL3Jlc29sdmVyL0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvaHR0cC9zZXJ2ZXIvcmVzb2x2ZXIvRGVmYXVsdFVwbG9hZFBhY2tGYWN0b3J5LmphdmEKQEAgLTQzLDYgKzQzLDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLnJlc29sdmVyOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKwogaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CkBAIC02NCwxOCArNjYsMjUgQEAgcHVibGljIGNsYXNzIERlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeSBpbXBsZW1lbnRzCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VydmljZUNvbmZpZyB7CiAJCWZpbmFsIGJvb2xlYW4gZW5hYmxlZDsKIAotCQlTZXJ2aWNlQ29uZmlnKGZpbmFsIENvbmZpZyBjZmcpIHsKKwkJU2VydmljZUNvbmZpZyhDb25maWcgY2ZnKSB7CiAJCQllbmFibGVkID0gY2ZnLmdldEJvb2xlYW4oImh0dHAiLCAidXBsb2FkcGFjayIsIHRydWUpOwogCQl9CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgVXBsb2FkUGFjayBjcmVhdGUoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgZmluYWwgUmVwb3NpdG9yeSBkYikKKwlwdWJsaWMgVXBsb2FkUGFjayBjcmVhdGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgUmVwb3NpdG9yeSBkYikKIAkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gewotCQlpZiAoZGIuZ2V0Q29uZmlnKCkuZ2V0KFNlcnZpY2VDb25maWc6Om5ldykuZW5hYmxlZCkKLQkJCXJldHVybiBuZXcgVXBsb2FkUGFjayhkYik7Ci0JCWVsc2UKKwkJaWYgKGRiLmdldENvbmZpZygpLmdldChTZXJ2aWNlQ29uZmlnOjpuZXcpLmVuYWJsZWQpIHsKKwkJCVVwbG9hZFBhY2sgdXAgPSBuZXcgVXBsb2FkUGFjayhkYik7CisJCQlTdHJpbmcgaGVhZGVyID0gcmVxLmdldEhlYWRlcigiR2l0LVByb3RvY29sIik7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChoZWFkZXIgIT0gbnVsbCkgeworCQkJCVN0cmluZ1tdIHBhcmFtcyA9IGhlYWRlci5zcGxpdCgiOiIpOyAvLyROT04tTkxTLTEkCisJCQkJdXAuc2V0RXh0cmFQYXJhbWV0ZXJzKEFycmF5cy5hc0xpc3QocGFyYW1zKSk7CisJCQl9CisJCQlyZXR1cm4gdXA7CisJCX0gZWxzZSB7CiAJCQl0aHJvdyBuZXcgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24oKTsKKwkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZjMzODYwNy4uZmVkNjMyZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CkBAIC0yNSwyNSArMjUsMjYgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC50aHJlYWQ7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXIuZ2x1ZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyLnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5oYW1jcmVzdDt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC9wb20ueG1sCmluZGV4IDQyMjM5OGMuLjg3ZTJmNGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvcG9tLnhtbApAQCAtNTEsNyArNTEsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Bc0lzU2VydmljZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Bc0lzU2VydmljZVRlc3QuamF2YQppbmRleCBlOTRhNzkyLi4yOThiZjIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvQXNJc1NlcnZpY2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0FzSXNTZXJ2aWNlVGVzdC5qYXZhCkBAIC0xMzMsNyArMTMzLDcgQEAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUiBleHRlbmRzIEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgewogCiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CiAKLQkJUihmaW5hbCBTdHJpbmcgdXNlciwgZmluYWwgU3RyaW5nIGhvc3QpIHsKKwkJUihTdHJpbmcgdXNlciwgU3RyaW5nIGhvc3QpIHsKIAkJCXN1cGVyKG5ldyBSZXF1ZXN0KG51bGwsIG51bGwpIC8qIGNhbid0IHBhc3MgbnVsbCwgc2lnaCAqLyk7CiAJCQl0aGlzLnVzZXIgPSB1c2VyOwogCQkJdGhpcy5ob3N0ID0gaG9zdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9EZWZhdWx0UmVjZWl2ZVBhY2tGYWN0b3J5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKaW5kZXggYjI0ZTJkZi4uYWRlMWUxZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRSZWNlaXZlUGFja0ZhY3RvcnlUZXN0LmphdmEKQEAgLTIwNSw3ICsyMDUsNyBAQCBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciB7CiAKIAkJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaG9zdDsKIAotCQlSKGZpbmFsIFN0cmluZyB1c2VyLCBmaW5hbCBTdHJpbmcgaG9zdCkgeworCQlSKFN0cmluZyB1c2VyLCBTdHJpbmcgaG9zdCkgewogCQkJc3VwZXIobmV3IFJlcXVlc3QobnVsbCwgbnVsbCkgLyogY2FuJ3QgcGFzcyBudWxsLCBzaWdoICovKTsKIAkJCXRoaXMudXNlciA9IHVzZXI7CiAJCQl0aGlzLmhvc3QgPSBob3N0OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9EZWZhdWx0VXBsb2FkUGFja0ZhY3RvcnlUZXN0LmphdmEKaW5kZXggY2UyNGQ2NC4uMjY4YzI4MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0RlZmF1bHRVcGxvYWRQYWNrRmFjdG9yeVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvRGVmYXVsdFVwbG9hZFBhY2tGYWN0b3J5VGVzdC5qYXZhCkBAIC0xNjEsNyArMTYxLDcgQEAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUiBleHRlbmRzIEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgewogCiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CiAKLQkJUihmaW5hbCBTdHJpbmcgdXNlciwgZmluYWwgU3RyaW5nIGhvc3QpIHsKKwkJUihTdHJpbmcgdXNlciwgU3RyaW5nIGhvc3QpIHsKIAkJCXN1cGVyKG5ldyBSZXF1ZXN0KG51bGwsIG51bGwpIC8qIGNhbid0IHBhc3MgbnVsbCwgc2lnaCAqLyk7CiAJCQl0aGlzLnVzZXIgPSB1c2VyOwogCQkJdGhpcy5ob3N0ID0gaG9zdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9IdHRwQ2xpZW50VGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9IdHRwQ2xpZW50VGVzdHMuamF2YQppbmRleCA2ZGJlMGUzLi5lZjA1OWJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvSHR0cENsaWVudFRlc3RzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L0h0dHBDbGllbnRUZXN0cy5qYXZhCkBAIC00MywxNSArNDMsMjAgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy50aGVJbnN0YW5jZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwpAQCAtNzUsOSArODAsMTMgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TdG9yZWRDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5GZXRjaENvbm5lY3Rpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUGFja2V0TGluZUluOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlBhY2tldExpbmVPdXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5Vc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLkh0dHBDb25uZWN0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyLlJlcG9zaXRvcnlSZXNvbHZlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlOwpAQCAtMTE4LDcgKzEyNyw3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXNtYXJ0QXV0aEJhc2ljVVJJID0gdG9VUklpc2goc0Jhc2ljLCBzcmNOYW1lKTsKIAl9CiAKLQlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBkdW1iKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dEhhbmRsZXIgZHVtYihTdHJpbmcgcGF0aCkgewogCQlmaW5hbCBGaWxlIHNyY0dpdCA9IHJlbW90ZVJlcG9zaXRvcnkuZ2V0UmVwb3NpdG9yeSgpLmdldERpcmVjdG9yeSgpOwogCQlmaW5hbCBVUkkgYmFzZSA9IHNyY0dpdC5nZXRQYXJlbnRGaWxlKCkudG9VUkkoKTsKIApAQCAtMTMwLDcgKzEzOSw3IEBAIHByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIGR1bWIoZmluYWwgU3RyaW5nIHBhdGgpIHsKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBzbWFydChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIHNtYXJ0KFN0cmluZyBwYXRoKSB7CiAJCUdpdFNlcnZsZXQgZ3MgPSBuZXcgR2l0U2VydmxldCgpOwogCQlncy5zZXRSZXBvc2l0b3J5UmVzb2x2ZXIobmV3IFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+KCkgewogCQkJQE92ZXJyaWRlCkBAIC0xNTEsNyArMTYwLDcgQEAgcHVibGljIFJlcG9zaXRvcnkgb3BlbihIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBTdHJpbmcgbmFtZSkKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldERpcmVjdG9yeSgpLmdldE5hbWUoKTsKIAl9CiAKQEAgLTM0NSw0ICszNTQsODIgQEAgcHVibGljIHZvaWQgdGVzdExpc3RSZW1vdGVXaXRob3V0TG9jYWxSZXBvc2l0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQlhc3NlcnROb3ROdWxsKGhlYWQpOwogCQl9CiAJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SHR0cENsaWVudFdhbnRzVjJCdXRTZXJ2ZXJOb3RDb25maWd1cmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUpES0h0dHBDb25uZWN0aW9uRmFjdG9yeSBmID0gbmV3IEpES0h0dHBDb25uZWN0aW9uRmFjdG9yeSgpOworCQlTdHJpbmcgdXJsID0gc21hcnRBdXRoTm9uZVVSSS50b1N0cmluZygpICsgIi9pbmZvL3JlZnM/c2VydmljZT1naXQtdXBsb2FkLXBhY2siOworCQlIdHRwQ29ubmVjdGlvbiBjID0gZi5jcmVhdGUobmV3IFVSTCh1cmwpKTsKKwkJYy5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsKKwkJYy5zZXRSZXF1ZXN0UHJvcGVydHkoIkdpdC1Qcm90b2NvbCIsICJ2ZXJzaW9uPTIiKTsKKwkJYy5jb25uZWN0KCk7CisJCWFzc2VydFRoYXQoYy5nZXRSZXNwb25zZUNvZGUoKSwgaXMoMjAwKSk7CisKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihjLmdldElucHV0U3RyZWFtKCkpOworCisJCS8vIENoZWNrIHRoYXQgd2UgZ2V0IGEgdjAgcmVzcG9uc2UuCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygiIyBzZXJ2aWNlPWdpdC11cGxvYWQtcGFjayIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIHRoZUluc3RhbmNlKFBhY2tldExpbmVJbi5FTkQpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkubWF0Y2hlcygiWzAtOWEtZl17NDB9IEhFQUQuKiIpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkh0dHBGaXJzdFJlc3BvbnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlbW90ZVJlcG9zaXRvcnkuZ2V0UmVwb3NpdG9yeSgpLmdldENvbmZpZygpLnNldEludCgKKwkJCQkicHJvdG9jb2wiLCBudWxsLCAidmVyc2lvbiIsIDIpOworCisJCUpES0h0dHBDb25uZWN0aW9uRmFjdG9yeSBmID0gbmV3IEpES0h0dHBDb25uZWN0aW9uRmFjdG9yeSgpOworCQlTdHJpbmcgdXJsID0gc21hcnRBdXRoTm9uZVVSSS50b1N0cmluZygpICsgIi9pbmZvL3JlZnM/c2VydmljZT1naXQtdXBsb2FkLXBhY2siOworCQlIdHRwQ29ubmVjdGlvbiBjID0gZi5jcmVhdGUobmV3IFVSTCh1cmwpKTsKKwkJYy5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsKKwkJYy5zZXRSZXF1ZXN0UHJvcGVydHkoIkdpdC1Qcm90b2NvbCIsICJ2ZXJzaW9uPTIiKTsKKwkJYy5jb25uZWN0KCk7CisJCWFzc2VydFRoYXQoYy5nZXRSZXNwb25zZUNvZGUoKSwgaXMoMjAwKSk7CisKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihjLmdldElucHV0U3RyZWFtKCkpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInZlcnNpb24gMiIpKTsKKworCQkvLyBXaGF0IHJlbWFpbnMgYXJlIGNhcGFiaWxpdGllcyAtIGVuc3VyZSB0aGF0IGFsbCBvZiB0aGVtIGFyZQorCQkvLyBub24tZW1wdHkgc3RyaW5ncywgYW5kIHRoYXQgd2Ugc2VlIEVORCBhdCB0aGUgZW5kLgorCQlTdHJpbmcgczsKKwkJd2hpbGUgKChzID0gcGNrSW4ucmVhZFN0cmluZygpKSAhPSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQlhc3NlcnRUcnVlKCFzLmlzRW1wdHkoKSk7CisJCX0KKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkh0dHBTdWJzZXF1ZW50UmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmVtb3RlUmVwb3NpdG9yeS5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCkuc2V0SW50KAorCQkJCSJwcm90b2NvbCIsIG51bGwsICJ2ZXJzaW9uIiwgMik7CisKKwkJSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5IGYgPSBuZXcgSkRLSHR0cENvbm5lY3Rpb25GYWN0b3J5KCk7CisJCVN0cmluZyB1cmwgPSBzbWFydEF1dGhOb25lVVJJLnRvU3RyaW5nKCkgKyAiL2dpdC11cGxvYWQtcGFjayI7CisJCUh0dHBDb25uZWN0aW9uIGMgPSBmLmNyZWF0ZShuZXcgVVJMKHVybCkpOworCQljLnNldFJlcXVlc3RNZXRob2QoIlBPU1QiKTsKKwkJYy5zZXRSZXF1ZXN0UHJvcGVydHkoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi94LWdpdC11cGxvYWQtcGFjay1yZXF1ZXN0Iik7CisJCWMuc2V0UmVxdWVzdFByb3BlcnR5KCJHaXQtUHJvdG9jb2wiLCAidmVyc2lvbj0yIik7CisJCWMuc2V0RG9PdXRwdXQodHJ1ZSk7CisJCWMuY29ubmVjdCgpOworCisJCS8vIFRlc3QgbHMtcmVmcyB0byB2ZXJpZnkgdGhhdCBldmVyeXRoaW5nIGlzIGNvbm5lY3RlZAorCQkvLyBwcm9wZXJseS4gVGVzdHMgZm9yIG90aGVyIGNvbW1hbmRzIGdvIGluCisJCS8vIFVwbG9hZFBhY2tUZXN0LmphdmEuCisKKwkJT3V0cHV0U3RyZWFtIG9zID0gYy5nZXRPdXRwdXRTdHJlYW0oKTsKKwkJUGFja2V0TGluZU91dCBwY2tPdXQgPSBuZXcgUGFja2V0TGluZU91dChvcyk7CisJCXBja091dC53cml0ZVN0cmluZygiY29tbWFuZD1scy1yZWZzIik7CisJCXBja091dC53cml0ZURlbGltKCk7CisJCXBja091dC5lbmQoKTsKKwkJb3MuY2xvc2UoKTsKKworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKGMuZ2V0SW5wdXRTdHJlYW0oKSk7CisKKwkJLy8gSnVzdCBjaGVjayB0aGF0IHdlIGdldCB3aGF0IGxvb2tzIGxpa2UgYSByZWYgYWR2ZXJ0aXNlbWVudC4KKwkJU3RyaW5nIHM7CisJCXdoaWxlICgocyA9IHBja0luLnJlYWRTdHJpbmcoKSkgIT0gUGFja2V0TGluZUluLkVORCkgeworCQkJYXNzZXJ0VHJ1ZShzLm1hdGNoZXMoIlswLTlhLWZdezQwfSBbQS1aYS16L10qIikpOworCQl9CisKKwkJYXNzZXJ0VGhhdChjLmdldFJlc3BvbnNlQ29kZSgpLCBpcygyMDApKTsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvUHJvdG9jb2xFcnJvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Qcm90b2NvbEVycm9yVGVzdC5qYXZhCmluZGV4IDg3ZDBiYWQuLmExYmFhZTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Qcm90b2NvbEVycm9yVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9Qcm90b2NvbEVycm9yVGVzdC5qYXZhCkBAIC0xNDksMTkgKzE0OSwxNSBAQCBwdWJsaWMgdm9pZCB0ZXN0UHVzaF9VbnBhY2tFcnJvcl9UcnVuY2F0ZWRQYWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQljLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwKIAkJCQkJR2l0U21hcnRIdHRwVG9vbHMuUkVDRUlWRV9QQUNLX1JFUVVFU1RfVFlQRSk7CiAJCQljLnNldEZpeGVkTGVuZ3RoU3RyZWFtaW5nTW9kZShyZXFiaW4ubGVuZ3RoKTsKLQkJCU91dHB1dFN0cmVhbSBvdXQgPSBjLmdldE91dHB1dFN0cmVhbSgpOwotCQkJdHJ5IHsKKwkJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IGMuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQlvdXQud3JpdGUocmVxYmluKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJb3V0LmNsb3NlKCk7CiAJCQl9CiAKIAkJCWFzc2VydEVxdWFscygyMDAsIGMuZ2V0UmVzcG9uc2VDb2RlKCkpOwogCQkJYXNzZXJ0RXF1YWxzKEdpdFNtYXJ0SHR0cFRvb2xzLlJFQ0VJVkVfUEFDS19SRVNVTFRfVFlQRSwKIAkJCQkJYy5nZXRDb250ZW50VHlwZSgpKTsKIAotCQkJSW5wdXRTdHJlYW0gcmF3aW4gPSBjLmdldElucHV0U3RyZWFtKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChJbnB1dFN0cmVhbSByYXdpbiA9IGMuZ2V0SW5wdXRTdHJlYW0oKSkgewogCQkJCVBhY2tldExpbmVJbiBwY2tpbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmF3aW4pOwogCQkJCWFzc2VydEVxdWFscygidW5wYWNrIGVycm9yICIKIAkJCQkJCSsgSkdpdFRleHQuZ2V0KCkucGFja2ZpbGVJc1RydW5jYXRlZE5vUGFyYW0sCkBAIC0xNjksOCArMTY1LDYgQEAgcHVibGljIHZvaWQgdGVzdFB1c2hfVW5wYWNrRXJyb3JfVHJ1bmNhdGVkUGFjaygpIHRocm93cyBFeGNlcHRpb24gewogCQkJCWFzc2VydEVxdWFscygibmcgcmVmcy9vYmplY3RzL0Egbi9hICh1bnBhY2tlciBlcnJvcikiLAogCQkJCQkJcGNraW4ucmVhZFN0cmluZygpKTsKIAkJCQlhc3NlcnRTYW1lKFBhY2tldExpbmVJbi5FTkQsIHBja2luLnJlYWRTdHJpbmcoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCXJhd2luLmNsb3NlKCk7CiAJCQl9CiAJCX0gZmluYWxseSB7CiAJCQljLmRpc2Nvbm5lY3QoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9TZXRBZGRpdGlvbmFsSGVhZGVyc1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2h0dHAvdGVzdC9TZXRBZGRpdGlvbmFsSGVhZGVyc1Rlc3QuamF2YQppbmRleCBlZjhkYWVjLi5mYmM1NGYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU2V0QWRkaXRpb25hbEhlYWRlcnNUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NldEFkZGl0aW9uYWxIZWFkZXJzVGVzdC5qYXZhCkBAIC0xMDcsOCArMTA3LDcgQEAgcHVibGljIHZvaWQgdGVzdFNldEhlYWRlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJCWFzc2VydEVxdWFscygiaHR0cCIsIHJlbW90ZVVSSS5nZXRTY2hlbWUoKSk7CiAKLQkJVHJhbnNwb3J0IHQgPSBUcmFuc3BvcnQub3Blbihkc3QsIHJlbW90ZVVSSSk7Ci0JCXRyeSB7CisJCXRyeSAoVHJhbnNwb3J0IHQgPSBUcmFuc3BvcnQub3Blbihkc3QsIHJlbW90ZVVSSSkpIHsKIAkJCWFzc2VydFRydWUoImlzYSBUcmFuc3BvcnRIdHRwIiwgdCBpbnN0YW5jZW9mIFRyYW5zcG9ydEh0dHApOwogCQkJYXNzZXJ0VHJ1ZSgiaXNhIEh0dHBUcmFuc3BvcnQiLCB0IGluc3RhbmNlb2YgSHR0cFRyYW5zcG9ydCk7CiAKQEAgLTExNyw4ICsxMTYsNiBAQCBwdWJsaWMgdm9pZCB0ZXN0U2V0SGVhZGVycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQloZWFkZXJzLnB1dCgiQW5vdGhlcktleSIsICJzb21lVmFsdWUiKTsKIAkJCSgoVHJhbnNwb3J0SHR0cCkgdCkuc2V0QWRkaXRpb25hbEhlYWRlcnMoaGVhZGVycyk7CiAJCQl0Lm9wZW5GZXRjaCgpOwotCQl9IGZpbmFsbHkgewotCQkJdC5jbG9zZSgpOwogCQl9CiAKIAkJTGlzdDxBY2Nlc3NFdmVudD4gcmVxdWVzdHMgPSBnZXRSZXF1ZXN0cygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaHR0cC90ZXN0L1NtYXJ0Q2xpZW50U21hcnRTZXJ2ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQppbmRleCAzMTgzMmU3Li42NTIxMGQxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9odHRwL3Rlc3QvU21hcnRDbGllbnRTbWFydFNlcnZlclRlc3QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5IdHRwU3VwcG9ydC5IRFJfQ09OVEVOVF9FTkNPRElORzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9DT05URU5UX0xFTkdUSDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9DT05URU5UX1RZUEU7CkBAIC0yOTgsMTAgKzI5OCwxMCBAQCBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAogCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24gewogCQkJCWZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgciA9IChIdHRwU2VydmxldFJlc3BvbnNlKSByZXNwb25zZTsKIAkJCQlyLnNldENvbnRlbnRUeXBlKCJ0ZXh0L3BsYWluIik7Ci0JCQkJci5zZXRDaGFyYWN0ZXJFbmNvZGluZygiVVRGLTgiKTsKLQkJCQlQcmludFdyaXRlciB3ID0gci5nZXRXcml0ZXIoKTsKLQkJCQl3LnByaW50KCJPSyIpOwotCQkJCXcuY2xvc2UoKTsKKwkJCQlyLnNldENoYXJhY3RlckVuY29kaW5nKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpOworCQkJCXRyeSAoUHJpbnRXcml0ZXIgdyA9IHIuZ2V0V3JpdGVyKCkpIHsKKwkJCQkJdy5wcmludCgiT0siKTsKKwkJCQl9CiAJCQl9CiAKIAkJCUBPdmVycmlkZQpAQCAtNDI5LDExICs0MjksOCBAQCBwdWJsaWMgdm9pZCB0ZXN0TGlzdFJlbW90ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlhc3NlcnRUcnVlKCJpc2EgVHJhbnNwb3J0SHR0cCIsIHQgaW5zdGFuY2VvZiBUcmFuc3BvcnRIdHRwKTsKIAkJCWFzc2VydFRydWUoImlzYSBIdHRwVHJhbnNwb3J0IiwgdCBpbnN0YW5jZW9mIEh0dHBUcmFuc3BvcnQpOwogCi0JCQlGZXRjaENvbm5lY3Rpb24gYyA9IHQub3BlbkZldGNoKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChGZXRjaENvbm5lY3Rpb24gYyA9IHQub3BlbkZldGNoKCkpIHsKIAkJCQltYXAgPSBjLmdldFJlZnNNYXAoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJYy5jbG9zZSgpOwogCQkJfQogCQl9CiAKQEAgLTExNjYsNyArMTE2Myw3IEBAIHB1YmxpYyB2b2lkIHRlc3RJbml0aWFsQ2xvbmVfQnJva2VuU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdEludmFsaWRXYW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAJCU9iamVjdElkIGlkID0gbmV3IE9iamVjdEluc2VydGVyLkZvcm1hdHRlcigpLmlkRm9yKENvbnN0YW50cy5PQkpfQkxPQiwKLQkJCQkidGVzdEludmFsaWRXYW50Ii5nZXRCeXRlcyhVVEZfOCkpOworCQkJCSJ0ZXN0SW52YWxpZFdhbnQiLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQlSZXBvc2l0b3J5IGRzdCA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCk7CiAJCXRyeSAoVHJhbnNwb3J0IHQgPSBUcmFuc3BvcnQub3Blbihkc3QsIHJlbW90ZVVSSSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggZDc5MjBmYS4uYTY4ZDE1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMyw3ICszLDcgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQpAQCAtMjIsMTYgKzIyLDE2IEBACiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5sb2c7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc3NsO3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC5zZXJ2ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQucmVzb2x2ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuc2VydmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249IjQuMTEuOCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC5qdW5pdCwKICAgIGphdmF4LnNlcnZsZXQuaHR0cCwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3BvbS54bWwKaW5kZXggNWQ5MmExYS4uZWI3ZDAyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvQWNjZXNzRXZlbnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL0FjY2Vzc0V2ZW50LmphdmEKaW5kZXggMDFjNDM2MC4uODI0NzZkZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvQWNjZXNzRXZlbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9BY2Nlc3NFdmVudC5qYXZhCkBAIC02Nyw3ICs2Nyw3IEBAIHB1YmxpYyBjbGFzcyBBY2Nlc3NFdmVudCB7CiAKIAlwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzcG9uc2VIZWFkZXJzOwogCi0JQWNjZXNzRXZlbnQoZmluYWwgUmVxdWVzdCByZXEsIGZpbmFsIFJlc3BvbnNlIHJzcCkgeworCUFjY2Vzc0V2ZW50KFJlcXVlc3QgcmVxLCBSZXNwb25zZSByc3ApIHsKIAkJbWV0aG9kID0gcmVxLmdldE1ldGhvZCgpOwogCQl1cmkgPSByZXEuZ2V0UmVxdWVzdFVSSSgpOwogCQlyZXF1ZXN0SGVhZGVycyA9IGNsb25lSGVhZGVycyhyZXEpOwpAQCAtNzcsNyArNzcsNyBAQCBwdWJsaWMgY2xhc3MgQWNjZXNzRXZlbnQgewogCQlyZXNwb25zZUhlYWRlcnMgPSBjbG9uZUhlYWRlcnMocnNwKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGNsb25lSGVhZGVycyhmaW5hbCBSZXF1ZXN0IHJlcSkgeworCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gY2xvbmVIZWFkZXJzKFJlcXVlc3QgcmVxKSB7CiAJCU1hcDxTdHJpbmcsIFN0cmluZz4gciA9IG5ldyBUcmVlTWFwPD4oKTsKIAkJRW51bWVyYXRpb24gaG4gPSByZXEuZ2V0SGVhZGVyTmFtZXMoKTsKIAkJd2hpbGUgKGhuLmhhc01vcmVFbGVtZW50cygpKSB7CkBAIC04OSw3ICs4OSw3IEBAIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gY2xvbmVIZWFkZXJzKGZpbmFsIFJlcXVlc3QgcmVxKSB7CiAJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBjbG9uZUhlYWRlcnMoZmluYWwgUmVzcG9uc2UgcnNwKSB7CisJcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBjbG9uZUhlYWRlcnMoUmVzcG9uc2UgcnNwKSB7CiAJCU1hcDxTdHJpbmcsIFN0cmluZz4gciA9IG5ldyBUcmVlTWFwPD4oKTsKIAkJRW51bWVyYXRpb248U3RyaW5nPiBobiA9IHJzcC5nZXRIdHRwRmllbGRzKCkuZ2V0RmllbGROYW1lcygpOwogCQl3aGlsZSAoaG4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1JlY29yZGluZ0xvZ2dlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvUmVjb3JkaW5nTG9nZ2VyLmphdmEKaW5kZXggZmVkMDYzYS4uYTcxNGViMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvUmVjb3JkaW5nTG9nZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvUmVjb3JkaW5nTG9nZ2VyLmphdmEKQEAgLTEwNyw3ICsxMDcsNyBAQCBwdWJsaWMgUmVjb3JkaW5nTG9nZ2VyKCkgewogCSAqCiAJICogQHBhcmFtIG5hbWUKIAkgKi8KLQlwdWJsaWMgUmVjb3JkaW5nTG9nZ2VyKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHVibGljIFJlY29yZGluZ0xvZ2dlcihTdHJpbmcgbmFtZSkgewogCQl0aGlzLm5hbWUgPSBuYW1lOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvU2ltcGxlSHR0cFNlcnZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L2h0dHAvU2ltcGxlSHR0cFNlcnZlci5qYXZhCmluZGV4IGM1NTc2ZjkuLjI0NWI1MTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuaHR0cC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9odHRwL1NpbXBsZUh0dHBTZXJ2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvaHR0cC9TaW1wbGVIdHRwU2VydmVyLmphdmEKQEAgLTEzNCw3ICsxMzQsNyBAQCBwdWJsaWMgVVJJaXNoIGdldFNlY3VyZVVyaSgpIHsKIAkJcmV0dXJuIHNlY3VyZVVyaTsKIAl9CiAKLQlwcml2YXRlIFNlcnZsZXRDb250ZXh0SGFuZGxlciBzbWFydChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgU2VydmxldENvbnRleHRIYW5kbGVyIHNtYXJ0KFN0cmluZyBwYXRoKSB7CiAJCUdpdFNlcnZsZXQgZ3MgPSBuZXcgR2l0U2VydmxldCgpOwogCQlncy5zZXRSZXBvc2l0b3J5UmVzb2x2ZXIobmV3IFJlcG9zaXRvcnlSZXNvbHZlcjxIdHRwU2VydmxldFJlcXVlc3Q+KCkgewogCQkJQE92ZXJyaWRlCkBAIC0xNTQsNyArMTU0LDcgQEAgcHVibGljIFJlcG9zaXRvcnkgb3BlbihIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBTdHJpbmcgbmFtZSkKIAkJcmV0dXJuIGN0eDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIGRiLmdldERpcmVjdG9yeSgpLmdldE5hbWUoKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWRlNzg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgorPGNvbXBvbmVudCBpZD0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCIgdmVyc2lvbj0iMiI+CisgICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhIiB0eXBlPSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkxvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZSI+CisgICAgICAgIDxmaWx0ZXIgY29tbWVudD0iRG9uJ3QgY2FyZSBhYm91dCBub24tQVBJIGluIHRlc3RzLiIgaWQ9IjY0Mzg0MjA2NCI+CisgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkZpbGVSZXBvc2l0b3J5Ii8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkxvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJjcmVhdGVCYXJlUmVwb3NpdG9yeSgpIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJEb24ndCBjYXJlIGFib3V0IG5vbi1BUEkgaW4gdGVzdHMuIiBpZD0iNjQzODQyMDY0Ij4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iRmlsZVJlcG9zaXRvcnkiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImNyZWF0ZVJlcG9zaXRvcnkoYm9vbGVhbiwgYm9vbGVhbikiLz4KKyAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CisgICAgICAgIDwvZmlsdGVyPgorICAgICAgICA8ZmlsdGVyIGNvbW1lbnQ9IkRvbid0IGNhcmUgYWJvdXQgbm9uLUFQSSBpbiB0ZXN0cy4iIGlkPSI2NDM4NDIwNjQiPgorICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJGaWxlUmVwb3NpdG9yeSIvPgorICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSJMb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iY3JlYXRlV29ya1JlcG9zaXRvcnkoKSIvPgorICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgPC9maWx0ZXI+CisgICAgPC9yZXNvdXJjZT4KKyAgICA8cmVzb3VyY2UgcGF0aD0ic3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEiIHR5cGU9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQuUmVwb3NpdG9yeVRlc3RDYXNlIj4KKyAgICAgICAgPGZpbHRlciBjb21tZW50PSJEb24ndCBjYXJlIGFib3V0IG5vbi1BUEkgaW4gdGVzdHMuIiBpZD0iNjI3MDYwNzUxIj4KKyAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iRmlsZVJlcG9zaXRvcnkiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iUmVwb3NpdG9yeVRlc3RDYXNlIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImRiIi8+CisgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgorICAgICAgICA8L2ZpbHRlcj4KKyAgICA8L3Jlc291cmNlPgorPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBmOWUxMmQ1Li43NDlmOGZlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMzEgKzMsMzEgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKK0ltcG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW87dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCiAgb3JnLmp1bml0O3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bGVzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bm5lcjt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIKLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249IjQuMTEuOCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCkBAIC0zNiw0ICszNiw0IEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZSwKICAgIG9yZy5lY2xpcHNlLmpnaXQuYXBpIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LnRpbWU7dmVyc2lvbj0iNC4xMS44IgorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQudGltZTt2ZXJzaW9uPSI1LjAuNCIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvcG9tLnhtbAppbmRleCBkMjUxYjk3Li4zMGNlMGIzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9wb20ueG1sCkBAIC01Miw3ICs1Miw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQuanVuaXQ8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0pHaXRUZXN0VXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9KR2l0VGVzdFV0aWwuamF2YQppbmRleCBjZWY4MWEwLi5hMTAyZGExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0pHaXRUZXN0VXRpbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvSkdpdFRlc3RVdGlsLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CkBAIC0xNDIsNyArMTQyLDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHMoYnl0ZVtdIHJhdykgewogCSAqIEBwYXJhbSBmaWxlTmFtZQogCSAqIEByZXR1cm4gdGhlIHRlc3QgcmVzb3VyY2UgZmlsZQogCSAqLwotCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRUZXN0UmVzb3VyY2VGaWxlKGZpbmFsIFN0cmluZyBmaWxlTmFtZSkgeworCXB1YmxpYyBzdGF0aWMgRmlsZSBnZXRUZXN0UmVzb3VyY2VGaWxlKFN0cmluZyBmaWxlTmFtZSkgewogCQlpZiAoZmlsZU5hbWUgPT0gbnVsbCB8fCBmaWxlTmFtZS5sZW5ndGgoKSA8PSAwKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQpAQCAtMjQyLDExICsyNDIsMTEgQEAgcHVibGljIHN0YXRpYyBGaWxlIHdyaXRlVHJhc2hGaWxlKGZpbmFsIFJlcG9zaXRvcnkgZGIsCiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShmaW5hbCBGaWxlIGYsIGZpbmFsIFN0cmluZyBib2R5KQorCXB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShGaWxlIGYsIFN0cmluZyBib2R5KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZVV0aWxzLm1rZGlycyhmLmdldFBhcmVudEZpbGUoKSwgdHJ1ZSk7CiAJCXRyeSAoV3JpdGVyIHcgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGYpLAotCQkJCVVURl84KSkgeworCQkJCUNIQVJTRVQpKSB7CiAJCQl3LndyaXRlKGJvZHkpOwogCQl9CiAJfQpAQCAtMjYxLDkgKzI2MSw5IEBAIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZShmaW5hbCBGaWxlIGYsIGZpbmFsIFN0cmluZyBib2R5KQogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgb3IgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZChmaW5hbCBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZChGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSBib2R5ID0gSU8ucmVhZEZ1bGx5KGZpbGUpOwotCQlyZXR1cm4gbmV3IFN0cmluZyhib2R5LCAwLCBib2R5Lmxlbmd0aCwgVVRGXzgpOworCQlyZXR1cm4gbmV3IFN0cmluZyhib2R5LCAwLCBib2R5Lmxlbmd0aCwgQ0hBUlNFVCk7CiAJfQogCiAJLyoqCkBAIC0yNzQsNyArMjc0LDcgQEAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZChmaW5hbCBGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHJldHVybiB0aGUgY29udGVudCBvZiB0aGUgZmlsZQogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkKGZpbmFsIFJlcG9zaXRvcnkgZGIsIGZpbmFsIFN0cmluZyBuYW1lKQorCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWQoUmVwb3NpdG9yeSBkYiwgU3RyaW5nIG5hbWUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCBuYW1lKTsKIAkJcmV0dXJuIHJlYWQoZmlsZSk7CkBAIC0yODgsNyArMjg4LDcgQEAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZChmaW5hbCBSZXBvc2l0b3J5IGRiLCBmaW5hbCBTdHJpbmcgbmFtZSkKIAkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGZpbGUKIAkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZmlsZSBleGlzdHMKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2soZmluYWwgUmVwb3NpdG9yeSBkYiwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2hlY2soUmVwb3NpdG9yeSBkYiwgU3RyaW5nIG5hbWUpIHsKIAkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgbmFtZSk7CiAJCXJldHVybiBmaWxlLmV4aXN0cygpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L0xvY2FsRGlza1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCmluZGV4IDU2OGJjM2IuLjZjZGQwZWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Mb2NhbERpc2tSZXBvc2l0b3J5VGVzdENhc2UuamF2YQpAQCAtNDUsNyArNDUsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCkBAIC0yMjUsNyArMjI1LDcgQEAgcHJvdGVjdGVkIHZvaWQgdGljaygpIHsKIAkgKiBAcGFyYW0gZGlyCiAJICogICAgICAgICAgICB0aGUgcmVjdXJzaXZlbHkgZGlyZWN0b3J5IHRvIGRlbGV0ZSwgaWYgcHJlc2VudC4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWN1cnNpdmVEZWxldGUoZmluYWwgRmlsZSBkaXIpIHsKKwlwcm90ZWN0ZWQgdm9pZCByZWN1cnNpdmVEZWxldGUoRmlsZSBkaXIpIHsKIAkJcmVjdXJzaXZlRGVsZXRlKGRpciwgZmFsc2UsIHRydWUpOwogCX0KIApAQCAtMzUyLDcgKzM1Miw3IEBAIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGluZGV4U3RhdGUoUmVwb3NpdG9yeSByZXBvLCBpbnQgaW5jbHVkZWRPcHRpb25zKQogCQkJaWYgKDAgIT0gKGluY2x1ZGVkT3B0aW9ucyAmIENPTlRFTlQpKSB7CiAJCQkJc2IuYXBwZW5kKCIsIGNvbnRlbnQ6IgogCQkJCQkJKyBuZXcgU3RyaW5nKHJlcG8ub3BlbihlbnRyeS5nZXRPYmplY3RJZCgpLAotCQkJCQkJQ29uc3RhbnRzLk9CSl9CTE9CKS5nZXRDYWNoZWRCeXRlcygpLCBVVEZfOCkpOworCQkJCQkJQ29uc3RhbnRzLk9CSl9CTE9CKS5nZXRDYWNoZWRCeXRlcygpLCBDSEFSU0VUKSk7CiAJCQl9CiAJCQlpZiAoMCAhPSAoaW5jbHVkZWRPcHRpb25zICYgQVNTVU1FX1VOQ0hBTkdFRCkpCiAJCQkJc2IuYXBwZW5kKCIsIGFzc3VtZS11bmNoYW5nZWQ6IgpAQCAtNTQwLDcgKzU0MCw3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgcHV0UGVyc29uSWRlbnQoZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnYsCiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSB3cml0dGVuLgogCSAqLwotCXByb3RlY3RlZCBGaWxlIHdyaXRlKGZpbmFsIFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBGaWxlIHdyaXRlKFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBGaWxlIGYgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJ0ZW1wIiwgInR4dCIsIHRtcCk7CiAJCXRyeSB7CiAJCQl3cml0ZShmLCBib2R5KTsKQEAgLTU3MSw3ICs1NzEsNyBAQCBwcm90ZWN0ZWQgRmlsZSB3cml0ZShmaW5hbCBTdHJpbmcgYm9keSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGZpbGUgY291bGQgbm90IGJlIHdyaXR0ZW4uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgd3JpdGUoZmluYWwgRmlsZSBmLCBmaW5hbCBTdHJpbmcgYm9keSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCB3cml0ZShGaWxlIGYsIFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlKR2l0VGVzdFV0aWwud3JpdGUoZiwgYm9keSk7CiAJfQogCkBAIC01ODMsMTEgKzU4MywxMSBAQCBwcm90ZWN0ZWQgdm9pZCB3cml0ZShmaW5hbCBGaWxlIGYsIGZpbmFsIFN0cmluZyBib2R5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIGZpbGUKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIFN0cmluZyByZWFkKGZpbmFsIEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlYWQoRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gSkdpdFRlc3RVdGlsLnJlYWQoZik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdG9FbnZBcnJheShmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudikgeworCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRvRW52QXJyYXkoTWFwPFN0cmluZywgU3RyaW5nPiBlbnYpIHsKIAkJZmluYWwgU3RyaW5nW10gZW52cCA9IG5ldyBTdHJpbmdbZW52LnNpemUoKV07CiAJCWludCBpID0gMDsKIAkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiBlbnYuZW50cnlTZXQoKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvTW9ja1N5c3RlbVJlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Nb2NrU3lzdGVtUmVhZGVyLmphdmEKaW5kZXggMDVkMTUyMi4uZDNkN2Q2OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Nb2NrU3lzdGVtUmVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9Nb2NrU3lzdGVtUmVhZGVyLmphdmEKQEAgLTEwOSw3ICsxMDksNyBAQCBwdWJsaWMgTW9ja1N5c3RlbVJlYWRlcigpIHsKIAkJc2V0Q3VycmVudFBsYXRmb3JtKCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluaXQoZmluYWwgU3RyaW5nIG4pIHsKKwlwcml2YXRlIHZvaWQgaW5pdChTdHJpbmcgbikgewogCQlzZXRQcm9wZXJ0eShuLCBuKTsKIAl9CiAKQEAgLTE5Nyw3ICsxOTcsNyBAQCBwdWJsaWMgdm9pZCBibG9ja1VudGlsKER1cmF0aW9uIG1heFdhaXQpIHsKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBzZWNvbmRzIHRvIGFkZCB0byB0aGUgY3VycmVudCB0aW1lLgogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwdWJsaWMgdm9pZCB0aWNrKGZpbmFsIGludCBzZWNEZWx0YSkgeworCXB1YmxpYyB2b2lkIHRpY2soaW50IHNlY0RlbHRhKSB7CiAJCW5vdyArPSBzZWNEZWx0YSAqIDEwMDBMOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9SZXBvc2l0b3J5VGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvUmVwb3NpdG9yeVRlc3RDYXNlLmphdmEKaW5kZXggYWZjMmM0NC4uZTk4M2U1ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9SZXBvc2l0b3J5VGVzdENhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1JlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCkBAIC00Niw3ICs0Niw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5qdW5pdDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTkyLDIyICs5MiwxNSBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVwb3NpdG9yeVRlc3RDYXNlIGV4dGVuZHMgTG9jYWxEaXNrUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAkgKiBAcGFyYW0gZHN0CiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBjb3B5RmlsZShmaW5hbCBGaWxlIHNyYywgZmluYWwgRmlsZSBkc3QpCisJcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNvcHlGaWxlKEZpbGUgc3JjLCBGaWxlIGRzdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHNyYyk7Ci0JCXRyeSB7Ci0JCQlmaW5hbCBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRzdCk7Ci0JCQl0cnkgewotCQkJCWZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs0MDk2XTsKLQkJCQlpbnQgcjsKLQkJCQl3aGlsZSAoKHIgPSBmaXMucmVhZChidWYpKSA+IDApIHsKLQkJCQkJZm9zLndyaXRlKGJ1ZiwgMCwgcik7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlmb3MuY2xvc2UoKTsKKwkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmMpOworCQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZHN0KSkgeworCQkJZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzQwOTZdOworCQkJaW50IHI7CisJCQl3aGlsZSAoKHIgPSBmaXMucmVhZChidWYpKSA+IDApIHsKKwkJCQlmb3Mud3JpdGUoYnVmLCAwLCByKTsKIAkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWZpcy5jbG9zZSgpOwogCQl9CiAJfQogCkBAIC0xMTksNyArMTEyLDcgQEAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNvcHlGaWxlKGZpbmFsIEZpbGUgc3JjLCBmaW5hbCBGaWxlIGRzdCkKIAkgKiBAcmV0dXJuIHRoZSB0cmFzaCBmaWxlCiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCBGaWxlIHdyaXRlVHJhc2hGaWxlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGF0YSkKKwlwcm90ZWN0ZWQgRmlsZSB3cml0ZVRyYXNoRmlsZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRhdGEpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gSkdpdFRlc3RVdGlsLndyaXRlVHJhc2hGaWxlKGRiLCBuYW1lLCBkYXRhKTsKIAl9CkBAIC0xMzUsNyArMTI4LDcgQEAgcHJvdGVjdGVkIEZpbGUgd3JpdGVUcmFzaEZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkYXRhKQogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICogQHNpbmNlIDQuMgogCSAqLwotCXByb3RlY3RlZCBQYXRoIHdyaXRlTGluayhmaW5hbCBTdHJpbmcgbGluaywgZmluYWwgU3RyaW5nIHRhcmdldCkKKwlwcm90ZWN0ZWQgUGF0aCB3cml0ZUxpbmsoU3RyaW5nIGxpbmssIFN0cmluZyB0YXJnZXQpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC53cml0ZUxpbmsoZGIsIGxpbmssIHRhcmdldCk7CiAJfQpAQCAtMTYyLDcgKzE1NSw3IEBAIHByb3RlY3RlZCBGaWxlIHdyaXRlVHJhc2hGaWxlKGZpbmFsIFN0cmluZyBzdWJkaXIsIGZpbmFsIFN0cmluZyBuYW1lLAogCSAqIEByZXR1cm4gdGhlIGZpbGUncyBjb250ZW50CiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVhZChmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlYWQoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwucmVhZChkYiwgbmFtZSk7CiAJfQogCkBAIC0xNzMsNyArMTY2LDcgQEAgcHJvdGVjdGVkIFN0cmluZyByZWFkKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgICAgZmlsZSBuYW1lCiAJICogQHJldHVybiBpZiB0aGUgZmlsZSBleGlzdHMKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjaGVjayhmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByb3RlY3RlZCBib29sZWFuIGNoZWNrKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwuY2hlY2soZGIsIG5hbWUpOwogCX0KIApAQCAtMTg0LDcgKzE3Nyw3IEBAIHByb3RlY3RlZCBib29sZWFuIGNoZWNrKGZpbmFsIFN0cmluZyBuYW1lKSB7CiAJICogICAgICAgICAgICBmaWxlIG5hbWUKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlVHJhc2hGaWxlKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVRyYXNoRmlsZShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSkdpdFRlc3RVdGlsLmRlbGV0ZVRyYXNoRmlsZShkYiwgbmFtZSk7CiAJfQogCkBAIC0xOTYsMTAgKzE4OSwxMCBAQCBwcm90ZWN0ZWQgdm9pZCBkZWxldGVUcmFzaEZpbGUoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICBleHBlY3RlZCBjb250ZW50CiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBjaGVja0ZpbGUoRmlsZSBmLCBmaW5hbCBTdHJpbmcgY2hlY2tEYXRhKQorCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBjaGVja0ZpbGUoRmlsZSBmLCBTdHJpbmcgY2hlY2tEYXRhKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChSZWFkZXIgciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGYpLAotCQkJCVVURl84KSkgeworCQkJCUNIQVJTRVQpKSB7CiAJCQlpZiAoY2hlY2tEYXRhLmxlbmd0aCgpID4gMCkgewogCQkJCWNoYXJbXSBkYXRhID0gbmV3IGNoYXJbY2hlY2tEYXRhLmxlbmd0aCgpXTsKIAkJCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIHIucmVhZChkYXRhKSk7CkBAIC0yOTMsMTAgKzI4NiwxMSBAQCBwcm90ZWN0ZWQgdm9pZCByZXNldEluZGV4KEZpbGVUcmVlSXRlcmF0b3IgdHJlZUl0cikKIAkJCQlkY2Uuc2V0RmlsZU1vZGUodHJlZUl0ci5nZXRFbnRyeUZpbGVNb2RlKCkpOwogCQkJCWRjZS5zZXRMYXN0TW9kaWZpZWQodHJlZUl0ci5nZXRFbnRyeUxhc3RNb2RpZmllZCgpKTsKIAkJCQlkY2Uuc2V0TGVuZ3RoKChpbnQpIGxlbik7Ci0JCQkJRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgKLQkJCQkJCXRyZWVJdHIuZ2V0RW50cnlGaWxlKCkpOwotCQkJCWRjZS5zZXRPYmplY3RJZChpbnNlcnRlci5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLCBsZW4sIGluKSk7Ci0JCQkJaW4uY2xvc2UoKTsKKwkJCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oCisJCQkJCQl0cmVlSXRyLmdldEVudHJ5RmlsZSgpKSkgeworCQkJCQlkY2Uuc2V0T2JqZWN0SWQoCisJCQkJCQkJaW5zZXJ0ZXIuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwgbGVuLCBpbikpOworCQkJCX0KIAkJCQlidWlsZGVyLmFkZChkY2UpOwogCQkJCXRyZWVJdHIubmV4dCgxKTsKIAkJCX0KQEAgLTM4MCw4ICszNzQsOSBAQCBwdWJsaWMgc3RhdGljIGxvbmcgZnNUaWNrKEZpbGUgbGFzdEZpbGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKIAkJCXdoaWxlIChhY3RUaW1lIDw9IHN0YXJ0VGltZSkgewogCQkJCVRocmVhZC5zbGVlcChzbGVlcFRpbWUpOwogCQkJCXNsZWVwVGltZSAqPSAyOwotCQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wKTsKLQkJCQlmb3MuY2xvc2UoKTsKKwkJCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odG1wKSkgeworCQkJCQkvLyBEbyBub3RoaW5nCisJCQkJfQogCQkJCWFjdFRpbWUgPSBmcy5sYXN0TW9kaWZpZWQodG1wKTsKIAkJCX0KIAkJCXJldHVybiBhY3RUaW1lOwpAQCAtNTA1LDcgKzUwMCw3IEBAIGVsc2UgaWYgKGVtcHR5KQogCSAqIEBwYXJhbSBtb2RlCiAJICogQHJldHVybiB0aGUgRGlyQ2FjaGVFbnRyeQogCSAqLwotCXByb3RlY3RlZCBEaXJDYWNoZUVudHJ5IGNyZWF0ZUVudHJ5KGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBGaWxlTW9kZSBtb2RlKSB7CisJcHJvdGVjdGVkIERpckNhY2hlRW50cnkgY3JlYXRlRW50cnkoU3RyaW5nIHBhdGgsIEZpbGVNb2RlIG1vZGUpIHsKIAkJcmV0dXJuIGNyZWF0ZUVudHJ5KHBhdGgsIG1vZGUsIERpckNhY2hlRW50cnkuU1RBR0VfMCwgcGF0aCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1Rlc3RSZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1Rlc3RSZXBvc2l0b3J5LmphdmEKaW5kZXggNDE2MzRlNy4uZDIzYzBkMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJlcG9zaXRvcnkuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIApAQCAtMjQ0LDcgKzI0NCw3IEBAIHB1YmxpYyBUaW1lWm9uZSBnZXRUaW1lWm9uZSgpIHsKIAkgKiBAcGFyYW0gc2VjRGVsdGEKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBzZWNvbmRzIHRvIGFkZCB0byB0aGUgY3VycmVudCB0aW1lLgogCSAqLwotCXB1YmxpYyB2b2lkIHRpY2soZmluYWwgaW50IHNlY0RlbHRhKSB7CisJcHVibGljIHZvaWQgdGljayhpbnQgc2VjRGVsdGEpIHsKIAkJbW9ja1N5c3RlbVJlYWRlci50aWNrKHNlY0RlbHRhKTsKIAl9CiAKQEAgLTI2Nyw4ICsyNjcsOCBAQCBwdWJsaWMgdm9pZCBzZXRBdXRob3JBbmRDb21taXR0ZXIob3JnLmVjbGlwc2UuamdpdC5saWIuQ29tbWl0QnVpbGRlciBjKSB7CiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGJsb2IuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2QmxvYiBibG9iKGZpbmFsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGJsb2IoY29udGVudC5nZXRCeXRlcyhVVEZfOCkpOworCXB1YmxpYyBSZXZCbG9iIGJsb2IoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gYmxvYihjb250ZW50LmdldEJ5dGVzKENIQVJTRVQpKTsKIAl9CiAKIAkvKioKQEAgLTI3OSw3ICsyNzksNyBAQCBwdWJsaWMgUmV2QmxvYiBibG9iKGZpbmFsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkgKiBAcmV0dXJuIHJlZmVyZW5jZSB0byB0aGUgYmxvYi4KIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBSZXZCbG9iIGJsb2IoZmluYWwgYnl0ZVtdIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyBSZXZCbG9iIGJsb2IoYnl0ZVtdIGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24gewogCQlPYmplY3RJZCBpZDsKIAkJdHJ5IChPYmplY3RJbnNlcnRlciBpbnMgPSBpbnNlcnRlcikgewogCQkJaWQgPSBpbnMuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwgY29udGVudCk7CkBAIC0yOTgsNyArMjk4LDcgQEAgcHVibGljIFJldkJsb2IgYmxvYihmaW5hbCBieXRlW10gY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJICogQHJldHVybiB0aGUgZW50cnkuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVFbnRyeSBmaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBSZXZCbG9iIGJsb2IpCisJcHVibGljIERpckNhY2hlRW50cnkgZmlsZShTdHJpbmcgcGF0aCwgUmV2QmxvYiBibG9iKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIERpckNhY2hlRW50cnkgZSA9IG5ldyBEaXJDYWNoZUVudHJ5KHBhdGgpOwogCQllLnNldEZpbGVNb2RlKEZpbGVNb2RlLlJFR1VMQVJfRklMRSk7CkBAIC0zMTUsMTAgKzMxNSwxMCBAQCBwdWJsaWMgRGlyQ2FjaGVFbnRyeSBmaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBSZXZCbG9iIGJsb2IpCiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIHRyZWUgc3BlY2lmaWVkIGJ5IHRoZSBlbnRyeSBsaXN0LgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldlRyZWUgdHJlZShmaW5hbCBEaXJDYWNoZUVudHJ5Li4uIGVudHJpZXMpIHRocm93cyBFeGNlcHRpb24geworCXB1YmxpYyBSZXZUcmVlIHRyZWUoRGlyQ2FjaGVFbnRyeS4uLiBlbnRyaWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgRGlyQ2FjaGUgZGMgPSBEaXJDYWNoZS5uZXdJbkNvcmUoKTsKIAkJZmluYWwgRGlyQ2FjaGVCdWlsZGVyIGIgPSBkYy5idWlsZGVyKCk7Ci0JCWZvciAoZmluYWwgRGlyQ2FjaGVFbnRyeSBlIDogZW50cmllcykKKwkJZm9yIChEaXJDYWNoZUVudHJ5IGUgOiBlbnRyaWVzKQogCQkJYi5hZGQoZSk7CiAJCWIuZmluaXNoKCk7CiAJCU9iamVjdElkIHJvb3Q7CkBAIC0zMzksNyArMzM5LDcgQEAgcHVibGljIFJldlRyZWUgdHJlZShmaW5hbCBEaXJDYWNoZUVudHJ5Li4uIGVudHJpZXMpIHRocm93cyBFeGNlcHRpb24gewogCSAqIEByZXR1cm4gdGhlIHBhcnNlZCBvYmplY3QgZW50cnkgYXQgdGhpcyBwYXRoLCBuZXZlciBudWxsLgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldk9iamVjdCBnZXQoZmluYWwgUmV2VHJlZSB0cmVlLCBmaW5hbCBTdHJpbmcgcGF0aCkKKwlwdWJsaWMgUmV2T2JqZWN0IGdldChSZXZUcmVlIHRyZWUsIFN0cmluZyBwYXRoKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocG9vbC5nZXRPYmplY3RSZWFkZXIoKSkpIHsKIAkJCXR3LnNldEZpbHRlcihQYXRoRmlsdGVyR3JvdXAuY3JlYXRlRnJvbVN0cmluZ3MoQ29sbGVjdGlvbnMKQEAgLTM3MCw3ICszNzAsNyBAQCBwdWJsaWMgUmV2T2JqZWN0IGdldChmaW5hbCBSZXZUcmVlIHRyZWUsIGZpbmFsIFN0cmluZyBwYXRoKQogCSAqIEByZXR1cm4gdGhlIG5ldyBjb21taXQuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2Q29tbWl0IGNvbW1pdChmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIFJldkNvbW1pdCBjb21taXQoUmV2Q29tbWl0Li4uIHBhcmVudHMpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gY29tbWl0KDEsIHRyZWUoKSwgcGFyZW50cyk7CiAJfQogCkBAIC0zODYsNyArMzg2LDcgQEAgcHVibGljIFJldkNvbW1pdCBjb21taXQoZmluYWwgUmV2Q29tbWl0Li4uIHBhcmVudHMpIHRocm93cyBFeGNlcHRpb24gewogCSAqIEByZXR1cm4gdGhlIG5ldyBjb21taXQuCiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgUmV2Q29tbWl0IGNvbW1pdChmaW5hbCBSZXZUcmVlIHRyZWUsIGZpbmFsIFJldkNvbW1pdC4uLiBwYXJlbnRzKQorCXB1YmxpYyBSZXZDb21taXQgY29tbWl0KFJldlRyZWUgdHJlZSwgUmV2Q29tbWl0Li4uIHBhcmVudHMpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGNvbW1pdCgxLCB0cmVlLCBwYXJlbnRzKTsKIAl9CkBAIC00MDQsNyArNDA0LDcgQEAgcHVibGljIFJldkNvbW1pdCBjb21taXQoZmluYWwgUmV2VHJlZSB0cmVlLCBmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykKIAkgKiBAcmV0dXJuIHRoZSBuZXcgY29tbWl0LgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFJldkNvbW1pdCBjb21taXQoZmluYWwgaW50IHNlY0RlbHRhLCBmaW5hbCBSZXZDb21taXQuLi4gcGFyZW50cykKKwlwdWJsaWMgUmV2Q29tbWl0IGNvbW1pdChpbnQgc2VjRGVsdGEsIFJldkNvbW1pdC4uLiBwYXJlbnRzKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiBjb21taXQoc2VjRGVsdGEsIHRyZWUoKSwgcGFyZW50cyk7CiAJfQpAQCAtNDcwLDcgKzQ3MCw3IEBAIHB1YmxpYyBDb21taXRCdWlsZGVyIGNvbW1pdCgpIHsKIAkgKiBAcmV0dXJuIHRoZSBhbm5vdGF0ZWQgdGFnIG9iamVjdC4KIAkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBSZXZUYWcgdGFnKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBSZXZPYmplY3QgZHN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgUmV2VGFnIHRhZyhTdHJpbmcgbmFtZSwgUmV2T2JqZWN0IGRzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFRhZ0J1aWxkZXIgdCA9IG5ldyBUYWdCdWlsZGVyKCk7CiAJCXQuc2V0T2JqZWN0SWQoZHN0KTsKIAkJdC5zZXRUYWcobmFtZSk7CkBAIC03NTksNyArNzU5LDcgQEAgcHVibGljIHZvaWQgdXBkYXRlU2VydmVySW5mbygpIHRocm93cyBFeGNlcHRpb24gewogCQkJZmluYWwgRmlsZVJlcG9zaXRvcnkgZnIgPSAoRmlsZVJlcG9zaXRvcnkpIGRiOwogCQkJUmVmV3JpdGVyIHJ3ID0gbmV3IFJlZldyaXRlcihmci5nZXRBbGxSZWZzKCkudmFsdWVzKCkpIHsKIAkJCQlAT3ZlcnJpZGUKLQkJCQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIGJ5dGVbXSBiaW4pCisJCQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVGaWxlKFN0cmluZyBuYW1lLCBieXRlW10gYmluKQogCQkJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQkJRmlsZSBwYXRoID0gbmV3IEZpbGUoZnIuZ2V0RGlyZWN0b3J5KCksIG5hbWUpOwogCQkJCQlUZXN0UmVwb3NpdG9yeS50aGlzLndyaXRlRmlsZShwYXRoLCBiaW4pOwpAQCAtNzkxLDcgKzc5MSw3IEBAIHByb3RlY3RlZCB2b2lkIHdyaXRlRmlsZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgYnl0ZVtdIGJpbikKIAkgKiBAcmV0dXJuIHtAY29kZSBvYmplY3R9CiAJICogQHRocm93cyBFeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgPFQgZXh0ZW5kcyBSZXZPYmplY3Q+IFQgcGFyc2VCb2R5KGZpbmFsIFQgb2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwdWJsaWMgPFQgZXh0ZW5kcyBSZXZPYmplY3Q+IFQgcGFyc2VCb2R5KFQgb2JqZWN0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcG9vbC5wYXJzZUJvZHkob2JqZWN0KTsKIAkJcmV0dXJuIG9iamVjdDsKIAl9CkBAIC05NDQsNyArOTQ0LDcgQEAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBuYW1lRm9yKE9iamVjdERpcmVjdG9yeSBvZGIsIE9iamVjdElkIG5hbWUsIFN0cmluZyB0KSB7CiAJCXJldHVybiBuZXcgRmlsZShwYWNrZGlyLCAicGFjay0iICsgbmFtZS5uYW1lKCkgKyB0KTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgd3JpdGVGaWxlKGZpbmFsIEZpbGUgcCwgZmluYWwgYnl0ZVtdIGJpbikgdGhyb3dzIElPRXhjZXB0aW9uLAorCXByaXZhdGUgdm9pZCB3cml0ZUZpbGUoRmlsZSBwLCBieXRlW10gYmluKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlPYmplY3RXcml0aW5nRXhjZXB0aW9uIHsKIAkJZmluYWwgTG9ja0ZpbGUgbGNrID0gbmV3IExvY2tGaWxlKHApOwogCQlpZiAoIWxjay5sb2NrKCkpCkBAIC05NjIsNyArOTYyLDcgQEAgcHJpdmF0ZSB2b2lkIHdyaXRlRmlsZShmaW5hbCBGaWxlIHAsIGZpbmFsIGJ5dGVbXSBiaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwKIAlwdWJsaWMgY2xhc3MgQnJhbmNoQnVpbGRlciB7CiAJCXByaXZhdGUgZmluYWwgU3RyaW5nIHJlZjsKIAotCQlCcmFuY2hCdWlsZGVyKGZpbmFsIFN0cmluZyByZWYpIHsKKwkJQnJhbmNoQnVpbGRlcihTdHJpbmcgcmVmKSB7CiAJCQl0aGlzLnJlZiA9IHJlZjsKIAkJfQogCkBAIC0xMDkzLDcgKzEwOTMsNyBAQCBwdWJsaWMgQ29tbWl0QnVpbGRlciBhZGQoU3RyaW5nIHBhdGgsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCXJldHVybiBhZGQocGF0aCwgYmxvYihjb250ZW50KSk7CiAJCX0KIAotCQlwdWJsaWMgQ29tbWl0QnVpbGRlciBhZGQoU3RyaW5nIHBhdGgsIGZpbmFsIFJldkJsb2IgaWQpCisJCXB1YmxpYyBDb21taXRCdWlsZGVyIGFkZChTdHJpbmcgcGF0aCwgUmV2QmxvYiBpZCkKIAkJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCXJldHVybiBlZGl0KG5ldyBQYXRoRWRpdChwYXRoKSB7CiAJCQkJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1Rlc3RSbmcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJuZy5qYXZhCmluZGV4IDU0YzgxZjIuLmY3YWYzNmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJuZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQuanVuaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJuZy5qYXZhCkBAIC01NSw3ICs1NSw3IEBAIHB1YmxpYyBjbGFzcyBUZXN0Um5nIHsKIAkgKiBAcGFyYW0gc2VlZAogCSAqICAgICAgICAgICAgc2VlZCB0byBib290c3RyYXAsIHVzdWFsbHkgdGhpcyBpcyB0aGUgdGVzdCBtZXRob2QgbmFtZS4KIAkgKi8KLQlwdWJsaWMgVGVzdFJuZyhmaW5hbCBTdHJpbmcgc2VlZCkgeworCXB1YmxpYyBUZXN0Um5nKFN0cmluZyBzZWVkKSB7CiAJCW5leHQgPSAwOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHNlZWQubGVuZ3RoKCk7IGkrKykKIAkJCW5leHQgPSBuZXh0ICogMTEgKyBzZWVkLmNoYXJBdChpKTsKQEAgLTY4LDcgKzY4LDcgQEAgcHVibGljIFRlc3RSbmcoZmluYWwgU3RyaW5nIHNlZWQpIHsKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiByYW5kb20gYnl0ZXMgdG8gcHJvZHVjZS4KIAkgKiBAcmV0dXJuIGFycmF5IG9mIHtAY29kZSBjbnR9IHJhbmRvbWx5IGdlbmVyYXRlZCBieXRlcy4KIAkgKi8KLQlwdWJsaWMgYnl0ZVtdIG5leHRCeXRlcyhmaW5hbCBpbnQgY250KSB7CisJcHVibGljIGJ5dGVbXSBuZXh0Qnl0ZXMoaW50IGNudCkgewogCQlmaW5hbCBieXRlW10gciA9IG5ldyBieXRlW2NudF07CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgY250OyBpKyspCiAJCQlyW2ldID0gKGJ5dGUpIG5leHRJbnQoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNDU0YmQxZC4uYzgwNWY3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNyArMyw3IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44CkBAIC0yOCwyNCArMjgsMjQgQEAKICBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLmxvZzt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5zZWN1cml0eTt2ZXJzaW9uPSJbOS40LjUsMTAuMC4wKSIsCiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC50aHJlYWQ7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5odHRwO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuaGFtY3Jlc3QuY29yZTt2ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC9wb20ueG1sCmluZGV4IGMwOGJmNmIuLmRlZTMxOTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvTGZzU2VydmVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKaW5kZXggOTBmZTExNi4uNTBhMDZmOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9MZnNTZXJ2ZXJUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CkBAIC0xMzEsMTIgKzEzMSw2IEBAIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAkJCUBPdmVycmlkZQogCQkJcHJvdGVjdGVkIExhcmdlRmlsZVJlcG9zaXRvcnkgZ2V0TGFyZ2VGaWxlUmVwb3NpdG9yeSgKLQkJCQkJTGZzUmVxdWVzdCByZXF1ZXN0LCBTdHJpbmcgcGF0aCkgewotCQkJCXJldHVybiByZXBvc2l0b3J5OwotCQkJfQotCi0JCQlAT3ZlcnJpZGUKLQkJCXByb3RlY3RlZCBMYXJnZUZpbGVSZXBvc2l0b3J5IGdldExhcmdlRmlsZVJlcG9zaXRvcnkoCiAJCQkJCUxmc1JlcXVlc3QgcmVxdWVzdCwgU3RyaW5nIHBhdGgsIFN0cmluZyBhdXRoKQogCQkJCQl0aHJvd3MgTGZzRXhjZXB0aW9uIHsKIAkJCQlyZXR1cm4gcmVwb3NpdG9yeTsKQEAgLTIxNywxMSArMjExLDExIEBAIHByaXZhdGUgdm9pZCBjaGVja1Jlc3BvbnNlU3RhdHVzKEh0dHBSZXNwb25zZSByZXNwb25zZSkgewogCQkJCWlmIChidWYuaGFzQXJyYXkoKSkgewogCQkJCQllcnJvciA9IG5ldyBTdHJpbmcoYnVmLmFycmF5KCksCiAJCQkJCQkJYnVmLmFycmF5T2Zmc2V0KCkgKyBidWYucG9zaXRpb24oKSwgYnVmLnJlbWFpbmluZygpLAotCQkJCQkJCVVURl84KTsKKwkJCQkJCQlDSEFSU0VUKTsKIAkJCQl9IGVsc2UgewogCQkJCQlmaW5hbCBieXRlW10gYiA9IG5ldyBieXRlW2J1Zi5yZW1haW5pbmcoKV07CiAJCQkJCWJ1Zi5kdXBsaWNhdGUoKS5nZXQoYik7Ci0JCQkJCWVycm9yID0gbmV3IFN0cmluZyhiLCBVVEZfOCk7CisJCQkJCWVycm9yID0gbmV3IFN0cmluZyhiLCBDSEFSU0VUKTsKIAkJCQl9CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQkJZXJyb3IgPSBzdGF0dXNMaW5lLmdldFJlYXNvblBocmFzZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9VcGxvYWRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1VwbG9hZFRlc3QuamF2YQppbmRleCA4YThmNDljLi4wOWY4ZDBhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1VwbG9hZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL1VwbG9hZFRlc3QuamF2YQpAQCAtMTIyLDcgKzEyMiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYXJhbGxlbFVwbG9hZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQlFeGVjdXRvclNlcnZpY2UgZSA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woY291bnQpOwogCQl0cnkgewotCQkJZm9yIChmaW5hbCBQYXRoIHAgOiBwYXRocykgeworCQkJZm9yIChQYXRoIHAgOiBwYXRocykgewogCQkJCWUuc3VibWl0KG5ldyBDYWxsYWJsZTxWb2lkPigpIHsKIAkJCQkJQE92ZXJyaWRlCiAJCQkJCXB1YmxpYyBWb2lkIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA2ODU1NWI4Li4xNGQzYWI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDE5ICszLDE5IEBACiBCdW5kbGUtTmFtZTogJXBsdWdpbl9uYW1lCiBBdXRvbWF0aWMtTW9kdWxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcgogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyCi1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI0LjExLjgiOworRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0Lmh0dHAsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJqYXZheC5zZXJ2bGV0LAogICAgamF2YXguc2VydmxldC5odHRwLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS44Ijt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuczM7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliIgogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKQEAgLTI1LDE0ICsyNSwxNSBAQAogIGphdmF4LnNlcnZsZXQuaHR0cDt2ZXJzaW9uPSJbMy4xLjAsNC4wLjApIiwKICBvcmcuYXBhY2hlLmh0dHA7dmVyc2lvbj0iWzQuMy4wLDUuMC4wKSIsCiAgb3JnLmFwYWNoZS5odHRwLmNsaWVudDt2ZXJzaW9uPSJbNC4zLjAsNS4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5hcGFjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbAppbmRleCBlNzNhZDJmLi43YzgxYzFhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9MZnNQcm90b2NvbFNlcnZsZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCmluZGV4IDY5NjhkNzUuLmQyMmQ0NTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL0xmc1Byb3RvY29sU2VydmxldC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzLlNDX0ZPUkJJRERFTjsKIGltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5odHRwLkh0dHBTdGF0dXMuU0NfSU5TVUZGSUNJRU5UX1NUT1JBR0U7CiBpbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUuaHR0cC5IdHRwU3RhdHVzLlNDX0lOVEVSTkFMX1NFUlZFUl9FUlJPUjsKQEAgLTExMiw0OCArMTEyLDYgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIExmc1Byb3RvY29sU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKIAkgKiAgICAgICAgICAgIHRoZSByZXF1ZXN0CiAJICogQHBhcmFtIHBhdGgKIAkgKiAgICAgICAgICAgIHRoZSBwYXRoCi0JICogQHJldHVybiB0aGUgbGFyZ2UgZmlsZSByZXBvc2l0b3J5IHN0b3JpbmcgbGFyZ2UgZmlsZXMuCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIHNob3VsZCB0aHJvdyBtb3JlIHNwZWNpZmljIGV4Y2VwdGlvbnMgdG8KLQkgKiAgICAgICAgICAgICBzaWduYWwgd2hpY2ggdHlwZSBvZiBlcnJvciBvY2N1cnJlZDoKLQkgKiAgICAgICAgICAgICA8ZGw+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzVmFsaWRhdGlvbkVycm9yfTwvZHQ+Ci0JICogICAgICAgICAgICAgPGRkPndoZW4gdGhlcmUgaXMgYSB2YWxpZGF0aW9uIGVycm9yIHdpdGggb25lIG9yIG1vcmUgb2YgdGhlCi0JICogICAgICAgICAgICAgb2JqZWN0cyBpbiB0aGUgcmVxdWVzdDwvZGQ+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzUmVwb3NpdG9yeU5vdEZvdW5kfTwvZHQ+Ci0JICogICAgICAgICAgICAgPGRkPndoZW4gdGhlIHJlcG9zaXRvcnkgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSB1c2VyPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNSZXBvc2l0b3J5UmVhZE9ubHl9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgdXNlciBoYXMgcmVhZCwgYnV0IG5vdCB3cml0ZSBhY2Nlc3MuIE9ubHkKLQkgKiAgICAgICAgICAgICBhcHBsaWNhYmxlIHdoZW4gdGhlIG9wZXJhdGlvbiBpbiB0aGUgcmVxdWVzdCBpcyAidXBsb2FkIjwvZGQ+Ci0JICogICAgICAgICAgICAgPGR0PntAbGluayBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnMuTGZzUmF0ZUxpbWl0RXhjZWVkZWR9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgdXNlciBoYXMgaGl0IGEgcmF0ZSBsaW1pdCB3aXRoIHRoZSBzZXJ2ZXI8L2RkPgotCSAqICAgICAgICAgICAgIDxkdD57QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzLkxmc0JhbmR3aWR0aExpbWl0RXhjZWVkZWR9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGUgYmFuZHdpZHRoIGxpbWl0IGZvciB0aGUgdXNlciBvciByZXBvc2l0b3J5IGhhcwotCSAqICAgICAgICAgICAgIGJlZW4gZXhjZWVkZWQ8L2RkPgotCSAqICAgICAgICAgICAgIDxkdD57QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzLkxmc0luc3VmZmljaWVudFN0b3JhZ2V9PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgc3RvcmFnZSBvbiB0aGUgc2VydmVyPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNVbmF2YWlsYWJsZX08L2R0PgotCSAqICAgICAgICAgICAgIDxkZD53aGVuIExGUyBpcyBub3QgYXZhaWxhYmxlPC9kZD4KLQkgKiAgICAgICAgICAgICA8ZHQ+e0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNFeGNlcHRpb259PC9kdD4KLQkgKiAgICAgICAgICAgICA8ZGQ+d2hlbiBhbiB1bmV4cGVjdGVkIGludGVybmFsIHNlcnZlciBlcnJvciBvY2N1cnJlZDwvZGQ+Ci0JICogICAgICAgICAgICAgPC9kbD4KLQkgKiBAc2luY2UgNC41Ci0JICogQGRlcHJlY2F0ZWQgdXNlCi0JICogICAgICAgICAgICAge0BsaW5rICNnZXRMYXJnZUZpbGVSZXBvc2l0b3J5KExmc1JlcXVlc3QsIFN0cmluZywgU3RyaW5nKX0KLQkgKi8KLQlARGVwcmVjYXRlZAotCXByb3RlY3RlZCBMYXJnZUZpbGVSZXBvc2l0b3J5IGdldExhcmdlRmlsZVJlcG9zaXRvcnkoTGZzUmVxdWVzdCByZXF1ZXN0LAotCQkJU3RyaW5nIHBhdGgpIHRocm93cyBMZnNFeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0TGFyZ2VGaWxlUmVwb3NpdG9yeShyZXF1ZXN0LCBwYXRoLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxhcmdlIGZpbGUgcmVwb3NpdG9yeSBmb3IgdGhlIGdpdmVuIHJlcXVlc3QgYW5kIHBhdGguCi0JICoKLQkgKiBAcGFyYW0gcmVxdWVzdAotCSAqICAgICAgICAgICAgdGhlIHJlcXVlc3QKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgdGhlIHBhdGgKIAkgKiBAcGFyYW0gYXV0aAogCSAqICAgICAgICAgICAgdGhlIEF1dGhvcml6YXRpb24gSFRUUCBoZWFkZXIKIAkgKiBAcmV0dXJuIHRoZSBsYXJnZSBmaWxlIHJlcG9zaXRvcnkgc3RvcmluZyBsYXJnZSBmaWxlcy4KQEAgLTI0NCwxMCArMjAyLDEwIEBAIHB1YmxpYyBib29sZWFuIGlzVmVyaWZ5KCkgewogCXByb3RlY3RlZCB2b2lkIGRvUG9zdChIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcykKIAkJCXRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCVdyaXRlciB3ID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKAotCQkJCW5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIocmVzLmdldE91dHB1dFN0cmVhbSgpLCBVVEZfOCkpOworCQkJCW5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIocmVzLmdldE91dHB1dFN0cmVhbSgpLCBDSEFSU0VUKSk7CiAKIAkJUmVhZGVyIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKHJlcS5nZXRJbnB1dFN0cmVhbSgpLCBVVEZfOCkpOworCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihyZXEuZ2V0SW5wdXRTdHJlYW0oKSwgQ0hBUlNFVCkpOwogCQlMZnNSZXF1ZXN0IHJlcXVlc3QgPSBMZnNHc29uLmZyb21Kc29uKHIsIExmc1JlcXVlc3QuY2xhc3MpOwogCQlTdHJpbmcgcGF0aCA9IHJlcS5nZXRQYXRoSW5mbygpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9GaWxlTGZzUmVwb3NpdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvZnMvRmlsZUxmc1JlcG9zaXRvcnkuamF2YQppbmRleCA2ODhhZWYyLi41NWQ5MDkzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9mcy9GaWxlTGZzUmVwb3NpdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL2ZzL0ZpbGVMZnNSZXBvc2l0b3J5LmphdmEKQEAgLTE3MCw3ICsxNzAsNyBAQCBBdG9taWNPYmplY3RPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKEFueUxvbmdPYmplY3RJZCBpZCkKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaGV4Y2hhciA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLAogCQkJJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJyB9OwogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBmb3JtYXRIZXhDaGFyKGZpbmFsIGNoYXJbXSBkc3QsIGZpbmFsIGludCBwLCBpbnQgYikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihjaGFyW10gZHN0LCBpbnQgcCwgaW50IGIpIHsKIAkJaW50IG8gPSBwICsgMTsKIAkJd2hpbGUgKG8gPj0gcCAmJiBiICE9IDApIHsKIAkJCWRzdFtvLS1dID0gaGV4Y2hhcltiICYgMHhmXTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL3MzL1NpZ25lclY0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3NlcnZlci9zMy9TaWduZXJWNC5qYXZhCmluZGV4IGIyMWM5NGUuLjM3NGE1NjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvc2VydmVyL3MzL1NpZ25lclY0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9zZXJ2ZXIvczMvU2lnbmVyVjQuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQuSERSX0FVVEhPUklaQVRJT047CiAKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CkBAIC0zNTksMTMgKzM1OSwxMyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2Fub25pY2FsaXplUmVzb3VyY2VQYXRoKFVSTCBlbmRwb2ludCkgewogCiAJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGhhc2goU3RyaW5nIHMpIHsKIAkJTWVzc2FnZURpZ2VzdCBtZCA9IENvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCk7Ci0JCW1kLnVwZGF0ZShzLmdldEJ5dGVzKFVURl84KSk7CisJCW1kLnVwZGF0ZShzLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJcmV0dXJuIG1kLmRpZ2VzdCgpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBzaWduKFN0cmluZyBzdHJpbmdEYXRhLCBieXRlW10ga2V5KSB7CiAJCXRyeSB7Ci0JCQlieXRlW10gZGF0YSA9IHN0cmluZ0RhdGEuZ2V0Qnl0ZXMoVVRGXzgpOworCQkJYnl0ZVtdIGRhdGEgPSBzdHJpbmdEYXRhLmdldEJ5dGVzKENIQVJTRVQpOwogCQkJTWFjIG1hYyA9IE1hYy5nZXRJbnN0YW5jZShITUFDU0hBMjU2KTsKIAkJCW1hYy5pbml0KG5ldyBTZWNyZXRLZXlTcGVjKGtleSwgSE1BQ1NIQTI1NikpOwogCQkJcmV0dXJuIG1hYy5kb0ZpbmFsKGRhdGEpOwpAQCAtMzk1LDcgKzM5NSw3IEBAIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b0hleChieXRlW10gYnl0ZXMpIHsKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdXJsRW5jb2RlKFN0cmluZyB1cmwsIGJvb2xlYW4ga2VlcFBhdGhTbGFzaCkgewogCQlTdHJpbmcgZW5jb2RlZDsKIAkJdHJ5IHsKLQkJCWVuY29kZWQgPSBVUkxFbmNvZGVyLmVuY29kZSh1cmwsIFVURl84Lm5hbWUoKSk7CisJCQllbmNvZGVkID0gVVJMRW5jb2Rlci5lbmNvZGUodXJsLCBDSEFSU0VULm5hbWUoKSk7CiAJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTGZzU2VydmVyVGV4dC5nZXQoKS51bnN1cHBvcnRlZFV0ZjgsIGUpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBkNjRlMmUyLi5kODM3NmNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMjMgKzMsMjMgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44Ci1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5oYW1jcmVzdC5jb3JlO3ZlcnNpb249IlsxLjEuMCwyLjAuMCkiLAogIG9yZy5qdW5pdDt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiLAogIG9yZy5qdW5pdC5ydW5uZXI7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVubmVyczt2ZXJzaW9uPSJbNC4xMiw1LjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdDt2ZXJzaW9uPSI0LjExLjgiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0IgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Q7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci50ZXN0IgogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3BvbS54bWwKaW5kZXggMGI3MzAwZS4uYTU1Y2VjZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvdGVzdC9Mb25nT2JqZWN0SWRUZXN0VXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL3Rlc3QvTG9uZ09iamVjdElkVGVzdFV0aWxzLmphdmEKaW5kZXggYzNjMzg1OS4uZTNjNmVmOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvdGVzdC9Mb25nT2JqZWN0SWRUZXN0VXRpbHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy90ZXN0L0xvbmdPYmplY3RJZFRlc3RVdGlscy5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwpAQCAtNjYsNyArNjYsNyBAQCBwdWJsaWMgY2xhc3MgTG9uZ09iamVjdElkVGVzdFV0aWxzIHsKIAkgKi8KIAlwdWJsaWMgc3RhdGljIExvbmdPYmplY3RJZCBoYXNoKFN0cmluZyBzKSB7CiAJCU1lc3NhZ2VEaWdlc3QgbWQgPSBDb25zdGFudHMubmV3TWVzc2FnZURpZ2VzdCgpOwotCQltZC51cGRhdGUocy5nZXRCeXRlcyhVVEZfOCkpOworCQltZC51cGRhdGUocy5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCXJldHVybiBMb25nT2JqZWN0SWQuZnJvbVJhdyhtZC5kaWdlc3QoKSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTEZTUG9pbnRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9MRlNQb2ludGVyVGVzdC5qYXZhCmluZGV4IDE0NmEyNWUuLmExMjgzZGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9MRlNQb2ludGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9MRlNQb2ludGVyVGVzdC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnMubGliOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKQEAgLTY2LDcgKzY2LDcgQEAgcHVibGljIHZvaWQgdGVzdEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWFzc2VydEVxdWFscygKIAkJCQkJInZlcnNpb24gaHR0cHM6Ly9naXQtbGZzLmdpdGh1Yi5jb20vc3BlYy92MVxub2lkIHNoYTI1NjoiCiAJCQkJCQkJKyBzICsgIlxuc2l6ZSA0XG4iLAotCQkJCQliYW9zLnRvU3RyaW5nKFVURl84Lm5hbWUoKSkpOworCQkJCQliYW9zLnRvU3RyaW5nKENIQVJBQ1RFUl9FTkNPRElORykpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA0NGFjODU2Li4zZTFlMjIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMywzMyArMywzNCBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LmxmcwogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5sZnMKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iNC4xMS44IiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5lcnJvcnM7dmVyc2lvbj0iNC4xMS44IiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5pbnRlcm5hbDt2ZXJzaW9uPSI0LjExLjgiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQubGZzLnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzLG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlciIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnMubGliO3ZlcnNpb249IjQuMTEuOCIKK0V4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuZXJyb3JzO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdCxvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXIuZnMsb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5saWI7dmVyc2lvbj0iNS4wLjQiCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAogSW1wb3J0LVBhY2thZ2U6IGNvbS5nb29nbGUuZ3Nvbjt2ZXJzaW9uPSJbMi44LjIsMy4wLjApIiwKICBjb20uZ29vZ2xlLmdzb24uc3RyZWFtO3ZlcnNpb249IlsyLjguMiwzLjAuMCkiLAogIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudDt2ZXJzaW9uPSJbNC4yLjYsNS4wLjApIiwKICBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uO3ZlcnNpb249Ils0LjIuNiw1LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYW5ub3RhdGlvbnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIKKyBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiO3Jlc29sdXRpb246PW9wdGlvbmFsLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5zbGY0ajt2ZXJzaW9uPSJbMS43LjAsMi4wLjApIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3BvbS54bWwKaW5kZXggYmVjMDllZS4uYzIzMTY5MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQubGZzPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmcy5qYXZhCmluZGV4IDQwZDgzNDIuLjRjNDZiYmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzLmphdmEKQEAgLTY1LDE5ICs2NSw2IEBAIHB1YmxpYyBjbGFzcyBMZnMgewogCS8qKgogCSAqIENvbnN0cnVjdG9yIGZvciBMZnMuCiAJICoKLQkgKiBAcGFyYW0gcm9vdAotCSAqICAgICAgICAgICAgdGhlIHBhdGggdG8gdGhlIExGUyBtZWRpYSBkaXJlY3RvcnkuIFdpbGwgYmUKLQkgKiAgICAgICAgICAgIHtAY29kZSAiPHJlcG8+Ly5naXQvbGZzIn0KLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNMZnMoUmVwb3NpdG9yeSl9IGluc3RlYWQuCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgTGZzKFBhdGggcm9vdCkgewotCQl0aGlzLnJvb3QgPSByb290OwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBMZnMuCi0JICoKIAkgKiBAcGFyYW0gZGIKIAkgKiAgICAgICAgICAgIHRoZSBhc3NvY2lhdGVkIHJlcG8KIAkgKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1BvaW50ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9MZnNQb2ludGVyLmphdmEKaW5kZXggMGUzODMwYy4uNGY5NTk0MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1BvaW50ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUG9pbnRlci5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5sZnM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTEzNCw3ICsxMzQsNyBAQCBwdWJsaWMgbG9uZyBnZXRTaXplKCkgewogCSAqLwogCXB1YmxpYyB2b2lkIGVuY29kZShPdXRwdXRTdHJlYW0gb3V0KSB7CiAJCXRyeSAoUHJpbnRTdHJlYW0gcHMgPSBuZXcgUHJpbnRTdHJlYW0ob3V0LCBmYWxzZSwKLQkJCQlVVEZfOC5uYW1lKCkpKSB7CisJCQkJQ0hBUlNFVC5uYW1lKCkpKSB7CiAJCQlwcy5wcmludCgidmVyc2lvbiAiKTsgLy8kTk9OLU5MUy0xJAogCQkJcHMucHJpbnQoVkVSU0lPTiArICJcbiIpOyAvLyROT04tTkxTLTEkCiAJCQlwcy5wcmludCgib2lkICIgKyBIQVNIX0ZVTkNUSU9OX05BTUUgKyAiOiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKQEAgLTE0Myw3ICsxNDMsNyBAQCBwdWJsaWMgdm9pZCBlbmNvZGUoT3V0cHV0U3RyZWFtIG91dCkgewogCQkJcHMucHJpbnQoc2l6ZSArICJcbiIpOyAvLyROT04tTkxTLTEkCiAJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogCQkJLy8gc2hvdWxkIG5vdCBoYXBwZW4sIHdlIGFyZSB1c2luZyBhIHN0YW5kYXJkIGNoYXJzZXQKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24oVVRGXzgubmFtZSgpKTsKKwkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24oQ0hBUlNFVC5uYW1lKCkpOwogCQl9CiAJfQogCkBAIC0xNjUsNyArMTY1LDcgQEAgcHVibGljIHN0YXRpYyBMZnNQb2ludGVyIHBhcnNlTGZzUG9pbnRlcihJbnB1dFN0cmVhbSBpbikKIAkJbG9uZyBzeiA9IC0xOwogCiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBVVEZfOCkpKSB7CisJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBDSEFSU0VUKSkpIHsKIAkJCWZvciAoU3RyaW5nIHMgPSBici5yZWFkTGluZSgpOyBzICE9IG51bGw7IHMgPSBici5yZWFkTGluZSgpKSB7CiAJCQkJaWYgKHMuc3RhcnRzV2l0aCgiIyIpIHx8IHMubGVuZ3RoKCkgPT0gMCkgeyAvLyROT04tTkxTLTEkCiAJCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL0xmc1ByZVB1c2hIb29rLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQppbmRleCA2MTE1ZTM5Li5kZTQ0NDlmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvTGZzUHJlUHVzaEhvb2suamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGZzLlByb3RvY29sLk9QRVJBVElPTl9VUExPQUQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGZzLmludGVybmFsLkxmc0Nvbm5lY3Rpb25GYWN0b3J5LnRvUmVxdWVzdDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5IdHRwQ29ubmVjdGlvbi5IVFRQX09LOwpAQCAtMTc0LDggKzE3NCw4IEBAIHByaXZhdGUgc3RhdGljIExmc1BvaW50ZXIgbG9hZExmc1BvaW50ZXIoT2JqZWN0UmVhZGVyIHIsIEFueU9iamVjdElkIG9iaikKIAogCXByaXZhdGUgdm9pZCBleGNsdWRlUmVtb3RlUmVmcyhPYmplY3RXYWxrIHdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVJlZkRhdGFiYXNlIHJlZkRhdGFiYXNlID0gZ2V0UmVwb3NpdG9yeSgpLmdldFJlZkRhdGFiYXNlKCk7Ci0JCU1hcDxTdHJpbmcsIFJlZj4gcmVtb3RlUmVmcyA9IHJlZkRhdGFiYXNlLmdldFJlZnMocmVtb3RlKCkpOwotCQlmb3IgKFJlZiByIDogcmVtb3RlUmVmcy52YWx1ZXMoKSkgeworCQlMaXN0PFJlZj4gcmVtb3RlUmVmcyA9IHJlZkRhdGFiYXNlLmdldFJlZnNCeVByZWZpeChyZW1vdGUoKSk7CisJCWZvciAoUmVmIHIgOiByZW1vdGVSZWZzKSB7CiAJCQlPYmplY3RJZCBvaWQgPSByLmdldFBlZWxlZE9iamVjdElkKCk7CiAJCQlpZiAob2lkID09IG51bGwpIHsKIAkJCQlvaWQgPSByLmdldE9iamVjdElkKCk7CkBAIC0yMDgsNyArMjA4LDcgQEAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMZnNQb2ludGVyPiByZXF1ZXN0QmF0Y2hVcGxvYWQoSHR0cENvbm5lY3Rpb24gYXBpLAogCQl9CiAJCUdzb24gZ3NvbiA9IFByb3RvY29sLmdzb24oKTsKIAkJYXBpLmdldE91dHB1dFN0cmVhbSgpLndyaXRlKAotCQkJCWdzb24udG9Kc29uKHRvUmVxdWVzdChPUEVSQVRJT05fVVBMT0FELCByZXMpKS5nZXRCeXRlcyhVVEZfOCkpOworCQkJCWdzb24udG9Kc29uKHRvUmVxdWVzdChPUEVSQVRJT05fVVBMT0FELCByZXMpKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWludCByZXNwb25zZUNvZGUgPSBhcGkuZ2V0UmVzcG9uc2VDb2RlKCk7CiAJCWlmIChyZXNwb25zZUNvZGUgIT0gSFRUUF9PSykgewogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL1NtdWRnZUZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL1NtdWRnZUZpbHRlci5qYXZhCmluZGV4IGUyYWIzMDkuLjZiZmYxMmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9TbXVkZ2VGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvU211ZGdlRmlsdGVyLmphdmEKQEAgLTQyLDExICs0MiwxMiBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGZzOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOworCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CiBpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwpAQCAtMTY5LDcgKzE3MCw3IEBAIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxQYXRoPiBkb3dubG9hZExmc1Jlc291cmNlKExmcyBsZnMsIFJlcG9zaXRvcnkgZGIsCiAJCQkJLndyaXRlKGdzb24KIAkJCQkJCS50b0pzb24oTGZzQ29ubmVjdGlvbkZhY3RvcnkKIAkJCQkJCQkJLnRvUmVxdWVzdChQcm90b2NvbC5PUEVSQVRJT05fRE9XTkxPQUQsIHJlcykpCi0JCQkJCQkuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VVEZfOCkpOworCQkJCQkJLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJaW50IHJlc3BvbnNlQ29kZSA9IGxmc1NlcnZlckNvbm4uZ2V0UmVzcG9uc2VDb2RlKCk7CiAJCWlmIChyZXNwb25zZUNvZGUgIT0gSHR0cENvbm5lY3Rpb24uSFRUUF9PSykgewogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2Vycm9ycy9MZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YQppbmRleCA1MzIwYWYwLi5mOTBhMDAzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvZXJyb3JzL0xmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YQpAQCAtNjMsNCArNjMsMTcgQEAgcHVibGljIExmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24oU3RyaW5nIG1zZykgewogCQlzdXBlcihtc2cpOwogCX0KIAorCS8qKgorCSAqIENvbnN0cnVjdG9yIGZvciBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uLgorCSAqCisJICogQHBhcmFtIG1zZworCSAqICAgICAgICAgICAgdGhlIGVycm9yIGRlc2NyaXB0aW9uCisJICogQHBhcmFtIGUKKwkgKiAgICAgICAgICAgIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uKFN0cmluZyBtc2csIEV4Y2VwdGlvbiBlKSB7CisJCXN1cGVyKG1zZywgZSk7CisJfQorCiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvaW50ZXJuYWwvTGZzQ29ubmVjdGlvbkZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCmluZGV4IDVkODI2OGIuLjk1NWVjYTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9pbnRlcm5hbC9MZnNDb25uZWN0aW9uRmFjdG9yeS5qYXZhCkBAIC00NywxMCArNDcsOSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQuSERSX0FDQ0VQVF9FTkNPRElORzsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9DT05URU5UX1RZUEU7CiAKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLm5ldC5Qcm94eVNlbGVjdG9yOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CkBAIC01OCw2ICs1Nyw3IEBACiBpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk5vbk51bGw7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29tbWFuZEZhaWxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5MZnNQb2ludGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLlByb3RvY29sOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGZzLmVycm9ycy5MZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uOwpAQCAtNjYsMjAgKzY2LDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuU3RvcmVkQ29uZmlnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lkh0dHBDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuSHR0cFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZW1vdGVTZXNzaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNzaFNlc3Npb25GYWN0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVSSWlzaDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLkh0dHBDb25uZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLk1lc3NhZ2VXcml0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvLlN0cmVhbUNvcHlUaHJlYWQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlNzaFN1cHBvcnQ7CiAKIC8qKgogICogUHJvdmlkZXMgbWVhbnMgdG8gZ2V0IGEgdmFsaWQgTEZTIGNvbm5lY3Rpb24gZm9yIGEgZ2l2ZW4gcmVwb3NpdG9yeS4KICAqLwogcHVibGljIGNsYXNzIExmc0Nvbm5lY3Rpb25GYWN0b3J5IHsKIAorCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTU0hfQVVUSF9USU1FT1VUX1NFQ09ORFMgPSAzMDsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FX0hUVFBTID0gImh0dHBzIjsgLy8kTk9OLU5MUy0xJAogCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0hFTUVfU1NIID0gInNzaCI7IC8vJE5PTi1OTFMtMSQKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBBdXRoQ2FjaGU+IHNzaEF1dGhDYWNoZSA9IG5ldyBUcmVlTWFwPD4oKTsKQEAgLTEzMyw2ICsxMzAsNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGZzVXJsKFJlcG9zaXRvcnkgZGIsIFN0cmluZyBwdXJwb3NlLAogCQlTdHJpbmcgbGZzVXJsID0gY29uZmlnLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1NFQ1RJT05fTEZTLAogCQkJCW51bGwsCiAJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKTsKKwkJRXhjZXB0aW9uIGV4ID0gbnVsbDsKIAkJaWYgKGxmc1VybCA9PSBudWxsKSB7CiAJCQlTdHJpbmcgcmVtb3RlVXJsID0gbnVsbDsKIAkJCWZvciAoU3RyaW5nIHJlbW90ZSA6IGRiLmdldFJlbW90ZU5hbWVzKCkpIHsKQEAgLTE1MSwzOCArMTQ5LDQ0IEBAIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRMZnNVcmwoUmVwb3NpdG9yeSBkYiwgU3RyaW5nIHB1cnBvc2UsCiAJCQkJYnJlYWs7CiAJCQl9CiAJCQlpZiAobGZzVXJsID09IG51bGwgJiYgcmVtb3RlVXJsICE9IG51bGwpIHsKLQkJCQlsZnNVcmwgPSBkaXNjb3Zlckxmc1VybChkYiwgcHVycG9zZSwgYWRkaXRpb25hbEhlYWRlcnMsCi0JCQkJCQlyZW1vdGVVcmwpOworCQkJCXRyeSB7CisJCQkJCWxmc1VybCA9IGRpc2NvdmVyTGZzVXJsKGRiLCBwdXJwb3NlLCBhZGRpdGlvbmFsSGVhZGVycywKKwkJCQkJCQlyZW1vdGVVcmwpOworCQkJCX0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiB8IElPRXhjZXB0aW9uCisJCQkJCQl8IENvbW1hbmRGYWlsZWRFeGNlcHRpb24gZSkgeworCQkJCQlleCA9IGU7CisJCQkJfQogCQkJfSBlbHNlIHsKIAkJCQlsZnNVcmwgPSBsZnNVcmwgKyBQcm90b2NvbC5JTkZPX0xGU19FTkRQT0lOVDsKIAkJCX0KIAkJfQogCQlpZiAobGZzVXJsID09IG51bGwpIHsKKwkJCWlmIChleCAhPSBudWxsKSB7CisJCQkJdGhyb3cgbmV3IExmc0NvbmZpZ0ludmFsaWRFeGNlcHRpb24oCisJCQkJCQlMZnNUZXh0LmdldCgpLmxmc05vRG93bmxvYWRVcmwsIGV4KTsKKwkJCX0KIAkJCXRocm93IG5ldyBMZnNDb25maWdJbnZhbGlkRXhjZXB0aW9uKExmc1RleHQuZ2V0KCkubGZzTm9Eb3dubG9hZFVybCk7CiAJCX0KIAkJcmV0dXJuIGxmc1VybDsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGlzY292ZXJMZnNVcmwoUmVwb3NpdG9yeSBkYiwgU3RyaW5nIHB1cnBvc2UsCi0JCQlNYXA8U3RyaW5nLCBTdHJpbmc+IGFkZGl0aW9uYWxIZWFkZXJzLCBTdHJpbmcgcmVtb3RlVXJsKSB7Ci0JCXRyeSB7Ci0JCQlVUklpc2ggdSA9IG5ldyBVUklpc2gocmVtb3RlVXJsKTsKLQkJCWlmIChTQ0hFTUVfU1NILmVxdWFscyh1LmdldFNjaGVtZSgpKSkgewotCQkJCVByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGFjdGlvbiA9IGdldFNzaEF1dGhlbnRpY2F0aW9uKAotCQkJCQkJZGIsIHB1cnBvc2UsIHJlbW90ZVVybCwgdSk7Ci0JCQkJYWRkaXRpb25hbEhlYWRlcnMucHV0QWxsKGFjdGlvbi5oZWFkZXIpOwotCQkJCXJldHVybiBhY3Rpb24uaHJlZjsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHJlbW90ZVVybCArIFByb3RvY29sLklORk9fTEZTX0VORFBPSU5UOwotCQkJfQotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIG51bGw7IC8vIGNvdWxkIG5vdCBkaXNjb3ZlcgorCQkJTWFwPFN0cmluZywgU3RyaW5nPiBhZGRpdGlvbmFsSGVhZGVycywgU3RyaW5nIHJlbW90ZVVybCkKKwkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb21tYW5kRmFpbGVkRXhjZXB0aW9uIHsKKwkJVVJJaXNoIHUgPSBuZXcgVVJJaXNoKHJlbW90ZVVybCk7CisJCWlmICh1LmdldFNjaGVtZSgpID09IG51bGwgfHwgU0NIRU1FX1NTSC5lcXVhbHModS5nZXRTY2hlbWUoKSkpIHsKKwkJCVByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGFjdGlvbiA9IGdldFNzaEF1dGhlbnRpY2F0aW9uKGRiLCBwdXJwb3NlLAorCQkJCQlyZW1vdGVVcmwsIHUpOworCQkJYWRkaXRpb25hbEhlYWRlcnMucHV0QWxsKGFjdGlvbi5oZWFkZXIpOworCQkJcmV0dXJuIGFjdGlvbi5ocmVmOworCQl9IGVsc2UgeworCQkJcmV0dXJuIHJlbW90ZVVybCArIFByb3RvY29sLklORk9fTEZTX0VORFBPSU5UOwogCQl9CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgUHJvdG9jb2wuRXhwaXJpbmdBY3Rpb24gZ2V0U3NoQXV0aGVudGljYXRpb24oCiAJCQlSZXBvc2l0b3J5IGRiLCBTdHJpbmcgcHVycG9zZSwgU3RyaW5nIHJlbW90ZVVybCwgVVJJaXNoIHUpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBDb21tYW5kRmFpbGVkRXhjZXB0aW9uIHsKIAkJQXV0aENhY2hlIGNhY2hlZCA9IHNzaEF1dGhDYWNoZS5nZXQocmVtb3RlVXJsKTsKIAkJUHJvdG9jb2wuRXhwaXJpbmdBY3Rpb24gYWN0aW9uID0gbnVsbDsKIAkJaWYgKGNhY2hlZCAhPSBudWxsICYmIGNhY2hlZC52YWxpZFVudGlsID4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpIHsKQEAgLTE5MywxMCArMTk3LDExIEBAIHByaXZhdGUgc3RhdGljIFByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGdldFNzaEF1dGhlbnRpY2F0aW9uKAogCQkJLy8gZGlzY292ZXIgYW5kIGF1dGhlbnRpY2F0ZTsgZ2l0LWxmcyBkb2VzICJzc2gKIAkJCS8vIC1wIDxwb3J0PiAtLSA8aG9zdD4gZ2l0LWxmcy1hdXRoZW50aWNhdGUKIAkJCS8vIDxwcm9qZWN0PiA8dXBsb2FkL2Rvd25sb2FkPiIKLQkJCVN0cmluZyBqc29uID0gcnVuU3NoQ29tbWFuZCh1LnNldFBhdGgoIiIpLCAvLyROT04tTkxTLTEkCi0JCQkJCWRiLmdldEZTKCksCisJCQlTdHJpbmcganNvbiA9IFNzaFN1cHBvcnQucnVuU3NoQ29tbWFuZCh1LnNldFBhdGgoIiIpLCAvLyROT04tTkxTLTEkCisJCQkJCW51bGwsIGRiLmdldEZTKCksCiAJCQkJCSJnaXQtbGZzLWF1dGhlbnRpY2F0ZSAiICsgZXh0cmFjdFByb2plY3ROYW1lKHUpICsgIiAiIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQkJCQkJKyBwdXJwb3NlKTsKKwkJCQkJCQkrIHB1cnBvc2UsCisJCQkJCVNTSF9BVVRIX1RJTUVPVVRfU0VDT05EUyk7CiAKIAkJCWFjdGlvbiA9IFByb3RvY29sLmdzb24oKS5mcm9tSnNvbihqc29uLAogCQkJCQlQcm90b2NvbC5FeHBpcmluZ0FjdGlvbi5jbGFzcyk7CkBAIC0yMzAsOCArMjM1LDEwIEBAIHByaXZhdGUgc3RhdGljIFByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGdldFNzaEF1dGhlbnRpY2F0aW9uKAogCQkJCS5jcmVhdGUoY29udGVudFVybCwgSHR0cFN1cHBvcnQKIAkJCQkJCS5wcm94eUZvcihQcm94eVNlbGVjdG9yLmdldERlZmF1bHQoKSwgY29udGVudFVybCkpOwogCQljb250ZW50U2VydmVyQ29ubi5zZXRSZXF1ZXN0TWV0aG9kKG1ldGhvZCk7Ci0JCWFjdGlvbi5oZWFkZXIKLQkJCQkuZm9yRWFjaCgoaywgdikgLT4gY29udGVudFNlcnZlckNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KGssIHYpKTsKKwkJaWYgKGFjdGlvbi5oZWFkZXIgIT0gbnVsbCkgeworCQkJYWN0aW9uLmhlYWRlci5mb3JFYWNoKAorCQkJCQkoaywgdikgLT4gY29udGVudFNlcnZlckNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KGssIHYpKTsKKwkJfQogCQlpZiAoY29udGVudFVybC5nZXRQcm90b2NvbCgpLmVxdWFscyhTQ0hFTUVfSFRUUFMpCiAJCQkJJiYgIXJlcG8uZ2V0Q29uZmlnKCkuZ2V0Qm9vbGVhbihIdHRwQ29uZmlnLkhUVFAsCiAJCQkJCQlIdHRwQ29uZmlnLlNTTF9WRVJJRllfS0VZLCB0cnVlKSkgewpAQCAtMjQ1LDcgKzI1MiwxMyBAQCBwcml2YXRlIHN0YXRpYyBQcm90b2NvbC5FeHBpcmluZ0FjdGlvbiBnZXRTc2hBdXRoZW50aWNhdGlvbigKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFByb2plY3ROYW1lKFVSSWlzaCB1KSB7Ci0JCVN0cmluZyBwYXRoID0gdS5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpOworCQlTdHJpbmcgcGF0aCA9IHUuZ2V0UGF0aCgpOworCisJCS8vIGJlZ2lucyB3aXRoIGEgc2xhc2ggaWYgdGhlIHVybCBjb250YWlucyBhIHBvcnQgKGdlcnJpdCB2cy4gZ2l0aHViKS4KKwkJaWYgKHBhdGguc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXBhdGggPSBwYXRoLnN1YnN0cmluZygxKTsKKwkJfQorCiAJCWlmIChwYXRoLmVuZHNXaXRoKG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5ET1RfR0lUKSkgewogCQkJcmV0dXJuIHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSA0KTsKIAkJfSBlbHNlIHsKQEAgLTI1Myw0MiArMjY2LDYgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4dHJhY3RQcm9qZWN0TmFtZShVUklpc2ggdSkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJ1blNzaENvbW1hbmQoVVJJaXNoIHNzaFVyaSwgRlMgZnMsIFN0cmluZyBjb21tYW5kKQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJUmVtb3RlU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKLQkJUHJvY2VzcyBwcm9jZXNzID0gbnVsbDsKLQkJU3RyZWFtQ29weVRocmVhZCBlcnJvclRocmVhZCA9IG51bGw7Ci0JCXRyeSAoTWVzc2FnZVdyaXRlciBzdGRlcnIgPSBuZXcgTWVzc2FnZVdyaXRlcigpKSB7Ci0JCQlzZXNzaW9uID0gU3NoU2Vzc2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTZXNzaW9uKHNzaFVyaSwgbnVsbCwKLQkJCQkJZnMsIDVfMDAwKTsKLQkJCXByb2Nlc3MgPSBzZXNzaW9uLmV4ZWMoY29tbWFuZCwgMCk7Ci0JCQllcnJvclRocmVhZCA9IG5ldyBTdHJlYW1Db3B5VGhyZWFkKHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKSwKLQkJCQkJc3RkZXJyLmdldFJhd1N0cmVhbSgpKTsKLQkJCWVycm9yVGhyZWFkLnN0YXJ0KCk7Ci0JCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSwKLQkJCQkJCQlvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVCkpKSB7Ci0JCQkJcmV0dXJuIHJlYWRlci5yZWFkTGluZSgpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkgewotCQkJCXByb2Nlc3MuZGVzdHJveSgpOwotCQkJfQotCQkJaWYgKGVycm9yVGhyZWFkICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQllcnJvclRocmVhZC5oYWx0KCk7Ci0JCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBTdG9wIHdhaXRpbmcgYW5kIHJldHVybiBhbnl3YXkuCi0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJZXJyb3JUaHJlYWQgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzZXNzaW9uICE9IG51bGwpIHsKLQkJCQlTc2hTZXNzaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpLnJlbGVhc2VTZXNzaW9uKHNlc3Npb24pOwotCQkJfQotCQl9Ci0JfQotCiAJLyoqCiAJICogQHBhcmFtIG9wZXJhdGlvbgogCSAqICAgICAgICAgICAgdGhlIG9wZXJhdGlvbiB0byBwZXJmb3JtLCBlLmcuIFByb3RvY29sLk9QRVJBVElPTl9ET1dOTE9BRApAQCAtMzEzLDcgKzI5MCw3IEBAIHB1YmxpYyBzdGF0aWMgUHJvdG9jb2wuUmVxdWVzdCB0b1JlcXVlc3QoU3RyaW5nIG9wZXJhdGlvbiwKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBdXRoQ2FjaGUgewotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFVVEhfQ0FDSEVfRUFHRVJfVElNRU9VVCA9IDEwMDsKKwkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBVVRIX0NBQ0hFX0VBR0VSX1RJTUVPVVQgPSA1MDA7CiAKIAkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2ltcGxlRGF0ZUZvcm1hdCBJU09fRk9STUFUID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoCiAJCQkJInl5eXktTU0tZGQnVCdISDptbTpzcy5TU1NYIik7IC8vJE5PTi1OTFMtMSQKQEAgLTMzMCw4ICszMDcsOSBAQCBwdWJsaWMgQXV0aENhY2hlKFByb3RvY29sLkV4cGlyaW5nQWN0aW9uIGFjdGlvbikgewogCQkJdGhpcy5jYWNoZWRBY3Rpb24gPSBhY3Rpb247CiAJCQl0cnkgewogCQkJCWlmIChhY3Rpb24uZXhwaXJlc0luICE9IG51bGwgJiYgIWFjdGlvbi5leHBpcmVzSW4uaXNFbXB0eSgpKSB7Ci0JCQkJCXRoaXMudmFsaWRVbnRpbCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCi0JCQkJCQkJKyBMb25nLnBhcnNlTG9uZyhhY3Rpb24uZXhwaXJlc0luKTsKKwkJCQkJdGhpcy52YWxpZFVudGlsID0gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpCisJCQkJCQkJKyBMb25nLnBhcnNlTG9uZyhhY3Rpb24uZXhwaXJlc0luKSkKKwkJCQkJCQktIEFVVEhfQ0FDSEVfRUFHRVJfVElNRU9VVDsKIAkJCQl9IGVsc2UgaWYgKGFjdGlvbi5leHBpcmVzQXQgIT0gbnVsbAogCQkJCQkJJiYgIWFjdGlvbi5leHBpcmVzQXQuaXNFbXB0eSgpKSB7CiAJCQkJCXRoaXMudmFsaWRVbnRpbCA9IElTT19GT1JNQVQucGFyc2UoYWN0aW9uLmV4cGlyZXNBdCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQuamF2YQppbmRleCA0NTI5YTI1Li5iZGQxYjM5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0FiYnJldmlhdGVkTG9uZ09iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9BYmJyZXZpYXRlZExvbmdPYmplY3RJZC5qYXZhCkBAIC03OCw3ICs3OCw3IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBBYmJyZXZpYXRlZExvbmdPYmplY3RJZCBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHRlc3QuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgY2FuIGNvbnZlcnRlZCBpbnRvIGFuIEFiYnJldmlhdGVkT2JqZWN0SWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoZmluYWwgU3RyaW5nIGlkKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoU3RyaW5nIGlkKSB7CiAJCWlmIChpZC5sZW5ndGgoKSA8IDIKIAkJCQl8fCBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCA8IGlkLmxlbmd0aCgpKQogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTM4LDcgKzEzOCw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgZnJvbUxvbmdPYmplY3RJZCgKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tLiBNdXN0IGJlICZsdDs9IDY0IGNoYXJhY3RlcnMuCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFiYnJldmlhdGVkTG9uZ09iamVjdElkIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgZnJvbVN0cmluZyhTdHJpbmcgc3RyKSB7CiAJCWlmIChzdHIubGVuZ3RoKCkgPiBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KExmc1RleHQuZ2V0KCkuaW52YWxpZExvbmdJZCwgc3RyKSk7CkBAIC0xNzMsNyArMTczLDcgQEAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBoZXhVSW50NjQoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCwgZmluYWwgaW50IGVuZCkgewogCQlyZXR1cm4gciA8PCAoMTYgLSBuKSAqIDQ7CiAJfQogCi0Jc3RhdGljIGxvbmcgbWFzayhmaW5hbCBpbnQgbmliYmxlcywgZmluYWwgbG9uZyB3b3JkLCBmaW5hbCBsb25nIHYpIHsKKwlzdGF0aWMgbG9uZyBtYXNrKGludCBuaWJibGVzLCBsb25nIHdvcmQsIGxvbmcgdikgewogCQlmaW5hbCBsb25nIGIgPSAod29yZCAtIDEpICogMTY7CiAJCWlmIChiICsgMTYgPD0gbmliYmxlcykgewogCQkJLy8gV2UgaGF2ZSBhbGwgb2YgdGhlIGJpdHMgcmVxdWlyZWQgZm9yIHRoaXMgd29yZC4KQEAgLTI0OSw3ICsyNDksNyBAQCBwdWJsaWMgTG9uZ09iamVjdElkIHRvTG9uZ09iamVjdElkKCkgewogCSAqICAgICAgICAgJmd0OzAgaWYgdGhpcyBhYmJyZXZpYXRpb24gbmFtZXMgYW4gb2JqZWN0IHRoYXQgaXMgYWZ0ZXIKIAkgKiAgICAgICAgIDxjb2RlPm90aGVyPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoZmluYWwgQW55TG9uZ09iamVjdElkIG90aGVyKSB7CisJcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKEFueUxvbmdPYmplY3RJZCBvdGhlcikgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50NjQodzEsIG1hc2soMSwgb3RoZXIudzEpKTsKQEAgLTI4MSw3ICsyODEsNyBAQCBwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoZmluYWwgQW55TG9uZ09iamVjdElkIG90aGVyKSB7CiAJICogICAgICAgICAmZ3Q7MCBpZiB0aGlzIGFiYnJldmlhdGlvbiBuYW1lcyBhbiBvYmplY3QgdGhhdCBpcyBhZnRlcgogCSAqICAgICAgICAgPGNvZGU+b3RoZXI8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGJ5dGVbXSBicywgaW50IHApIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDY0KHcxLCBtYXNrKDEsIE5CLmRlY29kZUludDY0KGJzLCBwKSkpOwpAQCAtMzEzLDcgKzMxMyw3IEBAIHB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CiAJICogICAgICAgICAmZ3Q7MCBpZiB0aGlzIGFiYnJldmlhdGlvbiBuYW1lcyBhbiBvYmplY3QgdGhhdCBpcyBhZnRlcgogCSAqICAgICAgICAgPGNvZGU+b3RoZXI8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBsb25nW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGxvbmdbXSBicywgaW50IHApIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDY0KHcxLCBtYXNrKDEsIGJzW3BdKSk7CkBAIC0zNDAsNyArMzQwLDcgQEAgcHVibGljIGZpbmFsIGludCBnZXRGaXJzdEJ5dGUoKSB7CiAJCXJldHVybiAoaW50KSAodzEgPj4+IDU2KTsKIAl9CiAKLQlwcml2YXRlIGxvbmcgbWFzayhmaW5hbCBsb25nIHdvcmQsIGZpbmFsIGxvbmcgdikgeworCXByaXZhdGUgbG9uZyBtYXNrKGxvbmcgd29yZCwgbG9uZyB2KSB7CiAJCXJldHVybiBtYXNrKG5pYmJsZXMsIHdvcmQsIHYpOwogCX0KIApAQCAtMzUyLDcgKzM1Miw3IEBAIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewogCQlpZiAobyBpbnN0YW5jZW9mIEFiYnJldmlhdGVkTG9uZ09iamVjdElkKSB7CiAJCQlmaW5hbCBBYmJyZXZpYXRlZExvbmdPYmplY3RJZCBiID0gKEFiYnJldmlhdGVkTG9uZ09iamVjdElkKSBvOwogCQkJcmV0dXJuIG5pYmJsZXMgPT0gYi5uaWJibGVzICYmIHcxID09IGIudzEgJiYgdzIgPT0gYi53MgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9BbnlMb25nT2JqZWN0SWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvQW55TG9uZ09iamVjdElkLmphdmEKaW5kZXggOTZkNjkzOC4uMDc4ODkyMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9BbnlMb25nT2JqZWN0SWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0FueUxvbmdPYmplY3RJZC5qYXZhCkBAIC0xNzAsNyArMTcwLDcgQEAgcHVibGljIGZpbmFsIGludCBnZXRCeXRlKGludCBpbmRleCkgewogCSAqIENvbXBhcmUgdGhpcyBMb25nT2JqZWN0SWQgdG8gYW5vdGhlciBhbmQgb2J0YWluIGEgc29ydCBvcmRlcmluZy4KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBBbnlMb25nT2JqZWN0SWQgb3RoZXIpIHsKKwlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhBbnlMb25nT2JqZWN0SWQgb3RoZXIpIHsKIAkJaWYgKHRoaXMgPT0gb3RoZXIpCiAJCQlyZXR1cm4gMDsKIApAQCAtMjAyLDcgKzIwMiw3IEBAIHB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKGZpbmFsIEFueUxvbmdPYmplY3RJZCBvdGhlcikgewogCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhpcyBvYmplY3QgaXMKIAkgKiAgICAgICAgIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oYnl0ZVtdIGJzLCBpbnQgcCkgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50NjQodzEsIE5CLmRlY29kZUludDY0KGJzLCBwKSk7CkBAIC0yMzEsNyArMjMxLDcgQEAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgewogCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhpcyBvYmplY3QgaXMKIAkgKiAgICAgICAgIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBsb25nW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8obG9uZ1tdIGJzLCBpbnQgcCkgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50NjQodzEsIGJzW3BdKTsKQEAgLTI1Nyw3ICsyNTcsNyBAQCBwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBsb25nW10gYnMsIGZpbmFsIGludCBwKSB7CiAJICogQHJldHVybiB0cnVlIGlmIHRoaXMgTG9uZ09iamVjdElkIGJlZ2lucyB3aXRoIHRoZSBhYmJyZXZpYXRpb247IGVsc2UKIAkgKiAgICAgICAgIGZhbHNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoZmluYWwgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgYWJicikgeworCXB1YmxpYyBib29sZWFuIHN0YXJ0c1dpdGgoQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgYWJicikgewogCQlyZXR1cm4gYWJici5wcmVmaXhDb21wYXJlKHRoaXMpID09IDA7CiAJfQogCkBAIC0yNzQsMTMgKzI3NCwxMyBAQCBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewogCSAqICAgICAgICAgICAgdGhlIG90aGVyIGlkIHRvIGNvbXBhcmUgdG8uIE1heSBiZSBudWxsLgogCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIGJvdGggTG9uZ09iamVjdElkcyBoYXZlIGlkZW50aWNhbCBiaXRzLgogCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBBbnlMb25nT2JqZWN0SWQgb3RoZXIpIHsKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoQW55TG9uZ09iamVjdElkIG90aGVyKSB7CiAJCXJldHVybiBvdGhlciAhPSBudWxsID8gZXF1YWxzKHRoaXMsIG90aGVyKSA6IGZhbHNlOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCWlmIChvIGluc3RhbmNlb2YgQW55TG9uZ09iamVjdElkKQogCQkJcmV0dXJuIGVxdWFscygoQW55TG9uZ09iamVjdElkKSBvKTsKIAkJZWxzZQpAQCAtMjkzLDcgKzI5Myw3IEBAIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgewogCSAqIEBwYXJhbSB3CiAJICogICAgICAgICAgICB0aGUgYnVmZmVyIHRvIGNvcHkgdG8uIE11c3QgYmUgaW4gYmlnIGVuZGlhbiBvcmRlci4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgQnl0ZUJ1ZmZlciB3KSB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKEJ5dGVCdWZmZXIgdykgewogCQl3LnB1dExvbmcodzEpOwogCQl3LnB1dExvbmcodzIpOwogCQl3LnB1dExvbmcodzMpOwpAQCAtMzA4LDcgKzMwOCw3IEBAIHB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBCeXRlQnVmZmVyIHcpIHsKIAkgKiBAcGFyYW0gbwogCSAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aXRoaW4gYiB0byB3cml0ZSBhdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvKSB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKGJ5dGVbXSBiLCBpbnQgbykgewogCQlOQi5lbmNvZGVJbnQ2NChiLCBvLCB3MSk7CiAJCU5CLmVuY29kZUludDY0KGIsIG8gKyA4LCB3Mik7CiAJCU5CLmVuY29kZUludDY0KGIsIG8gKyAxNiwgdzMpOwpAQCAtMzIzLDcgKzMyMyw3IEBAIHB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG8pIHsKIAkgKiBAcGFyYW0gbwogCSAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aXRoaW4gYiB0byB3cml0ZSBhdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgbG9uZ1tdIGIsIGZpbmFsIGludCBvKSB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKGxvbmdbXSBiLCBpbnQgbykgewogCQliW29dID0gdzE7CiAJCWJbbyArIDFdID0gdzI7CiAJCWJbbyArIDJdID0gdzM7CkBAIC0zMzgsMTQgKzMzOCwxNCBAQCBwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgbG9uZ1tdIGIsIGZpbmFsIGludCBvKSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSB3cml0aW5nIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgY29weVJhd1RvKE91dHB1dFN0cmVhbSB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZVJhd0xvbmcodywgdzEpOwogCQl3cml0ZVJhd0xvbmcodywgdzIpOwogCQl3cml0ZVJhd0xvbmcodywgdzMpOwogCQl3cml0ZVJhd0xvbmcodywgdzQpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVSYXdMb25nKGZpbmFsIE91dHB1dFN0cmVhbSB3LCBsb25nIHYpCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVJhd0xvbmcoT3V0cHV0U3RyZWFtIHcsIGxvbmcgdikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUoKGludCkgKHYgPj4+IDU2KSk7CiAJCXcud3JpdGUoKGludCkgKHYgPj4+IDQ4KSk7CkBAIC0zNjUsNyArMzY1LDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVJhd0xvbmcoZmluYWwgT3V0cHV0U3RyZWFtIHcsIGxvbmcgdikKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBPdXRwdXRTdHJlYW0gdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUodG9IZXhCeXRlQXJyYXkoKSk7CiAJfQogCkBAIC00MDYsNyArNDA2LDcgQEAgcHVibGljIHZvaWQgY29weVRvKEJ5dGVCdWZmZXIgYikgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBoZXhieXRlID0geyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsCiAJCQknNycsICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnIH07CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEhleEJ5dGUoZmluYWwgYnl0ZVtdIGRzdCwgZmluYWwgaW50IHAsIGxvbmcgdykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0SGV4Qnl0ZShieXRlW10gZHN0LCBpbnQgcCwgbG9uZyB3KSB7CiAJCWludCBvID0gcCArIDE1OwogCQl3aGlsZSAobyA+PSBwICYmIHcgIT0gMCkgewogCQkJZHN0W28tLV0gPSBoZXhieXRlWyhpbnQpICh3ICYgMHhmKV07CkBAIC00MjQsNyArNDI0LDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmb3JtYXRIZXhCeXRlKGZpbmFsIGJ5dGVbXSBkc3QsIGZpbmFsIGludCBwLCBsb25nIHcpIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUodG9IZXhDaGFyQXJyYXkoKSk7CiAJfQogCkBAIC00NDAsNyArNDQwLDcgQEAgcHVibGljIHZvaWQgY29weVRvKGZpbmFsIFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBzdHJlYW0gd3JpdGluZyBmYWlsZWQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVRvKGZpbmFsIGNoYXJbXSB0bXAsIGZpbmFsIFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGNvcHlUbyhjaGFyW10gdG1wLCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdG9IZXhDaGFyQXJyYXkodG1wKTsKIAkJdy53cml0ZSh0bXAsIDAsIENvbnN0YW50cy5MT05HX09CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKTsKIAl9CkBAIC00NTUsNyArNDU1LDcgQEAgcHVibGljIHZvaWQgY29weVRvKGZpbmFsIGNoYXJbXSB0bXAsIGZpbmFsIFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEBwYXJhbSB3CiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGFwcGVuZCBvbnRvLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBjaGFyW10gdG1wLCBmaW5hbCBTdHJpbmdCdWlsZGVyIHcpIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oY2hhcltdIHRtcCwgU3RyaW5nQnVpbGRlciB3KSB7CiAJCXRvSGV4Q2hhckFycmF5KHRtcCk7CiAJCXcuYXBwZW5kKHRtcCwgMCwgQ29uc3RhbnRzLkxPTkdfT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpOwogCX0KQEAgLTQ2Niw3ICs0NjYsNyBAQCBwdWJsaWMgdm9pZCBjb3B5VG8oZmluYWwgY2hhcltdIHRtcCwgZmluYWwgU3RyaW5nQnVpbGRlciB3KSB7CiAJCXJldHVybiBkc3Q7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHRvSGV4Q2hhckFycmF5KGZpbmFsIGNoYXJbXSBkc3QpIHsKKwlwcml2YXRlIHZvaWQgdG9IZXhDaGFyQXJyYXkoY2hhcltdIGRzdCkgewogCQlmb3JtYXRIZXhDaGFyKGRzdCwgMCwgdzEpOwogCQlmb3JtYXRIZXhDaGFyKGRzdCwgMTYsIHcyKTsKIAkJZm9ybWF0SGV4Q2hhcihkc3QsIDMyLCB3Myk7CkBAIC00NzYsNyArNDc2LDcgQEAgcHJpdmF0ZSB2b2lkIHRvSGV4Q2hhckFycmF5KGZpbmFsIGNoYXJbXSBkc3QpIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gaGV4Y2hhciA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLAogCQkJJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJyB9OwogCi0Jc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihmaW5hbCBjaGFyW10gZHN0LCBmaW5hbCBpbnQgcCwgbG9uZyB3KSB7CisJc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihjaGFyW10gZHN0LCBpbnQgcCwgbG9uZyB3KSB7CiAJCWludCBvID0gcCArIDE1OwogCQl3aGlsZSAobyA+PSBwICYmIHcgIT0gMCkgewogCQkJZHN0W28tLV0gPSBoZXhjaGFyWyhpbnQpICh3ICYgMHhmKV07CkBAIC01MjQsNyArNTI0LDcgQEAgcHVibGljIGZpbmFsIFN0cmluZyBnZXROYW1lKCkgewogCSAqICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBhYmJyZXZpYXRlZCBzdHJpbmcuCiAJICogQHJldHVybiBTSEEtMjU2IGFiYnJldmlhdGlvbi4KIAkgKi8KLQlwdWJsaWMgQWJicmV2aWF0ZWRMb25nT2JqZWN0SWQgYWJicmV2aWF0ZShmaW5hbCBpbnQgbGVuKSB7CisJcHVibGljIEFiYnJldmlhdGVkTG9uZ09iamVjdElkIGFiYnJldmlhdGUoaW50IGxlbikgewogCQlmaW5hbCBsb25nIGEgPSBBYmJyZXZpYXRlZExvbmdPYmplY3RJZC5tYXNrKGxlbiwgMSwgdzEpOwogCQlmaW5hbCBsb25nIGIgPSBBYmJyZXZpYXRlZExvbmdPYmplY3RJZC5tYXNrKGxlbiwgMiwgdzIpOwogCQlmaW5hbCBsb25nIGMgPSBBYmJyZXZpYXRlZExvbmdPYmplY3RJZC5tYXNrKGxlbiwgMywgdzMpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9Mb25nT2JqZWN0SWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTG9uZ09iamVjdElkLmphdmEKaW5kZXggZWMxZTE3OS4uODE1OTU3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9Mb25nT2JqZWN0SWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy9zcmMvb3JnL2VjbGlwc2UvamdpdC9sZnMvbGliL0xvbmdPYmplY3RJZC5qYXZhCkBAIC05MCw3ICs5MCw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIHplcm9JZCgpIHsKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmluZyBjYW4gY29udmVydGVkIGludG8gYW4gTG9uZ09iamVjdElkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0lkKGZpbmFsIFN0cmluZyBpZCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0lkKFN0cmluZyBpZCkgewogCQlpZiAoaWQubGVuZ3RoKCkgIT0gQ29uc3RhbnRzLkxPTkdfT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXRyeSB7CkBAIC0xMTAsNyArMTEwLDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzSWQoZmluYWwgU3RyaW5nIGlkKSB7CiAJICogICAgICAgICAgICB0aGUgaWQgdG8gY29udmVydC4gTWF5IGJlIG51bGwuCiAJICogQHJldHVybiB0aGUgaGV4IHN0cmluZyBjb252ZXJzaW9uIG9mIHRoaXMgaWQncyBjb250ZW50LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKGZpbmFsIExvbmdPYmplY3RJZCBpKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoTG9uZ09iamVjdElkIGkpIHsKIAkJcmV0dXJuIGkgIT0gbnVsbCA/IGkubmFtZSgpIDogWkVST0lEX1NUUjsKIAl9CiAKQEAgLTE3Myw3ICsxNzMsNyBAQCBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGJ5dGVbXSBmaXJzdEJ1ZmZlciwgZmluYWwgaW50IGZpLAogCSAqICAgICAgICAgICAgYXZhaWxhYmxlIHdpdGhpbiB0aGlzIGJ5dGUgYXJyYXkuCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21SYXcoYnl0ZVtdIGJzKSB7CiAJCXJldHVybiBmcm9tUmF3KGJzLCAwKTsKIAl9CiAKQEAgLTE4Nyw3ICsxODcsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicykgewogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiBkYXRhIGZyb20uCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGJ5dGVbXSBicywgaW50IHApIHsKIAkJZmluYWwgbG9uZyBhID0gTkIuZGVjb2RlSW50NjQoYnMsIHApOwogCQlmaW5hbCBsb25nIGIgPSBOQi5kZWNvZGVJbnQ2NChicywgcCArIDgpOwogCQlmaW5hbCBsb25nIGMgPSBOQi5kZWNvZGVJbnQ2NChicywgcCArIDE2KTsKQEAgLTIwMyw3ICsyMDMsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicywgZmluYWwgaW50IHApIHsKIAkgKiAgICAgICAgICAgIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBsb25nIGFycmF5LgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBsb25nW10gaXMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGxvbmdbXSBpcykgewogCQlyZXR1cm4gZnJvbVJhdyhpcywgMCk7CiAJfQogCkBAIC0yMTcsNyArMjE3LDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBsb25nW10gaXMpIHsKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGxvbmcgb2YgZGF0YSBmcm9tLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBsb25nW10gaXMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVJhdyhsb25nW10gaXMsIGludCBwKSB7CiAJCXJldHVybiBuZXcgTG9uZ09iamVjdElkKGlzW3BdLCBpc1twICsgMV0sIGlzW3AgKyAyXSwgaXNbcCArIDNdKTsKIAl9CiAKQEAgLTIzMSw3ICsyMzEsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGxvbmdbXSBpcywgZmluYWwgaW50IHApIHsKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGNoYXJhY3RlciBmcm9tLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVN0cmluZyhmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBMb25nT2JqZWN0SWQgZnJvbVN0cmluZyhieXRlW10gYnVmLCBpbnQgb2Zmc2V0KSB7CiAJCXJldHVybiBmcm9tSGV4U3RyaW5nKGJ1Ziwgb2Zmc2V0KTsKIAl9CiAKQEAgLTI0MiwxNCArMjQyLDE0IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21TdHJpbmcoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IG9mZnNldCkKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tLiBNdXN0IGJlIDY0IGNoYXJhY3RlcnMgbG9uZy4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgTG9uZ09iamVjdElkIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHN0cikgeworCXB1YmxpYyBzdGF0aWMgTG9uZ09iamVjdElkIGZyb21TdHJpbmcoU3RyaW5nIHN0cikgewogCQlpZiAoc3RyLmxlbmd0aCgpICE9IENvbnN0YW50cy5MT05HX09CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKQogCQkJdGhyb3cgbmV3IEludmFsaWRMb25nT2JqZWN0SWRFeGNlcHRpb24oc3RyKTsKIAkJcmV0dXJuIGZyb21IZXhTdHJpbmcob3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLmVuY29kZUFTQ0lJKHN0ciksCiAJCQkJMCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21IZXhTdHJpbmcoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCkgeworCXByaXZhdGUgc3RhdGljIGZpbmFsIExvbmdPYmplY3RJZCBmcm9tSGV4U3RyaW5nKGJ5dGVbXSBicywgaW50IHApIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIGxvbmcgYSA9IFJhd1BhcnNlVXRpbHMucGFyc2VIZXhJbnQ2NChicywgcCk7CiAJCQlmaW5hbCBsb25nIGIgPSBSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50NjQoYnMsIHAgKyAxNik7CkBAIC0yODAsNyArMjgwLDcgQEAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9uZ09iamVjdElkIGZyb21IZXhTdHJpbmcoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCkgewogCSAqIEBwYXJhbSBzcmMKIAkgKiAgICAgICAgICAgIGFub3RoZXIgYWxyZWFkeSBwYXJzZWQgTG9uZ09iamVjdElkIHRvIGNvcHkgdGhlIHZhbHVlIG91dCBvZi4KIAkgKi8KLQlwcm90ZWN0ZWQgTG9uZ09iamVjdElkKGZpbmFsIEFueUxvbmdPYmplY3RJZCBzcmMpIHsKKwlwcm90ZWN0ZWQgTG9uZ09iamVjdElkKEFueUxvbmdPYmplY3RJZCBzcmMpIHsKIAkJdzEgPSBzcmMudzE7CiAJCXcyID0gc3JjLncyOwogCQl3MyA9IHNyYy53MzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQubGZzL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xmcy9saWIvTXV0YWJsZUxvbmdPYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9NdXRhYmxlTG9uZ09iamVjdElkLmphdmEKaW5kZXggN2IwYzQ5NC4uM2Q2MjQ5MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9NdXRhYmxlTG9uZ09iamVjdElkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5sZnMvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGZzL2xpYi9NdXRhYmxlTG9uZ09iamVjdElkLmphdmEKQEAgLTE2Nyw3ICsxNjcsNyBAQCBwdWJsaWMgdm9pZCBmcm9tT2JqZWN0SWQoQW55TG9uZ09iamVjdElkIHNyYykgewogCSAqICAgICAgICAgICAgdGhlIHJhdyBieXRlIGJ1ZmZlciB0byByZWFkIGZyb20uIEF0IGxlYXN0IDMyIGJ5dGVzIG11c3QgYmUKIAkgKiAgICAgICAgICAgIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBieXRlIGFycmF5LgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzKSB7CisJcHVibGljIHZvaWQgZnJvbVJhdyhieXRlW10gYnMpIHsKIAkJZnJvbVJhdyhicywgMCk7CiAJfQogCkBAIC0xODAsNyArMTgwLDcgQEAgcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMpIHsKIAkgKiBAcGFyYW0gcAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgYnl0ZSBvZiBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIHZvaWQgZnJvbVJhdyhieXRlW10gYnMsIGludCBwKSB7CiAJCXcxID0gTkIuZGVjb2RlSW50NjQoYnMsIHApOwogCQl3MiA9IE5CLmRlY29kZUludDY0KGJzLCBwICsgOCk7CiAJCXczID0gTkIuZGVjb2RlSW50NjQoYnMsIHAgKyAxNik7CkBAIC0xOTQsNyArMTk0LDcgQEAgcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CiAJICogICAgICAgICAgICB0aGUgcmF3IGxvbmcgYnVmZmVyIHRvIHJlYWQgZnJvbS4gQXQgbGVhc3QgNCBsb25ncyBtdXN0IGJlCiAJICogICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHRoaXMgbG9uZ3MgYXJyYXkuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBsb25nW10gbG9uZ3MpIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGxvbmdbXSBsb25ncykgewogCQlmcm9tUmF3KGxvbmdzLCAwKTsKIAl9CiAKQEAgLTIwNyw3ICsyMDcsNyBAQCBwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGxvbmdbXSBsb25ncykgewogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBpbnRlZ2VyIG9mIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGxvbmdbXSBsb25ncywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGxvbmdbXSBsb25ncywgaW50IHApIHsKIAkJdzEgPSBsb25nc1twXTsKIAkJdzIgPSBsb25nc1twICsgMV07CiAJCXczID0gbG9uZ3NbcCArIDJdOwpAQCAtMjIzLDcgKzIyMyw3IEBAIHB1YmxpYyB2b2lkIGZyb21SYXcoZmluYWwgbG9uZ1tdIGxvbmdzLCBmaW5hbCBpbnQgcCkgewogCSAqIEBwYXJhbSBvZmZzZXQKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGNoYXJhY3RlciBmcm9tLgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21TdHJpbmcoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IG9mZnNldCkgeworCXB1YmxpYyB2b2lkIGZyb21TdHJpbmcoYnl0ZVtdIGJ1ZiwgaW50IG9mZnNldCkgewogCQlmcm9tSGV4U3RyaW5nKGJ1Ziwgb2Zmc2V0KTsKIAl9CiAKQEAgLTIzMywxNCArMjMzLDE0IEBAIHB1YmxpYyB2b2lkIGZyb21TdHJpbmcoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IG9mZnNldCkgewogCSAqIEBwYXJhbSBzdHIKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tLiBNdXN0IGJlIDY0IGNoYXJhY3RlcnMgbG9uZy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyBzdHIpIHsKKwlwdWJsaWMgdm9pZCBmcm9tU3RyaW5nKFN0cmluZyBzdHIpIHsKIAkJaWYgKHN0ci5sZW5ndGgoKSAhPSBDb25zdGFudHMuTE9OR19PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KExmc1RleHQuZ2V0KCkuaW52YWxpZExvbmdJZCwgc3RyKSk7CiAJCWZyb21IZXhTdHJpbmcob3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLmVuY29kZUFTQ0lJKHN0ciksIDApOwogCX0KIAotCXByaXZhdGUgdm9pZCBmcm9tSGV4U3RyaW5nKGZpbmFsIGJ5dGVbXSBicywgaW50IHApIHsKKwlwcml2YXRlIHZvaWQgZnJvbUhleFN0cmluZyhieXRlW10gYnMsIGludCBwKSB7CiAJCXRyeSB7CiAJCQl3MSA9IFJhd1BhcnNlVXRpbHMucGFyc2VIZXhJbnQ2NChicywgcCk7CiAJCQl3MiA9IFJhd1BhcnNlVXRpbHMucGFyc2VIZXhJbnQ2NChicywgcCArIDE2KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IDM2OWUzMDcuLjE2OWVmN2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMzUsMTI1ICszNSwxNDMgQEAKICMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgogbGljZW5zZT1cCiBFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDksIDIwMTRcblwKK1xuXAorTm92ZW1iZXIgMjIsIDIwMTdcblwKIFxuXAogVXNhZ2UgT2YgQ29udGVudFxuXAogXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTlxuXAorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0ZcblwKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRFxuXAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFXG5cCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWVxuXAorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1VcblwKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAogXG5cCiBBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCiBcblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZVxuXAorVmVyc2lvbiAyLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc29cblwKK2F2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLFxuXAorIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKIFxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb25cblwKK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeVxuXAorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXNcblwKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAogXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZVxuXAorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heVxuXAorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmRcblwKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSXG5cCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZFxuXAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGFcblwKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXlcblwKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yXG5cCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhXG5cCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZFxuXAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKIFxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpblxuXAorZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXNcblwKK2FuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiXG5cCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueVxuXAorZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmdcblwKK2xvY2F0aW9uczpcblwKIFxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorLSAgIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorLSAgIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCistICAgSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAorLSAgIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKy0gICBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCiBcblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmdcblwKK3RoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZVxuXAorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmVcblwKK2NvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3VcblwKK3doZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiXG5cCitwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoXG5cCitBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2ZcblwKK3RoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCiBcblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMXG5cCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0VcblwKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCiBcblwKLSAgICAgICAtIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbClcblwKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKIFxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUT1xuXAorVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzXG5cCitwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAogXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK1VzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAogXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaFxuXAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyXG5cCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGxcblwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHlcblwKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nXG5cCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uXG5cCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCiBodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAogXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsXG5cCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZVxuXAorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZFxuXAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZVxuXAorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0XG5cCithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZVxuXAorZm9sbG93aW5nOlxuXAogXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5XG5cCisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZVxuXAorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW5cblwKKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZFxuXAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG9cblwKKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZVxuXAorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaFxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlXG5cCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZVxuXAorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZVxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAogXG5cCiBDcnlwdG9ncmFwaHlcblwKIFxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseVxuXAorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG9cblwKK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLFxuXAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCxcblwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpc1xuXAorcGVybWl0dGVkLlxuXAogXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGVcblwKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggYzVlMzE0MS4uZDA5ODUyYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2UuamdpdCIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI0LjExLjgucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZS9saWNlbnNlLmh0bWwKaW5kZXggOTVhZDk1ZS4uMDA4YjgwMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0xLDEwNiArMSwxODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCA5LCAyMDE0PC9wPgorCTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCTxwPk5vdmVtYmVyIDIyLCAyMDE3PC9wPgogCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisJPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisJPHA+CisJCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisJCUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUKKwkJRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgorCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCisJPC9wPgogCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKwk8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKKwkJY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlCisJCW1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUKKwkJYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhmSBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0bworCQkJZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwKKwkJCW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbgorCQkJZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMKKwkJCSgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwkJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5CisJCQlvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkCisJCQkmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yCisJCQlGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYQorCQkJc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gV2l0aGluIGEKKwkJCUZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZgorCQkJdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMKKwkJCWFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwkJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkCisJCQlGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkCisJCQkmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uCisJCQludW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+CisJPC91bD4KIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKwk8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCisJCWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7CisJCSgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorCQlJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkCisJCSZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQKKwkJRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IKKwkJTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCTxwPgorCQlUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzCisJCW9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUKKwkJTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZgorCQlhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKwkJb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzCisJCWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKwkJaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQKKwkJcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKwkJKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLgorCTwvcD4KIAotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8KKwkJaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZworCQl0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCXRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGgKKwkJdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlCisJCWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KIAotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKKwkJeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZAorCQl1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLgorCQlCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsCisJCXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwKKwkJYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgogCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwk8cD4KKwkJPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YKKwkJCU9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlL3BvbS54bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvcG9tLnhtbAppbmRleCAxY2M2Y2ViLi5hOWE1OGFmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmUvcG9tLnhtbApAQCAtNTAsNyArNTAsNyBAQAogICA8cGFyZW50PgogICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQ8L2dyb3VwSWQ+CiAgICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDx2ZXJzaW9uPjUuMC40LVNOQVBTSE9UPC92ZXJzaW9uPgogICA8L3BhcmVudD4KIAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0LmZlYXR1cmU8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCBiOWI1Y2NlLi40ODBlOWMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTM1LDEyNSArMzUsMTQzIEBACiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAogRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCA5LCAyMDE0XG5cCitcblwKK05vdmVtYmVyIDIyLCAyMDE3XG5cCiBcblwKIFVzYWdlIE9mIENvbnRlbnRcblwKIFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT05cblwKK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GXG5cCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORURcblwKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRVxuXAorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTllcblwKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VXG5cCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2VcblwKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvXG5cCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCxcblwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uXG5cCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnlcblwKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzXG5cCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKIFxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGVcblwKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXlcblwKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kXG5cCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUlxuXAorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmRcblwKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhXG5cCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5XG5cCisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vclxuXAorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYVxuXAorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmRcblwKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCiBcblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW5cblwKK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzXG5cCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIlxuXAorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnlcblwKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nXG5cCitsb2NhdGlvbnM6XG5cCiBcblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCistICAgRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAogXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nXG5cCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2VcblwKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlXG5cCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91XG5cCit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIlxuXAorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaFxuXAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mXG5cCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTFxuXAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFXG5cCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KKyMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDBlZGFlMWUuLjQ4NWZkNmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNC4xMS44LnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjUuMC40LnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmh0dHAuYXBhY2hlLmZlYXR1cmUvbGljZW5zZS5odG1sCmluZGV4IDk1YWQ5NWUuLjAwOGI4MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMSwxMDYgKzEsMTg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgogPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgOSwgMjAxNDwvcD4KKwk8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKwk8cD5Ob3ZlbWJlciAyMiwgMjAxNzwvcD4KIAotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KIAotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisJPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sCisJCUlORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisJCShDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWQorCQlUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCisJCUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCisJCUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKKwkJQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorCQlBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QKKwkJVVNFIFRIRSBDT05URU5ULjwvcD4KIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCTxwPgorCQlVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorCQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlCisJCUVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KKwkJRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LgorCTwvcD4KIAotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+CisJPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0CisJCWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZQorCQltb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlCisJCWFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YZkgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisJPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorCQliZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OworCQkoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKKwkJSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZAorCQkmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kCisJCUZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yCisJCU1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YKKwkJCWNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+CisJPC91bD4KIAotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KKwk8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcworCQlpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91CisJCW11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcKKwkJdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywKKwkJdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcworCQlhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91CisJCWNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZQorCQkmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkCisJCSZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoIEFib3V0cywKKwkJRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorCQljb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuCisJCXlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgogCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisJPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQorCQlSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKKwkJQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAorCQlBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPikKKwkJPC9saT4KKwkJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KQorCQk8L2xpPgorCTwvdWw+CiAKLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKwk8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAorCQlDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwKKwkJb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAorCQlwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgogCiAKLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgogCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKwk8cD4KKwkJVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcworCQlvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlCisJCU1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YKKwkJYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisJCW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcworCQljYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisJCWluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0CisJCXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisJCSgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS4KKwk8L3A+CiAKLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKwk8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvCisJCWluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcKKwkJdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQl0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoCisJCXRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZQorCQlhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CiAKLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgorCTxvbD4KKwkJPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcKKwkJCVByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nCisJCQlUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudAorCQkJb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisJCQlFY2xpcHNlLWJhc2VkIHByb2R1Y3QuPC9saT4KKwkJPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorCQkJbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisJCQlhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorCQk8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIKKwkJCXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2gKKwkJCUluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKwkJCU1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisJCQl0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5CisJCQl0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJCUFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKwkJCXByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUuPC9saT4KKwk8L29sPgogCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKwk8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KIAotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKwk8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCisJCXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQKKwkJdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4KKwkJQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLAorCQlyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsCisJCWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KIAotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJPHA+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuaHR0cC5hcGFjaGUuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL3BvbS54bWwKaW5kZXggODhjYzBkZC4uZDE0OGFjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5odHRwLmFwYWNoZS5mZWF0dXJlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKaW5kZXggNDQ1MGJiYi4uMjkxYjI5ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCkBAIC0zNiwxMjUgKzM2LDE0MyBAQAogIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCiBsaWNlbnNlPVwKIEVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudFxuXAotQXByaWwgOSwgMjAxNFxuXAorXG5cCitOb3ZlbWJlciAyMiwgMjAxN1xuXAogXG5cCiBVc2FnZSBPZiBDb250ZW50XG5cCiBcblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAorVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OXG5cCitBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRlxuXAorVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCitCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEXG5cCitCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0VcblwKK0FHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKK1RFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZXG5cCitBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVVxuXAorTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCiBcblwKIEFwcGxpY2FibGUgTGljZW5zZXNcblwKIFxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZVxuXAotRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2ZcblwKLXRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzXG5cCi1wcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKK1VubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCitpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlXG5cCitWZXJzaW9uIDIuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzb1xuXAorYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsXG5cCisiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAogXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZVxuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCitDb250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvblxuXAorYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5XG5cCisoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhc1xuXAorZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCiBcblwKLSAgICAgICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgICAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhKFRNKSBBUmNoaXZlKVxuXAotICAgICAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgICAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAgICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAorLSAgIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlXG5cCisgICAgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5XG5cCisgICAgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZFxuXAorICAgIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKKy0gICBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVJcblwKKyAgICAoSmF2YeKEoiBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCistICAgQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kXG5cCisgICAgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYVxuXAorICAgIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heVxuXAorICAgIGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3JcblwKKyAgICBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKKy0gICBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGFcblwKKyAgICBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kXG5cCisgICAgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAogXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKK1RoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluXG5cCitmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlc1xuXAorYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCJcblwKKygiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55XG5cCitkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZ1xuXAorbG9jYXRpb25zOlxuXAogXG5cCi0gICAgICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgICAgICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAgICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAgICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAgICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCistICAgVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCistICAgUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKKy0gICBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCistICAgU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAorLSAgIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKIFxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFxuXAotVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuXG5cCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlXG5cCi10ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0XG5cCi1nb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKK05vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZ1xuXAordGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlXG5cCisoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZVxuXAorY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKK3dpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdVxuXAord2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSJcblwKK3Byb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2hcblwKK0Fib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZlxuXAordGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKIFxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCitUSEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUExcblwKK09SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRVxuXAorT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKIFxuXAotICAgICAgIC0gRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKLSAgICAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAorLSAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sKVxuXAorLSAgIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbClcblwKKy0gICBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCistICAgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAogXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCitJVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPXG5cCitVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXNcblwKK3Byb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZFxuXAorY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCiBcblwKLVxuXFVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAorVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCiBcblwKLVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSxcblwKLWJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yXG5cCi10aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3JcblwKLW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aFxuXAotdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuXG5cCi1JbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCitUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoXG5cCitpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXJcblwKKygiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbFxuXAorc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseVxuXAorIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmdcblwKK3N1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb25cblwKK2Fib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKIGh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwgKCJTcGVjaWZpY2F0aW9uIikuXG5cCiBcblwKLVlvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKLVlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZVxuXAotSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKLWluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmRcblwKLW1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCi1hZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6XG5cCitZb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGxcblwKK0luc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlXG5cCitsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kXG5cCithY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlXG5cCitTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXRcblwKK2F2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKK2FncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlXG5cCitmb2xsb3dpbmc6XG5cCiBcblwKLSAgICAgICAxLiBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlXG5cCi0gICAgICAgICAgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsXG5cCi0gICAgICAgICAgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKLSAgICAgICAyLiBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5XG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCi0gICAgICAgMy4gUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXRcblwKLSAgICAgICAgICBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaFxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlXG5cCi0gICAgICAgICAgd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlXG5cCi0gICAgICAgICAgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieVxuXAotICAgICAgICAgIHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaFxuXAotICAgICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb25cblwKLSAgICAgICAgICBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCisxLiAgQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXlcblwKKyAgICBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlXG5cCisgICAgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhblxuXAorICAgIEVjbGlwc2UtYmFzZWQgcHJvZHVjdC5cblwKKzIuICBEdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkXG5cCisgICAgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUgYWNjZXNzZWQgYW5kIGNvcGllZCB0b1xuXAorICAgIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKKzMuICBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlXG5cCisgICAgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2VcblwKKyAgICBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlXG5cCisgICAgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlXG5cCisgICAgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCiBcblwKIENyeXB0b2dyYXBoeVxuXAogXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmRcblwKLXJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCitDb250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5XG5cCittYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0b1xuXAorYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsXG5cCitwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LFxuXAorcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzXG5cCitwZXJtaXR0ZWQuXG5cCiBcblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK0phdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZVxuXAorVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCisjIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBjOGUxYTQyLi42NTUxMzMwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0IgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjQuMTEuOC5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvbGljZW5zZS5odG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5mZWF0dXJlL2xpY2Vuc2UuaHRtbAppbmRleCA5NWFkOTVlLi4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9saWNlbnNlLmh0bWwKQEAgLTEsMTA2ICsxLDE4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KIDwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci0KKzxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KKzxoZWFkPgorPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIgLz4KIDx0aXRsZT5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgogPC9oZWFkPgogCiA8Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPkFwcmlsIDksIDIwMTQ8L3A+CisJPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+CisJPHA+Tm92ZW1iZXIgMjIsIDIwMTc8L3A+CiAKLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KKwk8aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CiAKLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgorCTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLAorCQlJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUworCQkoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkKKwkJVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUworCQlHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWQorCQlBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTCisJCUFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UKKwkJQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UCisJCVVTRSBUSEUgQ09OVEVOVC48L3A+CiAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KKwk8aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CiAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgiRVBMIikuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KKwk8cD4KKwkJVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKKwkJRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gQSBjb3B5IG9mIHRoZQorCQlFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvYT4uCisJCUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC4KKwk8L3A+CiAKLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUKLSAgIHJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9wPgorCTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdAorCQljb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gc29mdHdhcmUKKwkJbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZQorCQlhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS48L2xpPgotICAgICAgIDxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmGZIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi48L2xpPgotICAgICAgIDxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotICAgICAgIDxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvCisJCQlmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbAorCQkJbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluCisJCQlmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcworCQkJKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgorCQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkKKwkJCW9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQKKwkJCSZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KKwkJPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IKKwkJCUZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhCisJCQlzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiBXaXRoaW4gYQorCQkJRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mCisJCQl0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cworCQkJYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgorCQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQKKwkJCUZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQKKwkJCSZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24KKwkJCW51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KKwk8L3VsPgogCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgorCTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQKKwkJYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsKKwkJKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCisJCUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQKKwkJJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gQWJvdXRzIGFuZAorCQlGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvcgorCQlNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0gICAgICAgPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLSAgICAgICA8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0gICAgICAgPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotICAgICAgIDxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KKwkJPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KKwkJPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgorCQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mCisJCQljZXJ0YWluIFBsdWctaW5zPC9saT4KKwkJPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgorCTwvdWw+CiAKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+CisJPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMKKwkJaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdQorCQltdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nCisJCXRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsCisJCXRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMKKwkJYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdQorCQljYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUKKwkJJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZAorCQkmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaCBBYm91dHMsCisJCUZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQKKwkJY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybgorCQl5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LjwvcD4KIAotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgorCTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkKKwkJUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5ECisJCUNPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQKKwkJQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLSAgICAgICA8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pCisJCTwvbGk+CisJCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPikKKwkJPC9saT4KKwk8L3VsPgogCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+CisJPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsCisJCW9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlCisJCUZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQKKwkJcGFydGljdWxhciBDb250ZW50LjwvcD4KIAogCi08aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KKwk8aDM+VXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5PC9oMz4KIAotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UKLSAgIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3IgdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCi0gICBvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCi0gICBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+Ci0gICAoIlNwZWNpZmljYXRpb24iKS48L3A+CisJPHA+CisJCVRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMKKwkJb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZQorCQlNYW5hZ2VyICgmcXVvdDtQcm92aXNpb25pbmcgVGVjaG5vbG9neSZxdW90OykgZm9yIHRoZSBwdXJwb3NlIG9mCisJCWFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgorCQlvdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSZxdW90OykuIFRoaXMKKwkJY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bworCQlpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvbiBhYm91dAorCQlwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgorCQkoJnF1b3Q7U3BlY2lmaWNhdGlvbiZxdW90OykuCisJPC9wPgogCi08cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlCi0gICBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlCi0gICBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CisJPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0bworCQlpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nCisJCXRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJdG8gYmUgcHJlc2VudGVkIHRvLCBhbmQgYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aAorCQl0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUKKwkJYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgogCi08b2w+Ci0gICAgICAgPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICAgICAgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEVjbGlwc2UtYmFzZWQKLSAgICAgICBwcm9kdWN0LjwvbGk+Ci0gICAgICAgPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKLSAgICAgICBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgotICAgICAgIDxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKLSAgICAgICBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKLSAgICAgICBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuCi0gICAgICAgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieSB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2gKLSAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS48L2xpPgotPC9vbD4KKwk8b2w+CisJCTxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoJnF1b3Q7UHJvdmlzaW9uaW5nCisJCQlQcm9jZXNzJnF1b3Q7KSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZworCQkJVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCZxdW90O1RhcmdldCBNYWNoaW5lJnF1b3Q7KSB3aXRoIHRoZSBpbnRlbnQKKwkJCW9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbgorCQkJRWNsaXBzZS1iYXNlZCBwcm9kdWN0LjwvbGk+CisJCTxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKKwkJCW1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQorCQkJYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KKwkJPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyCisJCQl0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlICgmcXVvdDtJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQmcXVvdDspIGFuZCBzdWNoCisJCQlJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0CisJCQlNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaCBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworCQkJdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZSBieQorCQkJdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCQlBZ3JlZW1lbnQuIFVwb24gc3VjaCBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlCisJCQlwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlLjwvbGk+CisJPC9vbD4KIAotPGgzPkNyeXB0b2dyYXBoeTwvaDM+CisJPGgzPkNyeXB0b2dyYXBoeTwvaDM+CiAKLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CisJPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaAorCQl5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kCisJCXVzZSwgYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuCisJCUJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywKKwkJcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLAorCQlhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+CiAKLTxwPjxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+PC9wPgotCi0KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorCTxwPgorCQk8c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZgorCQkJT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4KKwk8L3A+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9wb20ueG1sCmluZGV4IDc1ODY1NzAuLmY2NTMyNmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuanVuaXQuZmVhdHVyZS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKaW5kZXggYzViZmZhOC4uODM4NzU4NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTM1LDEyNSArMzUsMTQzIEBACiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAogRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCA5LCAyMDE0XG5cCitcblwKK05vdmVtYmVyIDIyLCAyMDE3XG5cCiBcblwKIFVzYWdlIE9mIENvbnRlbnRcblwKIFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT05cblwKK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GXG5cCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORURcblwKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRVxuXAorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTllcblwKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VXG5cCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2VcblwKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvXG5cCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCxcblwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uXG5cCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnlcblwKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzXG5cCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKIFxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGVcblwKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXlcblwKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kXG5cCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUlxuXAorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmRcblwKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhXG5cCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5XG5cCisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vclxuXAorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYVxuXAorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmRcblwKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCiBcblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW5cblwKK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzXG5cCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIlxuXAorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnlcblwKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nXG5cCitsb2NhdGlvbnM6XG5cCiBcblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCistICAgRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAogXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nXG5cCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2VcblwKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlXG5cCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91XG5cCit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIlxuXAorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaFxuXAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mXG5cCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTFxuXAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFXG5cCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KICMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggNzhhMmU4OS4uNzJlMTVkYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0LmxmcyIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI0LjExLjgucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAppbmRleCA5NWFkOTVlLi4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL2xpY2Vuc2UuaHRtbApAQCAtMSwxMDYgKzEsMTg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIiA/PgogPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLQorPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIiAvPgogPHRpdGxlPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+CiA8L2hlYWQ+CiAKIDxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+QXByaWwgOSwgMjAxNDwvcD4KKwk8aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KKwk8cD5Ob3ZlbWJlciAyMiwgMjAxNzwvcD4KIAotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgorCTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KIAotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICJDT05URU5UIikuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+CisJPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sCisJCUlORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCisJCShDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWQorCQlUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKKwkJQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTCisJCUdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZCisJCUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQKKwkJQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMKKwkJQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRQorCQlBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QKKwkJVVNFIFRIRSBDT05URU5ULjwvcD4KIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgorCTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4KIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCJFUEwiKS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgorCTxwPgorCQlVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorCQlFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMi4wICgmcXVvdDtFUEwmcXVvdDspLiBBIGNvcHkgb2YgdGhlCisJCUVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC9hPi4KKwkJRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LgorCTwvcD4KIAotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBzb3VyY2UgY29kZQotICAgcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBzb2Z0d2FyZSBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L3A+CisJPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0CisJCWNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiBzb3VyY2UgY29kZSByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBzb2Z0d2FyZQorCQltb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlCisJCWFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLjwvbGk+Ci0gICAgICAgPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YZkgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLjwvbGk+Ci0gICAgICAgPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8KKwkJCWZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsCisJCQltb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4KKwkJCWZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzCisJCQkoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+CisJCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeQorCQkJb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZAorCQkJJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgorCQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vcgorCQkJRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEKKwkJCXN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuIFdpdGhpbiBhCisJCQlGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YKKwkJCXRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzCisJCQlhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+CisJCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZAorCQkJRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZAorCQkJJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbgorCQkJbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgorCTwvdWw+CiAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CisJPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZAorCQliZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OworCQkoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKKwkJSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZAorCQkmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiBBYm91dHMgYW5kCisJCUZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yCisJCU1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+CiAKLTx1bD4KLSAgICAgICA8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLSAgICAgICA8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotICAgICAgIDxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLSAgICAgICA8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0gICAgICAgPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KKwk8dWw+CisJCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgorCQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgorCQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+CisJCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YKKwkJCWNlcnRhaW4gUGx1Zy1pbnM8L2xpPgorCQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+CisJPC91bD4KIAotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiKSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiIGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KKwk8cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcworCQlpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91CisJCW11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcKKwkJdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywKKwkJdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcworCQlhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91CisJCWNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZQorCQkmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkCisJCSZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoIEFib3V0cywKKwkJRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZAorCQljb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuCisJCXlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuPC9wPgogCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+CisJPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWQorCQlSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQKKwkJQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVAorCQlBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pPC9saT4KLSAgICAgICA8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotICAgICAgIDxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGljZW5zZXMvZWRsLXYxLjAuaHRtbDwvYT4pCisJCTwvbGk+CisJCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPikKKwkJPC9saT4KKwkJPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KQorCQk8L2xpPgorCTwvdWw+CiAKLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KKwk8cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORAorCQlDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwKKwkJb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UKKwkJRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdAorCQlwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgogCiAKLTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgorCTxoMz5Vc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3k8L2gzPgogCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZQotICAgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKLSAgIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KLSAgIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KLSAgICgiU3BlY2lmaWNhdGlvbiIpLjwvcD4KKwk8cD4KKwkJVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcworCQlvZiB3aGljaCBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlCisJCU1hbmFnZXIgKCZxdW90O1Byb3Zpc2lvbmluZyBUZWNobm9sb2d5JnF1b3Q7KSBmb3IgdGhlIHB1cnBvc2Ugb2YKKwkJYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yCisJCW90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5ICZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlJnF1b3Q7KS4gVGhpcworCQljYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZyBzdWNoIHVzZXJzIHRvCisJCWluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uIGFib3V0CisJCXBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWwiPmh0dHA6Ly9lY2xpcHNlLm9yZy9lcXVpbm94L3AyL3JlcG9zaXRvcnlfcGFja2FnaW5nLmh0bWw8L2E+CisJCSgmcXVvdDtTcGVjaWZpY2F0aW9uJnF1b3Q7KS4KKwk8L3A+CiAKLTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUKLSAgIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZCBtYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKLSAgIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KKwk8cD5Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvCisJCWluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcKKwkJdGhlIGFwcGxpY2FibGUgbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQl0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcKKwkJVGVjaG5vbG9neSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoCisJCXRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyIGFncmVlbWVudCB0bywgYW5kIHRoZQorCQlhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzo8L3A+CiAKLTxvbD4KLSAgICAgICA8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kKLSAgICAgICBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZAotICAgICAgIHByb2R1Y3QuPC9saT4KLSAgICAgICA8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZQotICAgICAgIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+Ci0gICAgICAgPGxpPlB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQotICAgICAgIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAotICAgICAgIE1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4KLSAgICAgICB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQuIFVwb24gc3VjaAotICAgICAgIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUgcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLjwvbGk+Ci08L29sPgorCTxvbD4KKwkJPGxpPkEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgmcXVvdDtQcm92aXNpb25pbmcKKwkJCVByb2Nlc3MmcXVvdDspIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nCisJCQlUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoJnF1b3Q7VGFyZ2V0IE1hY2hpbmUmcXVvdDspIHdpdGggdGhlIGludGVudAorCQkJb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuCisJCQlFY2xpcHNlLWJhc2VkIHByb2R1Y3QuPC9saT4KKwkJPGxpPkR1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQorCQkJbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCisJCQlhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS48L2xpPgorCQk8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIKKwkJCXRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUgKCZxdW90O0luc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCZxdW90OykgYW5kIHN1Y2gKKwkJCUluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQKKwkJCU1hY2hpbmUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zCisJCQl0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5CisJCQl0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUKKwkJCUFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGUKKwkJCXByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZSBJbnN0YWxsYWJsZQorCQkJU29mdHdhcmUuPC9saT4KKwk8L29sPgogCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KKwk8aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KIAotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KKwk8cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoCisJCXlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQKKwkJdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4KKwkJQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLAorCQlyZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsCisJCWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KIAotPHA+PHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgT3JhY2xlIENvcnBvcmF0aW9uIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD48L3A+Ci0KLQotPC9ib2R5PjwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisJPHA+CisJCTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mCisJCQlPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPgorCTwvcD4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQubGZzLmZlYXR1cmUvcG9tLnhtbAppbmRleCA1YzliY2M2Li4zNWE0ZmRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0Lmxmcy5mZWF0dXJlL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5sZnMuZmVhdHVyZS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKaW5kZXggODk5MmFkMy4uZWY5MDMxZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTM1LDEyNSArMzUsMTQzIEBACiAjIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKIGxpY2Vuc2U9XAogRWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50XG5cCi1BcHJpbCA5LCAyMDE0XG5cCitcblwKK05vdmVtYmVyIDIyLCAyMDE3XG5cCiBcblwKIFVzYWdlIE9mIENvbnRlbnRcblwKIFxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCitUSEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT05cblwKK0FORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GXG5cCitUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKK0JFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORURcblwKK0JZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRVxuXAorQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAorVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTllcblwKK0FQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VXG5cCitNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKIFxuXAogQXBwbGljYWJsZSBMaWNlbnNlc1xuXAogXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlXG5cCi1FY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZlxuXAotdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXNcblwKLXByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAorVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKK2lzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2VcblwKK1ZlcnNpb24gMi4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvXG5cCithdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLiBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCxcblwKKyJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCiBcblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKK0NvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uXG5cCithbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnlcblwKKygiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzXG5cCitkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKIFxuXAotICAgICAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAgICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEoVE0pIEFSY2hpdmUpXG5cCi0gICAgICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAgICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgICAgICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCistICAgQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGVcblwKKyAgICBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXlcblwKKyAgICBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kXG5cCisgICAgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAorLSAgIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUlxuXAorICAgIChKYXZh4oSiIEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKKy0gICBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmRcblwKKyAgICBhc3NvY2lhdGVkIG1hdGVyaWFsLiBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhXG5cCisgICAgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5XG5cCisgICAgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vclxuXAorICAgIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAorLSAgIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYVxuXAorICAgIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmRcblwKKyAgICB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCiBcblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAorVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW5cblwKK2ZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzXG5cCithbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIlxuXAorKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnlcblwKK2RpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nXG5cCitsb2NhdGlvbnM6XG5cCiBcblwKLSAgICAgICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgICAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgICAgICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgICAgICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgICAgICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKKy0gICBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKKy0gICBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAorLSAgIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKKy0gICBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCistICAgRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAogXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1Qcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgXG5cCi1VcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS5cblwKLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGVcblwKLXRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXRcblwKLWdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAorTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nXG5cCit0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2VcblwKKygiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlXG5cCitjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAord2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91XG5cCit3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIlxuXAorcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4gU3VjaFxuXAorQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mXG5cCit0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAogXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKK1RIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTFxuXAorT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFXG5cCitPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAogXG5cCi0gICAgICAgLSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAotICAgICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCistICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwpXG5cCistICAgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sKVxuXAorLSAgIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCistICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKKy0gICBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCiBcblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKK0lUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE9cblwKK1VTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpc1xuXAorcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kXG5cCitjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKIFxuXAotXG5cVXNlIG9mIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCitVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKIFxuXAotVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaCBpbmNsdWRlLFxuXAotYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyICgiUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kiKSBmb3JcblwKLXRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vclxuXAotb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoXG5cCi10aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8gaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy5cblwKLUluZm9ybWF0aW9uIGFib3V0IHBhY2thZ2luZyBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBpcyBhdmFpbGFibGUgYXRcblwKK1RoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2hcblwKK2luY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlclxuXAorKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvciB0aGUgcHVycG9zZSBvZiBhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsXG5cCitzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyAoY29sbGVjdGl2ZWx5XG5cCisiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGggdGhlIGludGVudCBvZiBhbGxvd2luZ1xuXAorc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLiBJbmZvcm1hdGlvblxuXAorYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAogaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCAoIlNwZWNpZmljYXRpb24iKS5cblwKIFxuXAotWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAotWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlXG5cCi1JbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZCBhY2NlcHRlZCBieSwgdGhlIHVzZXJzIG9mIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAotaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBCeSB1c2luZyBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBpbiBzdWNoIGEgbWFubmVyIGFuZFxuXAotbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXJcblwKLWFncmVlbWVudCB0bywgYW5kIHRoZSBhY3F1aXNpdGlvbiBvZiBhbGwgbmVjZXNzYXJ5IHJpZ2h0cyB0byBwZXJtaXQgdGhlIGZvbGxvd2luZzpcblwKK1lvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8gaW5zdGFsbFxuXAorSW5zdGFsbGFibGUgU29mdHdhcmUuIFlvdSBzaGFsbCBiZSByZXNwb25zaWJsZSBmb3IgZW5hYmxpbmcgdGhlIGFwcGxpY2FibGVcblwKK2xpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgdG8gYmUgcHJlc2VudGVkIHRvLCBhbmRcblwKK2FjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGVcblwKK1NwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdFxuXAorYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAorYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGVcblwKK2ZvbGxvd2luZzpcblwKIFxuXAotICAgICAgIDEuIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5IGV4ZWN1dGVcblwKLSAgICAgICAgICB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZSBpbnRlbnQgb2YgaW5zdGFsbGluZyxcblwKLSAgICAgICAgICBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4gRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAotICAgICAgIDIuIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmQgcGFydHlcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvIHRoZSBUYXJnZXQgTWFjaGluZS5cblwKLSAgICAgICAzLiBQdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgdGhhdFxuXAotICAgICAgICAgIGdvdmVybiB0aGUgdXNlIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSAoIkluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoXG5cCi0gICAgICAgICAgSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2VcblwKLSAgICAgICAgICB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLiBTdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGVcblwKLSAgICAgICAgICB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlIGJ5XG5cCi0gICAgICAgICAgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoXG5cCi0gICAgICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvblxuXAotICAgICAgICAgIG9mIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKKzEuICBBIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heVxuXAorICAgIGV4ZWN1dGUgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGVcblwKKyAgICBpbnRlbnQgb2YgaW5zdGFsbGluZywgZXh0ZW5kaW5nIG9yIHVwZGF0aW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuXG5cCisgICAgRWNsaXBzZS1iYXNlZCBwcm9kdWN0LlxuXAorMi4gIER1cmluZyB0aGUgUHJvdmlzaW9uaW5nIFByb2Nlc3MsIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBtYXkgY2F1c2UgdGhpcmRcblwKKyAgICBwYXJ0eSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBvciBhIHBvcnRpb24gdGhlcmVvZiB0byBiZSBhY2Nlc3NlZCBhbmQgY29waWVkIHRvXG5cCisgICAgdGhlIFRhcmdldCBNYWNoaW5lLlxuXAorMy4gIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmRcblwKKyAgICBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGVcblwKKyAgICBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmVcblwKKyAgICBhY2Nlc3NlZCBmcm9tIHRoZSBUYXJnZXQgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2hcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgbXVzdCBpbmZvcm0gdGhlIHVzZXIgb2YgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIGFuZCBtdXN0IHNvbGljaXQgYWNjZXB0YW5jZVxuXAorICAgIGJ5IHRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoIGluZGljYXRpb24gb2YgYWdyZWVtZW50IGJ5IHRoZSB1c2VyLCB0aGVcblwKKyAgICBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGVcblwKKyAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZS5cblwKIFxuXAogQ3J5cHRvZ3JhcGh5XG5cCiBcblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZFxuXAotcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKK0NvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHlcblwKK21heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvXG5cCithbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSxcblwKK3BsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsXG5cCitwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXNcblwKK3Blcm1pdHRlZC5cblwKIFxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlXG5cCitVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KKyMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggZjI3ODBhNC4uMThhN2QxYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0LnBnbSIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSI0LjExLjgucXVhbGlmaWVyIgorICAgICAgdmVyc2lvbj0iNS4wLjQucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamdpdC8iPgpAQCAtMzEsOCArMzEsOCBAQAogICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KIAogICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0IiB2ZXJzaW9uPSI0LjExLjgiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpnaXQubGZzIiB2ZXJzaW9uPSI0LjExLjgiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CisgICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmpnaXQiIHZlcnNpb249IjUuMC40IiBtYXRjaD0iZXF1aXZhbGVudCIvPgorICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5qZ2l0LmxmcyIgdmVyc2lvbj0iNS4wLjQiIG1hdGNoPSJlcXVpdmFsZW50Ii8+CiAgICA8L3JlcXVpcmVzPgogCiAgICA8cGx1Z2luCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvbGljZW5zZS5odG1sCmluZGV4IDk1YWQ5NWUuLjAwOGI4MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0xLDEwNiArMSwxODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCA5LCAyMDE0PC9wPgorCTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCTxwPk5vdmVtYmVyIDIyLCAyMDE3PC9wPgogCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisJPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisJPHA+CisJCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisJCUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUKKwkJRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgorCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCisJPC9wPgogCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKwk8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKKwkJY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlCisJCW1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUKKwkJYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhmSBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0bworCQkJZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwKKwkJCW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbgorCQkJZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMKKwkJCSgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwkJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5CisJCQlvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkCisJCQkmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yCisJCQlGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYQorCQkJc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gV2l0aGluIGEKKwkJCUZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZgorCQkJdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMKKwkJCWFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwkJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkCisJCQlGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkCisJCQkmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uCisJCQludW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+CisJPC91bD4KIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKwk8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCisJCWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7CisJCSgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorCQlJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkCisJCSZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQKKwkJRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IKKwkJTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCTxwPgorCQlUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzCisJCW9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUKKwkJTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZgorCQlhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKwkJb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzCisJCWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKwkJaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQKKwkJcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKwkJKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLgorCTwvcD4KIAotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8KKwkJaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZworCQl0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCXRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGgKKwkJdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlCisJCWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KIAotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKKwkJeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZAorCQl1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLgorCQlCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsCisJCXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwKKwkJYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgogCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwk8cD4KKwkJPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YKKwkJCU9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uZmVhdHVyZS9wb20ueG1sCmluZGV4IDQ0NzkzZjguLjczYTdkM2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5mZWF0dXJlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmluZGV4IDAxMmMyMTcuLjczNzAxYjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKQEAgLTE2LDcgKzE2LDcgQEAKICMgZGVzY3JpcHRpb24gcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBEZXNjcmlwdGlvbiIKIGRlc2NyaXB0aW9uPVwKIERvIG5vdCBpbnN0YWxsIGluIHlvdXIgSURFOiB0aGlzIGZlYXR1cmUgaXMgbWVhbnQgdG8gcHJvdmlzaW9uIFRhcmdldCBQbGF0Zm9ybXMuXG5cCi1Tb3VyY2UgY29kZSBmb3IgdGhlIHN1cHBvcnQgZm9yIFBERSdzIEpVbml0IHJ1bm5lciBmb3IgYSBUYXJnZXQgUGxhdGZvcm1cblwKK1NvdXJjZSBjb2RlIGZvciB0aGUgc3VwcG9ydCBmb3IgUERFJ3MgSlVuaXQgcnVubmVyIGZvciBhIFRhcmdldCBQbGF0Zm9ybVxuCiAjIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBkZXNjcmlwdGlvbiBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKICMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgpAQCAtMzYsMTI1ICszNiwxNDMgQEAKICMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgogbGljZW5zZT1cCiBFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDksIDIwMTRcblwKK1xuXAorTm92ZW1iZXIgMjIsIDIwMTdcblwKIFxuXAogVXNhZ2UgT2YgQ29udGVudFxuXAogXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTlxuXAorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0ZcblwKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRFxuXAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFXG5cCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWVxuXAorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1VcblwKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAogXG5cCiBBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCiBcblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZVxuXAorVmVyc2lvbiAyLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc29cblwKK2F2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLFxuXAorIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKIFxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb25cblwKK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeVxuXAorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXNcblwKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAogXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZVxuXAorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heVxuXAorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmRcblwKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSXG5cCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZFxuXAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGFcblwKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXlcblwKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yXG5cCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhXG5cCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZFxuXAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKIFxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpblxuXAorZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXNcblwKK2FuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiXG5cCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueVxuXAorZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmdcblwKK2xvY2F0aW9uczpcblwKIFxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorLSAgIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorLSAgIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCistICAgSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAorLSAgIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKy0gICBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCiBcblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmdcblwKK3RoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZVxuXAorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmVcblwKK2NvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3VcblwKK3doZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiXG5cCitwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoXG5cCitBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2ZcblwKK3RoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCiBcblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMXG5cCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0VcblwKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCiBcblwKLSAgICAgICAtIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbClcblwKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKIFxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUT1xuXAorVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzXG5cCitwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAogXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK1VzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAogXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaFxuXAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyXG5cCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGxcblwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHlcblwKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nXG5cCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uXG5cCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCiBodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAogXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsXG5cCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZVxuXAorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZFxuXAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZVxuXAorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0XG5cCithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZVxuXAorZm9sbG93aW5nOlxuXAogXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5XG5cCisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZVxuXAorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW5cblwKKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZFxuXAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG9cblwKKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZVxuXAorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaFxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlXG5cCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZVxuXAorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZVxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAogXG5cCiBDcnlwdG9ncmFwaHlcblwKIFxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseVxuXAorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG9cblwKK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLFxuXAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCxcblwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpc1xuXAorcGVybWl0dGVkLlxuXAogXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGVcblwKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDk3YTZhMTcuLjgxMGQwMTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UiCiAgICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iNC4xMS44LnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjUuMC40LnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pnaXQvIj4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAppbmRleCA5NWFkOTVlLi4wMDhiODAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0xLDEwNiArMSwxODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCA5LCAyMDE0PC9wPgorCTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCTxwPk5vdmVtYmVyIDIyLCAyMDE3PC9wPgogCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisJPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisJPHA+CisJCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisJCUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUKKwkJRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgorCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCisJPC9wPgogCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKwk8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKKwkJY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlCisJCW1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUKKwkJYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhmSBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0bworCQkJZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwKKwkJCW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbgorCQkJZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMKKwkJCSgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwkJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5CisJCQlvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkCisJCQkmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yCisJCQlGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYQorCQkJc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gV2l0aGluIGEKKwkJCUZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZgorCQkJdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMKKwkJCWFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwkJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkCisJCQlGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkCisJCQkmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uCisJCQludW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+CisJPC91bD4KIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKwk8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCisJCWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7CisJCSgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorCQlJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkCisJCSZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQKKwkJRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IKKwkJTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCTxwPgorCQlUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzCisJCW9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUKKwkJTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZgorCQlhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKwkJb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzCisJCWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKwkJaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQKKwkJcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKwkJKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLgorCTwvcD4KIAotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8KKwkJaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZworCQl0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCXRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGgKKwkJdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlCisJCWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KIAotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKKwkJeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZAorCQl1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLgorCQlCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsCisJCXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwKKwkJYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgogCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwk8cD4KKwkJPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YKKwkJCU9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucGdtLnNvdXJjZS5mZWF0dXJlL3BvbS54bWwKaW5kZXggYmM4OWVlYi4uODhiOGNlOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5wZ20uc291cmNlLmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UuZmVhdHVyZS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpnaXQuZmVhdHVyZTwvZ3JvdXBJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQucmVwb3NpdG9yeS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5L3BvbS54bWwKaW5kZXggY2E3NDE2Zi4uYzhjM2I1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5L3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdC5yZXBvc2l0b3J5PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwppbmRleCA5ODQzZTIzLi5jMDRkYzYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpAQCAtMzYsMTI1ICszNiwxNDMgQEAKICMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgogbGljZW5zZT1cCiBFY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnRcblwKLUFwcmlsIDksIDIwMTRcblwKK1xuXAorTm92ZW1iZXIgMjIsIDIwMTdcblwKIFxuXAogVXNhZ2UgT2YgQ29udGVudFxuXAogXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKK1RIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTlxuXAorQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0ZcblwKK1RIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAorQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRFxuXAorQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFXG5cCitBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCitURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWVxuXAorQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1VcblwKK01BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAogXG5cCiBBcHBsaWNhYmxlIExpY2Vuc2VzXG5cCiBcblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGVcblwKLUVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mXG5cCi10aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpc1xuXAotcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCitVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAoraXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZVxuXAorVmVyc2lvbiAyLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc29cblwKK2F2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLFxuXAorIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKIFxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGVcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAorQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb25cblwKK2FuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gc291cmNlIGNvZGUgcmVwb3NpdG9yeVxuXAorKCJSZXBvc2l0b3J5IikgaW4gc29mdHdhcmUgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXNcblwKK2Rvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAogXG5cCi0gICAgICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgICAgICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YShUTSkgQVJjaGl2ZSlcblwKLSAgICAgICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgICAgICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgICAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKKy0gICBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZVxuXAorICAgIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heVxuXAorICAgIGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmRcblwKKyAgICBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCistICAgRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSXG5cCisgICAgKEphdmHihKIgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAorLSAgIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZFxuXAorICAgIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGFcblwKKyAgICBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXlcblwKKyAgICBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yXG5cCisgICAgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCistICAgRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhXG5cCisgICAgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZFxuXAorICAgIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKIFxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCitUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpblxuXAorZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXNcblwKK2FuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiXG5cCisoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueVxuXAorZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmdcblwKK2xvY2F0aW9uczpcblwKIFxuXAotICAgICAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAgICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgICAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgICAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgICAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAorLSAgIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAorLSAgIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCistICAgSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAorLSAgIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKKy0gICBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCiBcblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLVByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBcblwKLVVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLlxuXAotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZVxuXAotdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdFxuXAotZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCitOb3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmdcblwKK3RoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSAoYXMgZGVmaW5lZCBiZWxvdyksIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZVxuXAorKCJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmVcblwKK2NvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCit3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3VcblwKK3doZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiXG5cCitwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIiBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLiBTdWNoXG5cCitBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2ZcblwKK3RoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCiBcblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAorVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMXG5cCitPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0VcblwKK09USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCiBcblwKLSAgICAgICAtIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCi0gICAgICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKKy0gICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbClcblwKKy0gICBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MS4wLmh0bWwpXG5cCistICAgQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXRcblwKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKKy0gICBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAorLSAgIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0XG5cCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAorLSAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdFxuXAorICAgIGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKIFxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAorSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUT1xuXAorVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzXG5cCitwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmRcblwKK2NvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAogXG5cCi1cblxVc2Ugb2YgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3lcblwKK1VzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neVxuXAogXG5cCi1UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzIG9mIHdoaWNoIGluY2x1ZGUsXG5cCi1idXQgYXJlIG5vdCBsaW1pdGVkIHRvLCBwMiBhbmQgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIgKCJQcm92aXNpb25pbmcgVGVjaG5vbG9neSIpIGZvclxuXAotdGhlIHB1cnBvc2Ugb2YgYWxsb3dpbmcgdXNlcnMgdG8gaW5zdGFsbCBzb2Z0d2FyZSwgZG9jdW1lbnRhdGlvbiwgaW5mb3JtYXRpb24gYW5kL29yXG5cCi1vdGhlciBtYXRlcmlhbHMgKGNvbGxlY3RpdmVseSAiSW5zdGFsbGFibGUgU29mdHdhcmUiKS4gVGhpcyBjYXBhYmlsaXR5IGlzIHByb3ZpZGVkIHdpdGhcblwKLXRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0byBpbnN0YWxsLCBleHRlbmQgYW5kIHVwZGF0ZSBFY2xpcHNlLWJhc2VkIHByb2R1Y3RzLlxuXAotSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdFxuXAorVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgcHJvdmlzaW9uaW5nIHNvZnR3YXJlLCBleGFtcGxlcyBvZiB3aGljaFxuXAoraW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyXG5cCisoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGxcblwKK3NvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHlcblwKKyJJbnN0YWxsYWJsZSBTb2Z0d2FyZSIpLiBUaGlzIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nXG5cCitzdWNoIHVzZXJzIHRvIGluc3RhbGwsIGV4dGVuZCBhbmQgdXBkYXRlIEVjbGlwc2UtYmFzZWQgcHJvZHVjdHMuIEluZm9ybWF0aW9uXG5cCithYm91dCBwYWNrYWdpbmcgSW5zdGFsbGFibGUgU29mdHdhcmUgaXMgYXZhaWxhYmxlIGF0XG5cCiBodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sICgiU3BlY2lmaWNhdGlvbiIpLlxuXAogXG5cCi1Zb3UgbWF5IHVzZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSB0byBhbGxvdyBvdGhlciBwYXJ0aWVzIHRvIGluc3RhbGwgSW5zdGFsbGFibGUgU29mdHdhcmUuXG5cCi1Zb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZSBhcHBsaWNhYmxlIGxpY2Vuc2UgYWdyZWVtZW50cyByZWxhdGluZyB0byB0aGVcblwKLUluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5XG5cCi1pbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kXG5cCi1tYWtpbmcgaXQgYXZhaWxhYmxlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91clxuXAotYWdyZWVtZW50IHRvLCBhbmQgdGhlIGFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOlxuXAorWW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsXG5cCitJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZyB0aGUgYXBwbGljYWJsZVxuXAorbGljZW5zZSBhZ3JlZW1lbnRzIHJlbGF0aW5nIHRvIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSB0byBiZSBwcmVzZW50ZWQgdG8sIGFuZFxuXAorYWNjZXB0ZWQgYnksIHRoZSB1c2VycyBvZiB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZVxuXAorU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0XG5cCithdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3UgZnVydGhlciBhY2tub3dsZWRnZSB5b3VyXG5cCithZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZVxuXAorZm9sbG93aW5nOlxuXAogXG5cCi0gICAgICAgMS4gQSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCJQcm92aXNpb25pbmcgUHJvY2VzcyIpIGluIHdoaWNoIGEgdXNlciBtYXkgZXhlY3V0ZVxuXAotICAgICAgICAgIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neSBvbiBhIG1hY2hpbmUgKCJUYXJnZXQgTWFjaGluZSIpIHdpdGggdGhlIGludGVudCBvZiBpbnN0YWxsaW5nLFxuXAotICAgICAgICAgIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCi0gICAgICAgMi4gRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZCBwYXJ0eVxuXAotICAgICAgICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLlxuXAotICAgICAgIDMuIFB1cnN1YW50IHRvIHRoZSBTcGVjaWZpY2F0aW9uLCB5b3Ugd2lsbCBwcm92aWRlIHRvIHRoZSB1c2VyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0XG5cCi0gICAgICAgICAgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlICgiSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IikgYW5kIHN1Y2hcblwKLSAgICAgICAgICBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0IE1hY2hpbmUgaW4gYWNjb3JkYW5jZVxuXAotICAgICAgICAgIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZVxuXAotICAgICAgICAgIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnlcblwKLSAgICAgICAgICB0aGUgZW5kIHVzZXIgaW4gdGhlIG1hbm5lciBwcmVzY3JpYmVkIGluIHN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2hcblwKLSAgICAgICAgICBpbmRpY2F0aW9uIG9mIGFncmVlbWVudCBieSB0aGUgdXNlciwgdGhlIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uXG5cCi0gICAgICAgICAgb2YgdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAorMS4gIEEgc2VyaWVzIG9mIGFjdGlvbnMgbWF5IG9jY3VyICgiUHJvdmlzaW9uaW5nIFByb2Nlc3MiKSBpbiB3aGljaCBhIHVzZXIgbWF5XG5cCisgICAgZXhlY3V0ZSB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgiVGFyZ2V0IE1hY2hpbmUiKSB3aXRoIHRoZVxuXAorICAgIGludGVudCBvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW5cblwKKyAgICBFY2xpcHNlLWJhc2VkIHByb2R1Y3QuXG5cCisyLiAgRHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IG1heSBjYXVzZSB0aGlyZFxuXAorICAgIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlIGFjY2Vzc2VkIGFuZCBjb3BpZWQgdG9cblwKKyAgICB0aGUgVGFyZ2V0IE1hY2hpbmUuXG5cCiszLiAgUHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZFxuXAorICAgIGNvbmRpdGlvbnMgdGhhdCBnb3Zlcm4gdGhlIHVzZSBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgKCJJbnN0YWxsYWJsZVxuXAorICAgIFNvZnR3YXJlIEFncmVlbWVudCIpIGFuZCBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBzaGFsbCBiZVxuXAorICAgIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldCBNYWNoaW5lIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gU3VjaFxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kXG5cCisgICAgY29uZGl0aW9ucyB0aGF0IGdvdmVybiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUgYW5kIG11c3Qgc29saWNpdCBhY2NlcHRhbmNlXG5cCisgICAgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlXG5cCisgICAgU29mdHdhcmUgQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZVxuXAorICAgIHByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHdpbGwgY29tcGxldGUgaW5zdGFsbGF0aW9uIG9mIHRoZVxuXAorICAgIEluc3RhbGxhYmxlIFNvZnR3YXJlLlxuXAogXG5cCiBDcnlwdG9ncmFwaHlcblwKIFxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kXG5cCi1yZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAorQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseVxuXAorbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG9cblwKK2Fub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLFxuXAorcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCxcblwKK3Bvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpc1xuXAorcGVybWl0dGVkLlxuXAogXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCitKYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIE9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGVcblwKK1VuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgorIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9mZWF0dXJlLnhtbAppbmRleCBmM2M3ZTkzLi4xMmQ2ZmUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpnaXQuc291cmNlIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjQuMTEuOC5xdWFsaWZpZXIiCisgICAgICB2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiCiAgICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KIAogICAgPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZ2l0LyI+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvbGljZW5zZS5odG1sCmluZGV4IDk1YWQ5NWUuLjAwOGI4MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvbGljZW5zZS5odG1sCkBAIC0xLDEwNiArMSwxODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiID8+CiA8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPjxoZWFkPjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotCis8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+Cis8aGVhZD4KKzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIC8+CiA8dGl0bGU+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KIDwvaGVhZD4KIAogPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5BcHJpbCA5LCAyMDE0PC9wPgorCTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgorCTxwPk5vdmVtYmVyIDIyLCAyMDE3PC9wPgogCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+CisJPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgogCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KKwk8cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwKKwkJSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKKwkJKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZCisJCVRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAorCQlDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VECisJCUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMKKwkJR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkKKwkJQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRAorCQlCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUworCQlBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFCisJCUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVAorCQlVU0UgVEhFIENPTlRFTlQuPC9wPgogCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+CisJPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPgogCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoIkVQTCIpLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+CisJPHA+CisJCVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCisJCUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAyLjAgKCZxdW90O0VQTCZxdW90OykuIEEgY29weSBvZiB0aGUKKwkJRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjA8L2E+LgorCQlGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuCisJPC9wPgogCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHNvdXJjZSBjb2RlCi0gICByZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIHNvZnR3YXJlIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvcD4KKwk8cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QKKwkJY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHNvdXJjZSBjb2RlIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIHNvZnR3YXJlCisJCW1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUKKwkJYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuPC9saT4KLSAgICAgICA8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhmSBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuPC9saT4KLSAgICAgICA8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0bworCQkJZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwKKwkJCW1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbgorCQkJZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMKKwkJCSgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KKwkJPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5CisJCQlvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkCisJCQkmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+CisJCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yCisJCQlGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYQorCQkJc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gV2l0aGluIGEKKwkJCUZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZgorCQkJdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMKKwkJCWFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KKwkJPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkCisJCQlGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkCisJCQkmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uCisJCQludW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+CisJPC91bD4KIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KKwk8cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkCisJCWJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7CisJCSgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAorCQlJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkCisJCSZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuIEFib3V0cyBhbmQKKwkJRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IKKwkJTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KIAotPHVsPgotICAgICAgIDxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotICAgICAgIDxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0gICAgICAgPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotICAgICAgIDxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLSAgICAgICA8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgorCTx1bD4KKwkJPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+CisJCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+CisJCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KKwkJPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZgorCQkJY2VydGFpbiBQbHVnLWluczwvbGk+CisJCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KKwk8L3VsPgogCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IChhcyBkZWZpbmVkIGJlbG93KSwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIpIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgorCTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzCisJCWluc3RhbGxlZCB1c2luZyB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgKGFzIGRlZmluZWQgYmVsb3cpLCB5b3UKKwkJbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZworCQl0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLAorCQl0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zCisJCWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UKKwkJY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlCisJCSZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQKKwkJJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuIFN1Y2ggQWJvdXRzLAorCQlGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kCisJCWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4KKwkJeW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS48L3A+CiAKLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KKwk8cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZCisJCVJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORAorCQlDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUCisJCUFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgogCi08dWw+Ci0gICAgICAgPGxpPkVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPik8L2xpPgotICAgICAgIDxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0gICAgICAgPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLSAgICAgICA8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0gICAgICAgPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+CisJPHVsPgorCQk8bGk+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+RWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xpY2Vuc2VzL2VkbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9saWNlbnNlcy9lZGwtdjEuMC5odG1sPC9hPikKKwkJPC9saT4KKwkJPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KQorCQk8L2xpPgorCQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEKKwkJCWhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pCisJCTwvbGk+CisJCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KQorCQk8L2xpPgorCQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhCisJCQlocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pCisJCTwvbGk+CisJPC91bD4KIAotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgorCTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5ECisJCUNPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLAorCQlvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZQorCQlGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0CisJCXBhcnRpY3VsYXIgQ29udGVudC48L3A+CiAKIAotPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CisJPGgzPlVzZSBvZiBQcm92aXNpb25pbmcgVGVjaG5vbG9neTwvaDM+CiAKLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIHByb3Zpc2lvbmluZyBzb2Z0d2FyZSwgZXhhbXBsZXMgb2Ygd2hpY2ggaW5jbHVkZSwgYnV0IGFyZSBub3QgbGltaXRlZCB0bywgcDIgYW5kIHRoZSBFY2xpcHNlCi0gICBVcGRhdGUgTWFuYWdlciAoIlByb3Zpc2lvbmluZyBUZWNobm9sb2d5IikgZm9yIHRoZSBwdXJwb3NlIG9mIGFsbG93aW5nIHVzZXJzIHRvIGluc3RhbGwgc29mdHdhcmUsIGRvY3VtZW50YXRpb24sIGluZm9ybWF0aW9uIGFuZC9vcgotICAgb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgIkluc3RhbGxhYmxlIFNvZnR3YXJlIikuIFRoaXMgY2FwYWJpbGl0eSBpcyBwcm92aWRlZCB3aXRoIHRoZSBpbnRlbnQgb2YgYWxsb3dpbmcgc3VjaCB1c2VycyB0bwotICAgaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQgcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sIj5odHRwOi8vZWNsaXBzZS5vcmcvZXF1aW5veC9wMi9yZXBvc2l0b3J5X3BhY2thZ2luZy5odG1sPC9hPgotICAgKCJTcGVjaWZpY2F0aW9uIikuPC9wPgorCTxwPgorCQlUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBwcm92aXNpb25pbmcgc29mdHdhcmUsIGV4YW1wbGVzCisJCW9mIHdoaWNoIGluY2x1ZGUsIGJ1dCBhcmUgbm90IGxpbWl0ZWQgdG8sIHAyIGFuZCB0aGUgRWNsaXBzZSBVcGRhdGUKKwkJTWFuYWdlciAoJnF1b3Q7UHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kmcXVvdDspIGZvciB0aGUgcHVycG9zZSBvZgorCQlhbGxvd2luZyB1c2VycyB0byBpbnN0YWxsIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uLCBpbmZvcm1hdGlvbiBhbmQvb3IKKwkJb3RoZXIgbWF0ZXJpYWxzIChjb2xsZWN0aXZlbHkgJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUmcXVvdDspLiBUaGlzCisJCWNhcGFiaWxpdHkgaXMgcHJvdmlkZWQgd2l0aCB0aGUgaW50ZW50IG9mIGFsbG93aW5nIHN1Y2ggdXNlcnMgdG8KKwkJaW5zdGFsbCwgZXh0ZW5kIGFuZCB1cGRhdGUgRWNsaXBzZS1iYXNlZCBwcm9kdWN0cy4gSW5mb3JtYXRpb24gYWJvdXQKKwkJcGFja2FnaW5nIEluc3RhbGxhYmxlIFNvZnR3YXJlIGlzIGF2YWlsYWJsZSBhdCA8YQorCQkJaHJlZj0iaHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbCI+aHR0cDovL2VjbGlwc2Uub3JnL2VxdWlub3gvcDIvcmVwb3NpdG9yeV9wYWNrYWdpbmcuaHRtbDwvYT4KKwkJKCZxdW90O1NwZWNpZmljYXRpb24mcXVvdDspLgorCTwvcD4KIAotPHA+WW91IG1heSB1c2UgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgdG8gYWxsb3cgb3RoZXIgcGFydGllcyB0byBpbnN0YWxsIEluc3RhbGxhYmxlIFNvZnR3YXJlLiBZb3Ugc2hhbGwgYmUgcmVzcG9uc2libGUgZm9yIGVuYWJsaW5nIHRoZQotICAgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlIHRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5Ci0gICBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIEJ5IHVzaW5nIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IGluIHN1Y2ggYSBtYW5uZXIgYW5kIG1ha2luZyBpdCBhdmFpbGFibGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZQotICAgU3BlY2lmaWNhdGlvbiwgeW91IGZ1cnRoZXIgYWNrbm93bGVkZ2UgeW91ciBhZ3JlZW1lbnQgdG8sIGFuZCB0aGUgYWNxdWlzaXRpb24gb2YgYWxsIG5lY2Vzc2FyeSByaWdodHMgdG8gcGVybWl0IHRoZSBmb2xsb3dpbmc6PC9wPgorCTxwPllvdSBtYXkgdXNlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5IHRvIGFsbG93IG90aGVyIHBhcnRpZXMgdG8KKwkJaW5zdGFsbCBJbnN0YWxsYWJsZSBTb2Z0d2FyZS4gWW91IHNoYWxsIGJlIHJlc3BvbnNpYmxlIGZvciBlbmFibGluZworCQl0aGUgYXBwbGljYWJsZSBsaWNlbnNlIGFncmVlbWVudHMgcmVsYXRpbmcgdG8gdGhlIEluc3RhbGxhYmxlIFNvZnR3YXJlCisJCXRvIGJlIHByZXNlbnRlZCB0bywgYW5kIGFjY2VwdGVkIGJ5LCB0aGUgdXNlcnMgb2YgdGhlIFByb3Zpc2lvbmluZworCQlUZWNobm9sb2d5IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgU3BlY2lmaWNhdGlvbi4gQnkgdXNpbmcgUHJvdmlzaW9uaW5nCisJCVRlY2hub2xvZ3kgaW4gc3VjaCBhIG1hbm5lciBhbmQgbWFraW5nIGl0IGF2YWlsYWJsZSBpbiBhY2NvcmRhbmNlIHdpdGgKKwkJdGhlIFNwZWNpZmljYXRpb24sIHlvdSBmdXJ0aGVyIGFja25vd2xlZGdlIHlvdXIgYWdyZWVtZW50IHRvLCBhbmQgdGhlCisJCWFjcXVpc2l0aW9uIG9mIGFsbCBuZWNlc3NhcnkgcmlnaHRzIHRvIHBlcm1pdCB0aGUgZm9sbG93aW5nOjwvcD4KIAotPG9sPgotICAgICAgIDxsaT5BIHNlcmllcyBvZiBhY3Rpb25zIG1heSBvY2N1ciAoIlByb3Zpc2lvbmluZyBQcm9jZXNzIikgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcgVGVjaG5vbG9neQotICAgICAgIG9uIGEgbWFjaGluZSAoIlRhcmdldCBNYWNoaW5lIikgd2l0aCB0aGUgaW50ZW50IG9mIGluc3RhbGxpbmcsIGV4dGVuZGluZyBvciB1cGRhdGluZyB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhbiBFY2xpcHNlLWJhc2VkCi0gICAgICAgcHJvZHVjdC48L2xpPgotICAgICAgIDxsaT5EdXJpbmcgdGhlIFByb3Zpc2lvbmluZyBQcm9jZXNzLCB0aGUgUHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgbWF5IGNhdXNlIHRoaXJkIHBhcnR5IEluc3RhbGxhYmxlIFNvZnR3YXJlIG9yIGEgcG9ydGlvbiB0aGVyZW9mIHRvIGJlCi0gICAgICAgYWNjZXNzZWQgYW5kIGNvcGllZCB0byB0aGUgVGFyZ2V0IE1hY2hpbmUuPC9saT4KLSAgICAgICA8bGk+UHVyc3VhbnQgdG8gdGhlIFNwZWNpZmljYXRpb24sIHlvdSB3aWxsIHByb3ZpZGUgdG8gdGhlIHVzZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCi0gICAgICAgU29mdHdhcmUgKCJJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQiKSBhbmQgc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBBZ3JlZW1lbnQgc2hhbGwgYmUgYWNjZXNzZWQgZnJvbSB0aGUgVGFyZ2V0Ci0gICAgICAgTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IG11c3QgaW5mb3JtIHRoZSB1c2VyIG9mIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyB0aGF0IGdvdmVybgotICAgICAgIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkgdGhlIGVuZCB1c2VyIGluIHRoZSBtYW5uZXIgcHJlc2NyaWJlZCBpbiBzdWNoIEluc3RhbGxhYmxlIFNvZnR3YXJlIEFncmVlbWVudC4gVXBvbiBzdWNoCi0gICAgICAgaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZSBwcm92aXNpb25pbmcgVGVjaG5vbG9neSB3aWxsIGNvbXBsZXRlIGluc3RhbGxhdGlvbiBvZiB0aGUgSW5zdGFsbGFibGUgU29mdHdhcmUuPC9saT4KLTwvb2w+CisJPG9sPgorCQk8bGk+QSBzZXJpZXMgb2YgYWN0aW9ucyBtYXkgb2NjdXIgKCZxdW90O1Byb3Zpc2lvbmluZworCQkJUHJvY2VzcyZxdW90OykgaW4gd2hpY2ggYSB1c2VyIG1heSBleGVjdXRlIHRoZSBQcm92aXNpb25pbmcKKwkJCVRlY2hub2xvZ3kgb24gYSBtYWNoaW5lICgmcXVvdDtUYXJnZXQgTWFjaGluZSZxdW90Oykgd2l0aCB0aGUgaW50ZW50CisJCQlvZiBpbnN0YWxsaW5nLCBleHRlbmRpbmcgb3IgdXBkYXRpbmcgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgYW4KKwkJCUVjbGlwc2UtYmFzZWQgcHJvZHVjdC48L2xpPgorCQk8bGk+RHVyaW5nIHRoZSBQcm92aXNpb25pbmcgUHJvY2VzcywgdGhlIFByb3Zpc2lvbmluZyBUZWNobm9sb2d5CisJCQltYXkgY2F1c2UgdGhpcmQgcGFydHkgSW5zdGFsbGFibGUgU29mdHdhcmUgb3IgYSBwb3J0aW9uIHRoZXJlb2YgdG8gYmUKKwkJCWFjY2Vzc2VkIGFuZCBjb3BpZWQgdG8gdGhlIFRhcmdldCBNYWNoaW5lLjwvbGk+CisJCTxsaT5QdXJzdWFudCB0byB0aGUgU3BlY2lmaWNhdGlvbiwgeW91IHdpbGwgcHJvdmlkZSB0byB0aGUgdXNlcgorCQkJdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIHRoYXQgZ292ZXJuIHRoZSB1c2Ugb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZSAoJnF1b3Q7SW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50JnF1b3Q7KSBhbmQgc3VjaAorCQkJSW5zdGFsbGFibGUgU29mdHdhcmUgQWdyZWVtZW50IHNoYWxsIGJlIGFjY2Vzc2VkIGZyb20gdGhlIFRhcmdldAorCQkJTWFjaGluZSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIFNwZWNpZmljYXRpb24uIFN1Y2ggSW5zdGFsbGFibGUKKwkJCVNvZnR3YXJlIEFncmVlbWVudCBtdXN0IGluZm9ybSB0aGUgdXNlciBvZiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMKKwkJCXRoYXQgZ292ZXJuIHRoZSBJbnN0YWxsYWJsZSBTb2Z0d2FyZSBhbmQgbXVzdCBzb2xpY2l0IGFjY2VwdGFuY2UgYnkKKwkJCXRoZSBlbmQgdXNlciBpbiB0aGUgbWFubmVyIHByZXNjcmliZWQgaW4gc3VjaCBJbnN0YWxsYWJsZSBTb2Z0d2FyZQorCQkJQWdyZWVtZW50LiBVcG9uIHN1Y2ggaW5kaWNhdGlvbiBvZiBhZ3JlZW1lbnQgYnkgdGhlIHVzZXIsIHRoZQorCQkJcHJvdmlzaW9uaW5nIFRlY2hub2xvZ3kgd2lsbCBjb21wbGV0ZSBpbnN0YWxsYXRpb24gb2YgdGhlIEluc3RhbGxhYmxlCisJCQlTb2Z0d2FyZS48L2xpPgorCTwvb2w+CiAKLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgorCTxoMz5DcnlwdG9ncmFwaHk8L2gzPgogCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgorCTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2gKKwkJeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZAorCQl1c2UsIGFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLgorCQlCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsCisJCXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwKKwkJYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgogCi08cD48c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBPcmFjbGUgQ29ycG9yYXRpb24gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPjwvcD4KLQotCi08L2JvZHk+PC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKwk8cD4KKwkJPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YKKwkJCU9yYWNsZSBDb3Jwb3JhdGlvbiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+CisJPC9wPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC5zb3VyY2UuZmVhdHVyZS9wb20ueG1sCmluZGV4IDhhYzg5NzQuLjdjODMyNDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQuc291cmNlLmZlYXR1cmUvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZS5mZWF0dXJlL3BvbS54bWwKQEAgLTUwLDcgKzUwLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPmpnaXQudHljaG8ucGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdC5mZWF0dXJlPC9ncm91cElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAwNzQ2OTIwLi5mYzdkZmE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMiw0ICsyLDQgQEAKIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKIEJ1bmRsZS1OYW1lOiBKR2l0IFRhcmdldCBQbGF0Zm9ybSBCdW5kbGUKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLmpnaXQudGFyZ2V0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjUudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjUudGFyZ2V0CmluZGV4IDBjMWQ1YmIuLmRmYjVhOGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC41LnRhcmdldAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNS50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL21iYXJiZXJvL2ZyLm9iZW8ucmVsZW5nLnRhcmdldHBsYXRmb3JtIC0tPgotPHRhcmdldCBuYW1lPSJqZ2l0LTQuNSIgc2VxdWVuY2VOdW1iZXI9IjE1MzUxNzYzNDciPgorPHRhcmdldCBuYW1lPSJqZ2l0LTQuNSIgc2VxdWVuY2VOdW1iZXI9IjE1MzUxNzkyNTQiPgogICA8bG9jYXRpb25zPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LmNsaWVudCIgdmVyc2lvbj0iOS40LjgudjIwMTcxMTIxIi8+CkBAIC0zOSw2ICszOSw3IEBACiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5sb2c0ai5zb3VyY2UiIHZlcnNpb249IjEuMi4xNS52MjAxMDEyMDcwODE1Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KICAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGouc291cmNlIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjEuMS4wLnYyMDA5MDUwMTA3MTAwMCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlLnNvdXJjZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QubGlicmFyeSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNTI0LTIyNDYiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC42LnRhcmdldCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC42LnRhcmdldAppbmRleCBlMDVjNDEwLi5kYmZkNjk0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNi50YXJnZXQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjYudGFyZ2V0CkBAIC0xLDcgKzEsNyBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CiA8P3BkZT8+CiA8IS0tIGdlbmVyYXRlZCB3aXRoIGh0dHBzOi8vZ2l0aHViLmNvbS9tYmFyYmVyby9mci5vYmVvLnJlbGVuZy50YXJnZXRwbGF0Zm9ybSAtLT4KLTx0YXJnZXQgbmFtZT0iamdpdC00LjYiIHNlcXVlbmNlTnVtYmVyPSIxNTM1MTc2MzM1Ij4KKzx0YXJnZXQgbmFtZT0iamdpdC00LjYiIHNlcXVlbmNlTnVtYmVyPSIxNTM1MTc5MjQxIj4KICAgPGxvY2F0aW9ucz4KICAgICA8bG9jYXRpb24gaW5jbHVkZU1vZGU9InNsaWNlciIgaW5jbHVkZUFsbFBsYXRmb3Jtcz0iZmFsc2UiIGluY2x1ZGVTb3VyY2U9InRydWUiIGluY2x1ZGVDb25maWd1cmVQaGFzZT0idHJ1ZSIgdHlwZT0iSW5zdGFsbGFibGVVbml0Ij4KICAgICAgIDx1bml0IGlkPSJvcmcuZWNsaXBzZS5qZXR0eS5jbGllbnQiIHZlcnNpb249IjkuNC44LnYyMDE3MTEyMSIvPgpAQCAtMzksNiArMzksNyBAQAogICAgICAgPHVuaXQgaWQ9Im9yZy5hcGFjaGUubG9nNGouc291cmNlIiB2ZXJzaW9uPSIxLjIuMTUudjIwMTAxMjA3MDgxNSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0aiIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqLnNvdXJjZSIgdmVyc2lvbj0iMi4zMy4wLnYyMDE2MDMyMy0yMjE4Ii8+CisgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0IiB2ZXJzaW9uPSIxLjEuMC52MjAwOTA1MDEwNzEwMDAiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QuY29yZS5zb3VyY2UiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmxpYnJhcnkiIHZlcnNpb249IjEuMy4wLnYyMDE4MDUyNC0yMjQ2Ii8+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNy50YXJnZXQgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuNy50YXJnZXQKaW5kZXggMjBiMGEyOS4uYmU3NzE5ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjcudGFyZ2V0CisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC43LnRhcmdldApAQCAtMSw3ICsxLDcgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgogPD9wZGU/PgogPCEtLSBnZW5lcmF0ZWQgd2l0aCBodHRwczovL2dpdGh1Yi5jb20vbWJhcmJlcm8vZnIub2Jlby5yZWxlbmcudGFyZ2V0cGxhdGZvcm0gLS0+Ci08dGFyZ2V0IG5hbWU9ImpnaXQtNC43IiBzZXF1ZW5jZU51bWJlcj0iMTUzNTE3NjMxNCI+Cis8dGFyZ2V0IG5hbWU9ImpnaXQtNC43IiBzZXF1ZW5jZU51bWJlcj0iMTUzNTE3OTIyMSI+CiAgIDxsb2NhdGlvbnM+CiAgICAgPGxvY2F0aW9uIGluY2x1ZGVNb2RlPSJzbGljZXIiIGluY2x1ZGVBbGxQbGF0Zm9ybXM9ImZhbHNlIiBpbmNsdWRlU291cmNlPSJ0cnVlIiBpbmNsdWRlQ29uZmlndXJlUGhhc2U9InRydWUiIHR5cGU9Ikluc3RhbGxhYmxlVW5pdCI+CiAgICAgICA8dW5pdCBpZD0ib3JnLmVjbGlwc2UuamV0dHkuY2xpZW50IiB2ZXJzaW9uPSI5LjQuOC52MjAxNzExMjEiLz4KQEAgLTM5LDYgKzM5LDcgQEAKICAgICAgIDx1bml0IGlkPSJvcmcuYXBhY2hlLmxvZzRqLnNvdXJjZSIgdmVyc2lvbj0iMS4yLjE1LnYyMDEwMTIwNzA4MTUiLz4KICAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGoiIHZlcnNpb249IjIuMzMuMC52MjAxNjAzMjMtMjIxOCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5rb2hzdWtlLmFyZ3M0ai5zb3VyY2UiIHZlcnNpb249IjIuMzMuMC52MjAxNjAzMjMtMjIxOCIvPgorICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdCIgdmVyc2lvbj0iMS4xLjAudjIwMDkwNTAxMDcxMDAwIi8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUiIHZlcnNpb249IjEuMy4wLnYyMDE4MDQyMC0xNTE5Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmhhbWNyZXN0LmNvcmUuc291cmNlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5saWJyYXJ5IiB2ZXJzaW9uPSIxLjMuMC52MjAxODA1MjQtMjI0NiIvPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjgudGFyZ2V0IGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvamdpdC00LjgudGFyZ2V0CmluZGV4IGI4NGZjMjAuLjNkZTE3MmIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L2pnaXQtNC44LnRhcmdldAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9qZ2l0LTQuOC50YXJnZXQKQEAgLTEsNyArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KIDw/cGRlPz4KIDwhLS0gZ2VuZXJhdGVkIHdpdGggaHR0cHM6Ly9naXRodWIuY29tL21iYXJiZXJvL2ZyLm9iZW8ucmVsZW5nLnRhcmdldHBsYXRmb3JtIC0tPgotPHRhcmdldCBuYW1lPSJqZ2l0LTQuOCIgc2VxdWVuY2VOdW1iZXI9IjE1MzUxNzYzMDEiPgorPHRhcmdldCBuYW1lPSJqZ2l0LTQuOCIgc2VxdWVuY2VOdW1iZXI9IjE1MzUxNzkyMDUiPgogICA8bG9jYXRpb25zPgogICAgIDxsb2NhdGlvbiBpbmNsdWRlTW9kZT0ic2xpY2VyIiBpbmNsdWRlQWxsUGxhdGZvcm1zPSJmYWxzZSIgaW5jbHVkZVNvdXJjZT0idHJ1ZSIgaW5jbHVkZUNvbmZpZ3VyZVBoYXNlPSJ0cnVlIiB0eXBlPSJJbnN0YWxsYWJsZVVuaXQiPgogICAgICAgPHVuaXQgaWQ9Im9yZy5lY2xpcHNlLmpldHR5LmNsaWVudCIgdmVyc2lvbj0iOS40LjgudjIwMTcxMTIxIi8+CkBAIC0zOSw2ICszOSw3IEBACiAgICAgICA8dW5pdCBpZD0ib3JnLmFwYWNoZS5sb2c0ai5zb3VyY2UiIHZlcnNpb249IjEuMi4xNS52MjAxMDEyMDcwODE1Ii8+CiAgICAgICA8dW5pdCBpZD0ib3JnLmtvaHN1a2UuYXJnczRqIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KICAgICAgIDx1bml0IGlkPSJvcmcua29oc3VrZS5hcmdzNGouc291cmNlIiB2ZXJzaW9uPSIyLjMzLjAudjIwMTYwMzIzLTIyMTgiLz4KKyAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QiIHZlcnNpb249IjEuMS4wLnYyMDA5MDUwMTA3MTAwMCIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlIiB2ZXJzaW9uPSIxLjMuMC52MjAxODA0MjAtMTUxOSIvPgogICAgICAgPHVuaXQgaWQ9Im9yZy5oYW1jcmVzdC5jb3JlLnNvdXJjZSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNDIwLTE1MTkiLz4KICAgICAgIDx1bml0IGlkPSJvcmcuaGFtY3Jlc3QubGlicmFyeSIgdmVyc2lvbj0iMS4zLjAudjIwMTgwNTI0LTIyNDYiLz4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L29yYml0L1IyMDE4MDYwNjE0NTEyNC1QaG90b24udHBkIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvb3JiaXQvUjIwMTgwNjA2MTQ1MTI0LVBob3Rvbi50cGQKaW5kZXggZjRlYzUwZC4uZWNlYzQxZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvb3JiaXQvUjIwMTgwNjA2MTQ1MTI0LVBob3Rvbi50cGQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvb3JiaXQvUjIwMTgwNjA2MTQ1MTI0LVBob3Rvbi50cGQKQEAgLTE4LDYgKzE4LDcgQEAKIAlvcmcuYXBhY2hlLmxvZzRqLnNvdXJjZSBbMS4yLjE1LnYyMDEwMTIwNzA4MTUsMS4yLjE1LnYyMDEwMTIwNzA4MTVdCiAJb3JnLmtvaHN1a2UuYXJnczRqIFsyLjMzLjAudjIwMTYwMzIzLTIyMTgsMi4zMy4wLnYyMDE2MDMyMy0yMjE4XQogCW9yZy5rb2hzdWtlLmFyZ3M0ai5zb3VyY2UgWzIuMzMuMC52MjAxNjAzMjMtMjIxOCwyLjMzLjAudjIwMTYwMzIzLTIyMThdCisJb3JnLmhhbWNyZXN0IFsxLjEuMC52MjAwOTA1MDEwNzEwMDAsMS4xLjAudjIwMDkwNTAxMDcxMDAwXQogCW9yZy5oYW1jcmVzdC5jb3JlIFsxLjMuMC52MjAxODA0MjAtMTUxOSwxLjMuMC52MjAxODA0MjAtMTUxOV0KIAlvcmcuaGFtY3Jlc3QuY29yZS5zb3VyY2UgWzEuMy4wLnYyMDE4MDQyMC0xNTE5LDEuMy4wLnYyMDE4MDQyMC0xNTE5XQogCW9yZy5oYW1jcmVzdC5saWJyYXJ5IFsxLjMuMC52MjAxODA1MjQtMjI0NiwxLjMuMC52MjAxODA1MjQtMjI0Nl0KQEAgLTQ0LDQgKzQ1LDQgQEAKIAlvcmcuc2xmNGouaW1wbC5sb2c0ajEyLnNvdXJjZSBbMS43LjIudjIwMTMxMTA1LTIyMDAsMS43LjIudjIwMTMxMTA1LTIyMDBdCiAJY29tLmpjcmFmdC5qemxpYiBbMS4xLjEudjIwMTIwNTEwMjMwNSwxLjEuMS52MjAxMjA1MTAyMzA1XQogCWNvbS5qY3JhZnQuanpsaWIuc291cmNlIFsxLjEuMS52MjAxMjA1MTAyMzA1LDEuMS4xLnYyMDEyMDUxMDIzMDVdCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL29yZy5lY2xpcHNlLmpnaXQudGFyZ2V0L3BvbS54bWwKaW5kZXggMjRjNDhlZC4uM2M2MGE4MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvb3JnLmVjbGlwc2UuamdpdC50YXJnZXQvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9vcmcuZWNsaXBzZS5qZ2l0LnRhcmdldC9wb20ueG1sCkBAIC00OSw3ICs0OSw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5qZ2l0LnR5Y2hvLnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudGFyZ2V0PC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGFja2FnaW5nL3BvbS54bWwKaW5kZXggZDNkODVjMy4uM2NiMjFjMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wYWNrYWdpbmcvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBhY2thZ2luZy9wb20ueG1sCkBAIC01Myw3ICs1Myw3IEBACiAKICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgPGFydGlmYWN0SWQ+amdpdC50eWNoby5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CiAKICAgPG5hbWU+SkdpdCBUeWNobyBQYXJlbnQ8L25hbWU+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAyODMwNjUxLi4zOTkxMGNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMjggKzMsMjggQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5CiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAotSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlO3ZlcnNpb249IjQuMTEuOCIsCi0gb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAorSW1wb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5qdW5pdDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAogIG9yZy5oYW1jcmVzdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMi4wLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQucnVsZXM7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvcG9tLnhtbAppbmRleCBlOWI3NzdmLi4zMGMzMmVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Q8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9DTElSZXBvc2l0b3J5VGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NMSVJlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCmluZGV4IDBlZWFiYWIuLjBkMTg5NGIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NMSVJlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NMSVJlcG9zaXRvcnlUZXN0Q2FzZS5qYXZhCkBAIC0xMjIsMTcgKzEyMiwxNyBAQCBwcm90ZWN0ZWQgUGF0aCB3cml0ZUxpbmsoU3RyaW5nIGxpbmssIFN0cmluZyB0YXJnZXQpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gSkdpdFRlc3RVdGlsLndyaXRlTGluayhkYiwgbGluaywgdGFyZ2V0KTsKIAl9CiAKLQlwcm90ZWN0ZWQgRmlsZSB3cml0ZVRyYXNoRmlsZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRhdGEpCisJcHJvdGVjdGVkIEZpbGUgd3JpdGVUcmFzaEZpbGUoU3RyaW5nIG5hbWUsIFN0cmluZyBkYXRhKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEpHaXRUZXN0VXRpbC53cml0ZVRyYXNoRmlsZShkYiwgbmFtZSwgZGF0YSk7CiAJfQogCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFN0cmluZyByZWFkKGZpbmFsIEZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgU3RyaW5nIHJlYWQoRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gSkdpdFRlc3RVdGlsLnJlYWQoZmlsZSk7CiAJfQogCi0JcHJvdGVjdGVkIHZvaWQgZGVsZXRlVHJhc2hGaWxlKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIGRlbGV0ZVRyYXNoRmlsZShTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSkdpdFRlc3RVdGlsLmRlbGV0ZVRyYXNoRmlsZShkYiwgbmFtZSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9DTElHaXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9DTElHaXRDb21tYW5kLmphdmEKaW5kZXggNjllYjE5OC4uNDRhZDc5ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ0xJR2l0Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NMSUdpdENvbW1hbmQuamF2YQpAQCAtMTU3LDcgKzE1Nyw3IEBAIFByaW50V3JpdGVyIGNyZWF0ZUVycm9yV3JpdGVyKCkgewogCX0KIAogCUBPdmVycmlkZQotCXZvaWQgaW5pdChmaW5hbCBUZXh0QnVpbHRpbiBjbWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCBpbml0KFRleHRCdWlsdGluIGNtZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJY21kLm91dHMgPSByZXN1bHQub3V0OwogCQljbWQuZXJycyA9IHJlc3VsdC5lcnI7CiAJCXN1cGVyLmluaXQoY21kKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0FyY2hpdmVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9BcmNoaXZlVGVzdC5qYXZhCmluZGV4IGU1Yzg1ZWIuLmFmZWI1ZWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0FyY2hpdmVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vQXJjaGl2ZVRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CkBAIC02MTIsNyArNjEyLDcgQEAgcHJpdmF0ZSBQcm9jZXNzIHNwYXduQXNzdW1pbmdDb21tYW5kUHJlc2VudChTdHJpbmcuLi4gY21kbGluZSkgewogCiAJcHJpdmF0ZSBCdWZmZXJlZFJlYWRlciByZWFkRnJvbVByb2Nlc3MoUHJvY2VzcyBwcm9jKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIocHJvYy5nZXRJbnB1dFN0cmVhbSgpLCBVVEZfOCkpOworCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihwcm9jLmdldElucHV0U3RyZWFtKCksIENIQVJTRVQpKTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgZ3JlcEZvckVudHJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgbW9kZSwgU3RyaW5nLi4uIGNtZGxpbmUpCkBAIC03MDAsNyArNzAwLDcgQEAgcHJpdmF0ZSB2b2lkIHdyaXRlUmF3KFN0cmluZyBmaWxlbmFtZSwgYnl0ZVtdIGRhdGEpCiAJCXJldHVybiBsLnRvQXJyYXkobmV3IFN0cmluZ1tsLnNpemUoKV0pOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEZ1dHVyZTxPYmplY3Q+IHdyaXRlQXN5bmMoZmluYWwgT3V0cHV0U3RyZWFtIHN0cmVhbSwgZmluYWwgYnl0ZVtdIGRhdGEpIHsKKwlwcml2YXRlIHN0YXRpYyBGdXR1cmU8T2JqZWN0PiB3cml0ZUFzeW5jKE91dHB1dFN0cmVhbSBzdHJlYW0sIGJ5dGVbXSBkYXRhKSB7CiAJCUV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOwogCiAJCXJldHVybiBleGVjdXRvci5zdWJtaXQobmV3IENhbGxhYmxlPE9iamVjdD4oKSB7CkBAIC03NTAsNyArNzUwLDcgQEAgcHVibGljIE9iamVjdCBjYWxsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCS8vIGZvdW5kIQogCQkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKGluLCBVVEZfOCkpOworCQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIENIQVJTRVQpKTsKIAkJCVN0cmluZyBsaW5lOwogCQkJd2hpbGUgKChsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpCiAJCQkJbC5hZGQobGluZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCmluZGV4IDk2ODVkNDUuLmRkZTFhMzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL0ZldGNoVGVzdC5qYXZhCkBAIC05Miw2ICs5MiwxOSBAQCBwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hGb3JjZVVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworCQlTdHJpbmdbXSByZXN1bHQgPSBleGVjdXRlKAorCQkJCSJnaXQgZmV0Y2ggdGVzdCByZWZzL2hlYWRzL21hc3RlcjpyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIpOworCQlhc3NlcnRFcXVhbHMoIiAqIFtuZXcgYnJhbmNoXSAgICAgIG1hc3RlciAgICAgLT4gb3JpZ2luL21hc3RlciIsCisJCQkJcmVzdWx0WzFdKTsKKwkJYXNzZXJ0RXF1YWxzKCIgKiBbbmV3IHRhZ10gICAgICAgICB0YWcgICAgICAgIC0+IHRhZyIsIHJlc3VsdFsyXSk7CisJCXJlbW90ZUdpdC5jb21taXQoKS5zZXRBbWVuZCh0cnVlKS5zZXRNZXNzYWdlKCJhbWVuZGVkIikuY2FsbCgpOworCQlyZXN1bHQgPSBleGVjdXRlKAorCQkJCSJnaXQgZmV0Y2ggLWYgdGVzdCByZWZzL2hlYWRzL21hc3RlcjpyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIpOworCQlhc3NlcnRFcXVhbHMoIiIsIHJlc3VsdFswXSk7CisJfQorCisJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hOb1RhZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJU3RyaW5nW10gcmVzdWx0ID0gZXhlY3V0ZSgiZ2l0IGZldGNoIC0tbm8tdGFncyB0ZXN0IHJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvcmVtb3Rlcy9vcmlnaW4vbWFzdGVyIik7CiAJCWFzc2VydEVxdWFscygiICogW25ldyBicmFuY2hdICAgICAgbWFzdGVyICAgICAtPiBvcmlnaW4vbWFzdGVyIiwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1Byb3h5Q29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vUHJveHlDb25maWdUZXN0LmphdmEKaW5kZXggMDZlN2ExZC4uNDBhMjIzZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vUHJveHlDb25maWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vUHJveHlDb25maWdUZXN0LmphdmEKQEAgLTQ3LDYgKzQ3LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiAKQEAgLTIwMyw3ICsyMDQsNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0KFByb2Nlc3MgcCkKIAkJCXdoaWxlICgobGVuZ3RoID0gaW5wdXRTdHJlYW0ucmVhZChidWZmZXIpKSAhPSAtMSkgewogCQkJCXJlc3VsdC53cml0ZShidWZmZXIsIDAsIGxlbmd0aCk7CiAJCQl9Ci0JCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCJVVEYtOCIpOworCQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1RhZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGdtL1RhZ1Rlc3QuamF2YQppbmRleCAwMzM5MWEwLi5kMzhhNDFkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9UYWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20udGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGFnVGVzdC5qYXZhCkBAIC00MywxMCArNDMsMTEgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuR2l0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNMSVJlcG9zaXRvcnlUZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIApAQCAtNzUsMTMgKzc2LDkgQEAgcHVibGljIHZvaWQgdGVzdFRhZ1R3aWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0VGFnRGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWdpdC50YWcoKS5zZXROYW1lKCJ0ZXN0IikuY2FsbCgpOwotCi0JCVJlZiByZWYgPSBnaXQuZ2V0UmVwb3NpdG9yeSgpLmdldFRhZ3MoKS5nZXQoInRlc3QiKTsKLQkJYXNzZXJ0RXF1YWxzKCJyZWZzL3RhZ3MvdGVzdCIsIHJlZi5nZXROYW1lKCkpOwotCisJCWFzc2VydE5vdE51bGwoZ2l0LmdldFJlcG9zaXRvcnkoKS5leGFjdFJlZigicmVmcy90YWdzL3Rlc3QiKSk7CiAJCWFzc2VydEVxdWFscygiIiwgZXhlY3V0ZVVuY2hlY2tlZCgiZ2l0IHRhZyAtZCB0ZXN0IilbMF0pOwotCQlSZWYgZGVsZXRlZFJlZiA9IGdpdC5nZXRSZXBvc2l0b3J5KCkuZ2V0VGFncygpLmdldCgidGVzdCIpOwotCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVsZXRlZFJlZik7CisJCWFzc2VydE51bGwoZ2l0LmdldFJlcG9zaXRvcnkoKS5leGFjdFJlZigicmVmcy90YWdzL3Rlc3QiKSk7CiAJfQogCiAJQFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL0JVSUxEIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vQlVJTEQKaW5kZXggMDc5MjI2OC4uZGRjODRiZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vQlVJTEQKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vQlVJTEQKQEAgLTI1LDYgKzI1LDEyIEBACiAgICAgXSwKICkKIAoramF2YV9iaW5hcnkoCisgICAgbmFtZSA9ICJqZ2l0IiwKKyAgICBtYWluX2NsYXNzID0gIm9yZy5lY2xpcHNlLmpnaXQucGdtLk1haW4iLAorICAgIHJ1bnRpbWVfZGVwcyA9IFsiOnBnbSJdLAorKQorCiBqYXZhX2ltcG9ydCgKICAgICBuYW1lID0gInNlcnZpY2VzIiwKICAgICBqYXJzID0gWyI6c2VydmljZXNfamFyIl0sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDVlMmRlZjEuLmY4YWEwOTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0zLDcgKzMsNyBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20KLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJfbmFtZQogQnVuZGxlLUFjdGl2YXRpb25Qb2xpY3k6IGxhenkKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpAQCAtMjgsNDkgKzI4LDQ5IEBACiAgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5sb2c7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc2VjdXJpdHk7dmVyc2lvbj0iWzkuNC41LDEwLjAuMCkiLAogIG9yZy5lY2xpcHNlLmpldHR5LnV0aWwudGhyZWFkO3ZlcnNpb249Ils5LjQuNSwxMC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9yczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmJsYW1lO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5kaXJjYWNoZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5rZXRjaDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmxmczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5mczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5tZXJnZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXJjaGl2ZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF3dHVpO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwua2V0Y2g7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0cmVlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmxmcy5zZXJ2ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5sZnMuc2VydmVyLmZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzLnNlcnZlci5zMzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuZmlsdGVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAuYXBhY2hlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcua29oc3VrZS5hcmdzNGo7dmVyc2lvbj0iWzIuMzMuMCwzLjAuMCkiLAogIG9yZy5rb2hzdWtlLmFyZ3M0ai5zcGk7dmVyc2lvbj0iWzIuMzMuMCwzLjAuMCkiCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5jb25zb2xlO3ZlcnNpb249IjQuMTEuOCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5jb25zb2xlO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LApAQCAtODEsMTEgKzgxLDExIEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgamF2YXguc3dpbmcsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20uZGVidWc7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5kZWJ1Zzt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8sCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS44Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0O3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWw7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQucGdtLnRlc3Qsb3JnLmVjbGlwc2UuamdpdC50ZXN0IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQ7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcua29oc3VrZS5hcmdzNGouc3BpLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IGVkYzk0NWMuLjFkNDU3NWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9NRVRBLUlORi9TT1VSQ0UtTUFOSUZFU1QuTUYKQEAgLTMsNSArMyw1IEBACiBCdW5kbGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC5wZ20gLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5zb3VyY2UKIEJ1bmRsZS1WZW5kb3I6IEVjbGlwc2Uub3JnIC0gSkdpdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKLUVjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSI0LjExLjgucXVhbGlmaWVyIjtyb290cz0iLiIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKK0VjbGlwc2UtU291cmNlQnVuZGxlOiBvcmcuZWNsaXBzZS5qZ2l0LnBnbTt2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3BvbS54bWwKaW5kZXggN2QyMTg0Zi4uZGI2NzQ1ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9wb20ueG1sCkBAIC01MCw3ICs1MCw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQucGdtPC9hcnRpZmFjdElkPgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9pbnRlcm5hbC9DTElUZXh0LnByb3BlcnRpZXMKaW5kZXggY2IwZWExYi4uZTkzNzA5MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvcGdtL2ludGVybmFsL0NMSVRleHQucHJvcGVydGllcworKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9wZ20vaW50ZXJuYWwvQ0xJVGV4dC5wcm9wZXJ0aWVzCkBAIC0zNDMsNiArMzQzLDcgQEAKIHVzYWdlX2ZvcmNlQ2hlY2tvdXQ9d2hlbiBzd2l0Y2hpbmcgYnJhbmNoZXMsIHByb2NlZWQgZXZlbiBpZiB0aGUgaW5kZXggb3IgdGhlIHdvcmtpbmcgdHJlZSBkaWZmZXJzIGZyb20gSEVBRAogdXNhZ2VfZm9yY2VDbGVhbj1yZXF1aXJlZCB0byBkZWxldGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKIHVzYWdlX2ZvcmNlQ3JlYXRlQnJhbmNoRXZlbkV4aXN0cz1mb3JjZSBjcmVhdGUgYnJhbmNoIGV2ZW4gZXhpc3RzCit1c2FnZV9mb3JjZWRGZXRjaD1mb3JjZSByZWYgdXBkYXRlIGZldGNoIG9wdGlvbgogdXNhZ2VfZm9yY2VSZXBsYWNpbmdBbkV4aXN0aW5nVGFnPWZvcmNlIHJlcGxhY2luZyBhbiBleGlzdGluZyB0YWcKIHVzYWdlX2dldEFuZFNldE9wdGlvbnM9R2V0IGFuZCBzZXQgcmVwb3NpdG9yeSBvciBnbG9iYWwgb3B0aW9ucwogdXNhZ2VfZ3JvdXBzPVJlc3RyaWN0IG1hbmlmZXN0IHByb2plY3RzIHRvIG9uZXMgd2l0aCBzcGVjaWZpZWQgZ3JvdXAocyksIHVzZSAiLSIgZm9yIGV4Y2x1ZGluZyBbZGVmYXVsdHxhbGx8RzEsRzIsRzN8RzQsLUc1LC1HNl0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9BYnN0cmFjdEZldGNoQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Fic3RyYWN0RmV0Y2hDb21tYW5kLmphdmEKaW5kZXggZjA3NTRiMS4uOTIyM2UwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Fic3RyYWN0RmV0Y2hDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0Fic3RyYWN0RmV0Y2hDb21tYW5kLmphdmEKQEAgLTc0LDEwICs3NCwxMCBAQCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEZldGNoQ29tbWFuZCBleHRlbmRzIFRleHRCdWlsdGluIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiBhbnkuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd0ZldGNoUmVzdWx0KGZpbmFsIEZldGNoUmVzdWx0IHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgc2hvd0ZldGNoUmVzdWx0KEZldGNoUmVzdWx0IHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRiLm5ld09iamVjdFJlYWRlcigpKSB7CiAJCQlib29sZWFuIHNob3duVVJJID0gZmFsc2U7Ci0JCQlmb3IgKGZpbmFsIFRyYWNraW5nUmVmVXBkYXRlIHUgOiByLmdldFRyYWNraW5nUmVmVXBkYXRlcygpKSB7CisJCQlmb3IgKFRyYWNraW5nUmVmVXBkYXRlIHUgOiByLmdldFRyYWNraW5nUmVmVXBkYXRlcygpKSB7CiAJCQkJaWYgKCF2ZXJib3NlICYmIHUuZ2V0UmVzdWx0KCkgPT0gUmVmVXBkYXRlLlJlc3VsdC5OT19DSEFOR0UpCiAJCQkJCWNvbnRpbnVlOwogCkBAIC0xODEsNyArMTgxLDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNhZmVBYmJyZXZpYXRlKE9iamVjdFJlYWRlciByZWFkZXIsIE9iamVjdElkIGlkKSB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBjaGFyIHNob3J0VHlwZU9mKGZpbmFsIFJlZlVwZGF0ZS5SZXN1bHQgcikgeworCXByaXZhdGUgc3RhdGljIGNoYXIgc2hvcnRUeXBlT2YoUmVmVXBkYXRlLlJlc3VsdCByKSB7CiAJCWlmIChyID09IFJlZlVwZGF0ZS5SZXN1bHQuTE9DS19GQUlMVVJFKQogCQkJcmV0dXJuICchJzsKIAkJaWYgKHIgPT0gUmVmVXBkYXRlLlJlc3VsdC5JT19GQUlMVVJFKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0FtYXpvblMzQ2xpZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQW1hem9uUzNDbGllbnQuamF2YQppbmRleCBjY2U4ODliLi5mNGY4ZDhmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQW1hem9uUzNDbGllbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQW1hem9uUzNDbGllbnQuamF2YQpAQCAtMTA1LDcgKzEwNSw3IEBAIHByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewogCQkJfQogCiAJCX0gZWxzZSBpZiAoImxzIi5lcXVhbHMob3ApIHx8ICJsaXN0Ii5lcXVhbHMob3ApKSB7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQlmb3IgKGZpbmFsIFN0cmluZyBrIDogczMubGlzdChidWNrZXQsIGtleSkpCisJCQlmb3IgKFN0cmluZyBrIDogczMubGlzdChidWNrZXQsIGtleSkpCiAJCQkJb3V0dy5wcmludGxuKGspOwogCiAJCX0gZWxzZSBpZiAoInJtIi5lcXVhbHMob3ApIHx8ICJkZWxldGUiLmVxdWFscyhvcCkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQnJhbmNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQnJhbmNoLmphdmEKaW5kZXggZTY2ODVjMi4uYTg4MzU0ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0JyYW5jaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9CcmFuY2guamF2YQpAQCAtMjkyLDcgKzI5Miw3IEBAIGVsc2UgaWYgKHJlbW90ZSkKIAkJCQlhZGRSZWZzKHJlZnMsIENvbnN0YW50cy5SX1JFTU9URVMpOwogCiAJCQkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGIubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCQkJZm9yIChmaW5hbCBFbnRyeTxTdHJpbmcsIFJlZj4gZSA6IHByaW50UmVmcy5lbnRyeVNldCgpKSB7CisJCQkJCWZvciAoRW50cnk8U3RyaW5nLCBSZWY+IGUgOiBwcmludFJlZnMuZW50cnlTZXQoKSkgewogCQkJCQkJZmluYWwgUmVmIHJlZiA9IGUuZ2V0VmFsdWUoKTsKIAkJCQkJCXByaW50SGVhZChyZWFkZXIsIGUuZ2V0S2V5KCksCiAJCQkJCQkJCWN1cnJlbnQuZXF1YWxzKHJlZi5nZXROYW1lKCkpLCByZWYpOwpAQCAtMzAyLDE1ICszMDIsMTUgQEAgZWxzZSBpZiAocmVtb3RlKQogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFkZFJlZnMoZmluYWwgQ29sbGVjdGlvbjxSZWY+IHJlZnMsIGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKLQkJZm9yIChmaW5hbCBSZWYgcmVmIDogUmVmQ29tcGFyYXRvci5zb3J0KHJlZnMpKSB7CisJcHJpdmF0ZSB2b2lkIGFkZFJlZnMoQ29sbGVjdGlvbjxSZWY+IHJlZnMsIFN0cmluZyBwcmVmaXgpIHsKKwkJZm9yIChSZWYgcmVmIDogUmVmQ29tcGFyYXRvci5zb3J0KHJlZnMpKSB7CiAJCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHJlZi5nZXROYW1lKCk7CiAJCQlpZiAobmFtZS5zdGFydHNXaXRoKHByZWZpeCkpCiAJCQkJYWRkUmVmKG5hbWUuc3Vic3RyaW5nKG5hbWUuaW5kZXhPZignLycsIDUpICsgMSksIHJlZik7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgYWRkUmVmKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBSZWYgcmVmKSB7CisJcHJpdmF0ZSB2b2lkIGFkZFJlZihTdHJpbmcgbmFtZSwgUmVmIHJlZikgewogCQlwcmludFJlZnMucHV0KG5hbWUsIHJlZik7CiAJCW1heE5hbWVMZW5ndGggPSBNYXRoLm1heChtYXhOYW1lTGVuZ3RoLCBuYW1lLmxlbmd0aCgpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ29tbWFuZENhdGFsb2cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Db21tYW5kQ2F0YWxvZy5qYXZhCmluZGV4IDgxYWVlZjguLjU3NTRkN2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Db21tYW5kQ2F0YWxvZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Db21tYW5kQ2F0YWxvZy5qYXZhCkBAIC00MywxMSArNDMsMTAgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKQEAgLTg4LDcgKzg3LDcgQEAgcHVibGljIGNsYXNzIENvbW1hbmRDYXRhbG9nIHsKIAkgKiAgICAgICAgICAgIHdhcyBkZXJpdmVkIGZyb20gdGhlIERhc2hMb3dlckNhc2VGb3JtIGNsYXNzIG5hbWUuCiAJICogQHJldHVybiB0aGUgY29tbWFuZCBpbnN0YW5jZTsgbnVsbCBpZiBubyBjb21tYW5kIGV4aXN0cyBieSB0aGF0IG5hbWUuCiAJICovCi0JcHVibGljIHN0YXRpYyBDb21tYW5kUmVmIGdldChmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBzdGF0aWMgQ29tbWFuZFJlZiBnZXQoU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIElOU1RBTkNFLmNvbW1hbmRzLmdldChuYW1lKTsKIAl9CiAKQEAgLTEwOCwxNyArMTA3LDE3IEBAIHB1YmxpYyBzdGF0aWMgQ29tbWFuZFJlZiBnZXQoZmluYWwgU3RyaW5nIG5hbWUpIHsKIAkgKi8KIAlwdWJsaWMgc3RhdGljIENvbW1hbmRSZWZbXSBjb21tb24oKSB7CiAJCWZpbmFsIEFycmF5TGlzdDxDb21tYW5kUmVmPiBjb21tb24gPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJZm9yIChmaW5hbCBDb21tYW5kUmVmIGMgOiBJTlNUQU5DRS5jb21tYW5kcy52YWx1ZXMoKSkKKwkJZm9yIChDb21tYW5kUmVmIGMgOiBJTlNUQU5DRS5jb21tYW5kcy52YWx1ZXMoKSkKIAkJCWlmIChjLmlzQ29tbW9uKCkpCiAJCQkJY29tbW9uLmFkZChjKTsKIAkJcmV0dXJuIHRvU29ydGVkQXJyYXkoY29tbW9uKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBDb21tYW5kUmVmW10gdG9Tb3J0ZWRBcnJheShmaW5hbCBDb2xsZWN0aW9uPENvbW1hbmRSZWY+IGMpIHsKKwlwcml2YXRlIHN0YXRpYyBDb21tYW5kUmVmW10gdG9Tb3J0ZWRBcnJheShDb2xsZWN0aW9uPENvbW1hbmRSZWY+IGMpIHsKIAkJZmluYWwgQ29tbWFuZFJlZltdIHIgPSBjLnRvQXJyYXkobmV3IENvbW1hbmRSZWZbYy5zaXplKCldKTsKIAkJQXJyYXlzLnNvcnQociwgbmV3IENvbXBhcmF0b3I8Q29tbWFuZFJlZj4oKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBDb21tYW5kUmVmIG8xLCBmaW5hbCBDb21tYW5kUmVmIG8yKSB7CisJCQlwdWJsaWMgaW50IGNvbXBhcmUoQ29tbWFuZFJlZiBvMSwgQ29tbWFuZFJlZiBvMikgewogCQkJCXJldHVybiBvMS5nZXROYW1lKCkuY29tcGFyZVRvKG8yLmdldE5hbWUoKSk7CiAJCQl9CiAJCX0pOwpAQCAtMTQ3LDM2ICsxNDYsMjAgQEAgcHJpdmF0ZSBFbnVtZXJhdGlvbjxVUkw+IGNhdGFsb2dzKCkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNjYW4oZmluYWwgVVJMIGNVcmwpIHsKLQkJZmluYWwgQnVmZmVyZWRSZWFkZXIgY0luOwotCQl0cnkgewotCQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBjVXJsLm9wZW5TdHJlYW0oKTsKLQkJCWNJbiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIFVURl84KSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewotCQkJLy8gSWYgd2UgY2Fubm90IHJlYWQgZnJvbSB0aGUgc2VydmljZSBsaXN0LCBnbyB0byB0aGUgbmV4dC4KLQkJCS8vCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgeworCXByaXZhdGUgdm9pZCBzY2FuKFVSTCBjVXJsKSB7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgY0luID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihjVXJsLm9wZW5TdHJlYW0oKSwgQ0hBUlNFVCkpKSB7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGNJbi5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAJCQkJaWYgKGxpbmUubGVuZ3RoKCkgPiAwICYmICFsaW5lLnN0YXJ0c1dpdGgoIiMiKSkgLy8kTk9OLU5MUy0xJAogCQkJCQlsb2FkKGxpbmUpOwogCQkJfQotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKLQkJCS8vIElmIHdlIGZhaWxlZCBkdXJpbmcgYSByZWFkLCBpZ25vcmUgdGhlIGVycm9yLgotCQkJLy8KLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJY0luLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlIHRoZSBjbG9zZSBlcnJvcjsgd2UgYXJlIG9ubHkgcmVhZGluZy4KLQkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlIGVycm9ycwogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGxvYWQoZmluYWwgU3RyaW5nIGNuKSB7CisJcHJpdmF0ZSB2b2lkIGxvYWQoU3RyaW5nIGNuKSB7CiAJCWZpbmFsIENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xheno7CiAJCXRyeSB7CiAJCQljbGF6eiA9IENsYXNzLmZvck5hbWUoY24sIGZhbHNlLCBsZHIpLmFzU3ViY2xhc3MoVGV4dEJ1aWx0aW4uY2xhc3MpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NvbW1hbmRSZWYuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Db21tYW5kUmVmLmphdmEKaW5kZXggMmM5YmMwZC4uMTc3M2RlNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0NvbW1hbmRSZWYuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vQ29tbWFuZFJlZi5qYXZhCkBAIC02NiwyOSArNjYsMjkgQEAgcHVibGljIGNsYXNzIENvbW1hbmRSZWYgewogCiAJYm9vbGVhbiBjb21tb247CiAKLQlDb21tYW5kUmVmKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenopIHsKKwlDb21tYW5kUmVmKENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenopIHsKIAkJdGhpcyhjbGF6eiwgZ3Vlc3NOYW1lKGNsYXp6KSk7CiAJfQogCi0JQ29tbWFuZFJlZihmaW5hbCBDbGFzczw/IGV4dGVuZHMgVGV4dEJ1aWx0aW4+IGNsYXp6LCBmaW5hbCBDb21tYW5kIGNtZCkgeworCUNvbW1hbmRSZWYoQ2xhc3M8PyBleHRlbmRzIFRleHRCdWlsdGluPiBjbGF6eiwgQ29tbWFuZCBjbWQpIHsKIAkJdGhpcyhjbGF6eiwgY21kLm5hbWUoKS5sZW5ndGgoKSA+IDAgPyBjbWQubmFtZSgpIDogZ3Vlc3NOYW1lKGNsYXp6KSk7CiAJCXVzYWdlID0gY21kLnVzYWdlKCk7CiAJCWNvbW1vbiA9IGNtZC5jb21tb24oKTsKIAl9CiAKLQlwcml2YXRlIENvbW1hbmRSZWYoZmluYWwgQ2xhc3M8PyBleHRlbmRzIFRleHRCdWlsdGluPiBjbGF6eiwgZmluYWwgU3RyaW5nIGNuKSB7CisJcHJpdmF0ZSBDb21tYW5kUmVmKENsYXNzPD8gZXh0ZW5kcyBUZXh0QnVpbHRpbj4gY2xhenosIFN0cmluZyBjbikgewogCQlpbXBsID0gY2xheno7CiAJCW5hbWUgPSBjbjsKIAkJdXNhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBndWVzc05hbWUoZmluYWwgQ2xhc3M8PyBleHRlbmRzIFRleHRCdWlsdGluPiBjbGF6eikgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBndWVzc05hbWUoQ2xhc3M8PyBleHRlbmRzIFRleHRCdWlsdGluPiBjbGF6eikgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlpZiAoY2xhenouZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5lY2xpcHNlLmpnaXQucGdtLmRlYnVnLiIpKSAvLyROT04tTkxTLTEkCiAJCQlzLmFwcGVuZCgiZGVidWctIik7IC8vJE5PTi1OTFMtMSQKIAogCQlib29sZWFuIGxhc3RXYXNEYXNoID0gdHJ1ZTsKLQkJZm9yIChmaW5hbCBjaGFyIGMgOiBjbGF6ei5nZXRTaW1wbGVOYW1lKCkudG9DaGFyQXJyYXkoKSkgeworCQlmb3IgKGNoYXIgYyA6IGNsYXp6LmdldFNpbXBsZU5hbWUoKS50b0NoYXJBcnJheSgpKSB7CiAJCQlpZiAoQ2hhcmFjdGVyLmlzVXBwZXJDYXNlKGMpKSB7CiAJCQkJaWYgKCFsYXN0V2FzRGFzaCkKIAkJCQkJcy5hcHBlbmQoJy0nKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EYWVtb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EYWVtb24uamF2YQppbmRleCBkMGFkYTY3Li4zMTliNWUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGFlbW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RhZW1vbi5qYXZhCkBAIC0xNDIsNyArMTQyLDcgQEAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQlwYWNrQ29uZmlnLnNldEV4ZWN1dG9yKEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2wodGhyZWFkcykpOwogCiAJCWZpbmFsIEZpbGVSZXNvbHZlcjxEYWVtb25DbGllbnQ+IHJlc29sdmVyID0gbmV3IEZpbGVSZXNvbHZlcjw+KCk7Ci0JCWZvciAoZmluYWwgRmlsZSBmIDogZGlyZWN0b3J5KSB7CisJCWZvciAoRmlsZSBmIDogZGlyZWN0b3J5KSB7CiAJCQlvdXR3LnByaW50bG4oTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5leHBvcnRpbmcsIGYuZ2V0QWJzb2x1dGVQYXRoKCkpKTsKIAkJCXJlc29sdmVyLmV4cG9ydERpcmVjdG9yeShmKTsKIAkJfQpAQCAtMTU3LDE0ICsxNTcsMTQgQEAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWlmICgwIDw9IHRpbWVvdXQpCiAJCQlkLnNldFRpbWVvdXQodGltZW91dCk7CiAKLQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IGVuYWJsZSkKKwkJZm9yIChTdHJpbmcgbiA6IGVuYWJsZSkKIAkJCXNlcnZpY2UoZCwgbikuc2V0RW5hYmxlZCh0cnVlKTsKLQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IGRpc2FibGUpCisJCWZvciAoU3RyaW5nIG4gOiBkaXNhYmxlKQogCQkJc2VydmljZShkLCBuKS5zZXRFbmFibGVkKGZhbHNlKTsKIAotCQlmb3IgKGZpbmFsIFN0cmluZyBuIDogY2FuT3ZlcnJpZGUpCisJCWZvciAoU3RyaW5nIG4gOiBjYW5PdmVycmlkZSkKIAkJCXNlcnZpY2UoZCwgbikuc2V0T3ZlcnJpZGFibGUodHJ1ZSk7Ci0JCWZvciAoZmluYWwgU3RyaW5nIG4gOiBmb3JiaWRPdmVycmlkZSkKKwkJZm9yIChTdHJpbmcgbiA6IGZvcmJpZE92ZXJyaWRlKQogCQkJc2VydmljZShkLCBuKS5zZXRPdmVycmlkYWJsZShmYWxzZSk7CiAJCWlmIChrZXRjaFNlcnZlclR5cGUgPT0gS2V0Y2hTZXJ2ZXJUeXBlLkxFQURFUikgewogCQkJc3RhcnRLZXRjaExlYWRlcihkKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWUuamF2YQppbmRleCA1OWRlODBjLi40ZWM1ZjA0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGllLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZS5qYXZhCkBAIC02Myw3ICs2Myw3IEBAIHB1YmxpYyBjbGFzcyBEaWUgZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gd2h5CiAJICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBzaG93IHRvIHRoZSBlbmQtdXNlci4KIAkgKi8KLQlwdWJsaWMgRGllKGZpbmFsIFN0cmluZyB3aHkpIHsKKwlwdWJsaWMgRGllKFN0cmluZyB3aHkpIHsKIAkJc3VwZXIod2h5KTsKIAl9CiAKQEAgLTc1LDcgKzc1LDcgQEAgcHVibGljIERpZShmaW5hbCBTdHJpbmcgd2h5KSB7CiAJICogQHBhcmFtIGNhdXNlCiAJICogICAgICAgICAgICB3aHkgdGhlIGNvbW1hbmQgaGFzIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgRGllKGZpbmFsIFN0cmluZyB3aHksIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBEaWUoU3RyaW5nIHdoeSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKHdoeSwgY2F1c2UpOwogCX0KIApAQCAtMTAwLDcgKzEwMCw3IEBAIHB1YmxpYyBEaWUoYm9vbGVhbiBhYm9ydGVkKSB7CiAJICogICAgICAgICAgICBjYW4gYmUgbnVsbAogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwdWJsaWMgRGllKGJvb2xlYW4gYWJvcnRlZCwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHVibGljIERpZShib29sZWFuIGFib3J0ZWQsIFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihjYXVzZSAhPSBudWxsID8gY2F1c2UuZ2V0TWVzc2FnZSgpIDogbnVsbCwgY2F1c2UpOwogCQl0aGlzLmFib3J0ZWQgPSBhYm9ydGVkOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRGlmZi5qYXZhCmluZGV4IGVkNmY3YjQuLjk3ZTNkZjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmYuamF2YQpAQCAtMTcwLDcgKzE3MCw3IEBAIHZvaWQgbm9QcmVmaXgoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGJvb2xlYW4gb24pIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChmaW5hbCBSZXBvc2l0b3J5IHJlcG9zaXRvcnksIGZpbmFsIFN0cmluZyBnaXREaXIpIHsKKwlwcm90ZWN0ZWQgdm9pZCBpbml0KFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgU3RyaW5nIGdpdERpcikgewogCQlzdXBlci5pbml0KHJlcG9zaXRvcnksIGdpdERpcik7CiAJCWRpZmZGbXQgPSBuZXcgRGlmZkZvcm1hdHRlcihuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0cykpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9EaWZmVHJlZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUcmVlLmphdmEKaW5kZXggNTEwNDA2My4uNDJhYWJjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0RpZmZUcmVlLmphdmEKQEAgLTc1LDkgKzc1LDkgQEAgdm9pZCB0cmVlXzAoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgYykgewogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgd2FsayA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB3YWxrID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJd2Fsay5zZXRSZWN1cnNpdmUocmVjdXJzaXZlKTsKLQkJCWZvciAoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgaSA6IHRyZWVzKQorCQkJZm9yIChBYnN0cmFjdFRyZWVJdGVyYXRvciBpIDogdHJlZXMpCiAJCQkJd2Fsay5hZGRUcmVlKGkpOwogCQkJd2Fsay5zZXRGaWx0ZXIoQW5kVHJlZUZpbHRlci5jcmVhdGUoVHJlZUZpbHRlci5BTllfRElGRiwgcGF0aEZpbHRlcikpOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vRmV0Y2guamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaC5qYXZhCmluZGV4IGJjNzYzNzIuLjYxZmQ1MjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9GZXRjaC5qYXZhCkBAIC0xMDAsNiArMTAwLDkgQEAgdm9pZCBub3RhZ3MoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCiAJCXRhZ3MgPSBCb29sZWFuLkZBTFNFOwogCX0KIAorCUBPcHRpb24obmFtZSA9ICItLWZvcmNlIiwgdXNhZ2UgPSAidXNhZ2VfZm9yY2VkRmV0Y2giLCBhbGlhc2VzID0geyAiLWYiIH0pCisJcHJpdmF0ZSBCb29sZWFuIGZvcmNlOworCiAJcHJpdmF0ZSBGZXRjaFJlY3Vyc2VTdWJtb2R1bGVzTW9kZSByZWN1cnNlU3VibW9kdWxlczsKIAogCUBPcHRpb24obmFtZSA9ICItLXJlY3Vyc2Utc3VibW9kdWxlcyIsIHVzYWdlID0gInVzYWdlX3JlY3Vyc2VTdWJtb2R1bGVzIikKQEAgLTE1NSw2ICsxNTgsOSBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWlmIChxdWlldCA9PSBudWxsIHx8ICFxdWlldC5ib29sZWFuVmFsdWUoKSkKIAkJCQlmZXRjaC5zZXRQcm9ncmVzc01vbml0b3IobmV3IFRleHRQcm9ncmVzc01vbml0b3IoZXJydykpOwogCQkJZmV0Y2guc2V0UmVjdXJzZVN1Ym1vZHVsZXMocmVjdXJzZVN1Ym1vZHVsZXMpLnNldENhbGxiYWNrKHRoaXMpOworCQkJaWYgKGZvcmNlICE9IG51bGwpIHsKKwkJCQlmZXRjaC5zZXRGb3JjZVVwZGF0ZShmb3JjZS5ib29sZWFuVmFsdWUoKSk7CisJCQl9CiAKIAkJCUZldGNoUmVzdWx0IHJlc3VsdCA9IGZldGNoLmNhbGwoKTsKIAkJCWlmIChyZXN1bHQuZ2V0VHJhY2tpbmdSZWZVcGRhdGVzKCkuaXNFbXB0eSgpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vR2xvZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0dsb2cuamF2YQppbmRleCBhMDgxYjc4Li4yYjVhZjVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vR2xvZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9HbG9nLmphdmEKQEAgLTc1LDcgKzc1LDcgQEAgY2xhc3MgR2xvZyBleHRlbmRzIFJldldhbGtUZXh0QnVpbHRpbiB7CiAJCWZyYW1lID0gbmV3IEpGcmFtZSgpOwogCQlmcmFtZS5hZGRXaW5kb3dMaXN0ZW5lcihuZXcgV2luZG93QWRhcHRlcigpIHsKIAkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2luZyhmaW5hbCBXaW5kb3dFdmVudCBlKSB7CisJCQlwdWJsaWMgdm9pZCB3aW5kb3dDbG9zaW5nKFdpbmRvd0V2ZW50IGUpIHsKIAkJCQlmcmFtZS5kaXNwb3NlKCk7CiAJCQl9CiAJCX0pOwpAQCAtMTE2LDcgKzExNiw3IEBAIHByb3RlY3RlZCBpbnQgd2Fsa0xvb3AoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgc2hvdyhmaW5hbCBSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIHZvaWQgc2hvdyhSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0xvZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0xvZy5qYXZhCmluZGV4IDc1NTQyZDQuLmFkOTJhNzggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mb2cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTG9nLmphdmEKQEAgLTE4Niw3ICsxODYsNyBAQCB2b2lkIG5vUHJlZml4KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBib29sZWFuIG9uKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGluaXQoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBmaW5hbCBTdHJpbmcgZ2l0RGlyKSB7CisJcHJvdGVjdGVkIHZvaWQgaW5pdChSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBnaXREaXIpIHsKIAkJc3VwZXIuaW5pdChyZXBvc2l0b3J5LCBnaXREaXIpOwogCQlkaWZmRm10ID0gbmV3IERpZmZGb3JtYXR0ZXIobmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dHMpKTsKIAl9CkBAIC0yNDEsNyArMjQxLDcgQEAgcHJpdmF0ZSB2b2lkIGFkZE5vdGVNYXAoU3RyaW5nIG5vdGVzUmVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzaG93KGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBzaG93KFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJb3V0dy5wcmludChDTElUZXh0LmdldCgpLmNvbW1pdExhYmVsKTsKIAkJb3V0dy5wcmludCgiICIpOyAvLyROT04tTkxTLTEkCiAJCWMuZ2V0SWQoKS5jb3B5VG8ob3V0YnVmZmVyLCBvdXR3KTsKQEAgLTI2Niw3ICsyNjYsNyBAQCBwcm90ZWN0ZWQgdm9pZCBzaG93KGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQlvdXR3LnByaW50bG4oKTsKIAkJZmluYWwgU3RyaW5nW10gbGluZXMgPSBjLmdldEZ1bGxNZXNzYWdlKCkuc3BsaXQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChmaW5hbCBTdHJpbmcgcyA6IGxpbmVzKSB7CisJCWZvciAoU3RyaW5nIHMgOiBsaW5lcykgewogCQkJb3V0dy5wcmludCgiICAgICIpOyAvLyROT04tTkxTLTEkCiAJCQlvdXR3LnByaW50KHMpOwogCQkJb3V0dy5wcmludGxuKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTHNSZW1vdGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1JlbW90ZS5qYXZhCmluZGV4IDkwMTNmZjYuLjI3MTFjMTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1JlbW90ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1JlbW90ZS5qYXZhCkBAIC04Myw3ICs4Myw3IEBAIHB1YmxpYyBpbnQgY29tcGFyZShSZWYgcjEsIFJlZiByMikgewogCQkJfQogCQl9KTsKIAkJcmVmcy5hZGRBbGwoY29tbWFuZC5jYWxsKCkpOwotCQlmb3IgKGZpbmFsIFJlZiByIDogcmVmcykgeworCQlmb3IgKFJlZiByIDogcmVmcykgewogCQkJc2hvdyhyLmdldE9iamVjdElkKCksIHIuZ2V0TmFtZSgpKTsKIAkJCWlmIChyLmdldFBlZWxlZE9iamVjdElkKCkgIT0gbnVsbCkKIAkJCQlzaG93KHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSwgci5nZXROYW1lKCkgKyAiXnt9Iik7IC8vJE5PTi1OTFMtMSQKQEAgLTk2LDcgKzk2LDcgQEAgcHJvdGVjdGVkIGJvb2xlYW4gcmVxdWlyZXNSZXBvc2l0b3J5KCkgewogCQlyZXR1cm4gZmFsc2U7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNob3coZmluYWwgQW55T2JqZWN0SWQgaWQsIGZpbmFsIFN0cmluZyBuYW1lKQorCXByaXZhdGUgdm9pZCBzaG93KEFueU9iamVjdElkIGlkLCBTdHJpbmcgbmFtZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW91dHcucHJpbnQoaWQubmFtZSgpKTsKIAkJb3V0dy5wcmludCgnXHQnKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1RyZWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9Mc1RyZWUuamF2YQppbmRleCBjNTdmOWYyLi4wMWZhN2VlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTHNUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL0xzVHJlZS5qYXZhCkBAIC03Myw3ICs3Myw3IEBAIGNsYXNzIExzVHJlZSBleHRlbmRzIFRleHRCdWlsdGluIHsKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgd2FsayA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXdhbGsucmVzZXQoKTsgLy8gZHJvcCB0aGUgZmlyc3QgZW1wdHkgdHJlZSwgd2hpY2ggd2UgZG8gbm90IG5lZWQgaGVyZQogCQkJaWYgKHBhdGhzLnNpemUoKSA+IDApCiAJCQkJd2Fsay5zZXRGaWx0ZXIoUGF0aEZpbHRlckdyb3VwLmNyZWF0ZUZyb21TdHJpbmdzKHBhdGhzKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWFpbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01haW4uamF2YQppbmRleCBhMzc2YmMwLi5hYzUzZGU5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWFpbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NYWluLmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CkBAIC03MSw2ICs3MSw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20uaW50ZXJuYWwuQ0xJVGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQuQ21kTGluZVBhcnNlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQuU3ViY29tbWFuZEhhbmRsZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGUuV2luZG93Q2FjaGVDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuSHR0cFRyYW5zcG9ydDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwLmFwYWNoZS5IdHRwQ2xpZW50Q29ubmVjdGlvbkZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkNhY2hlZEF1dGhlbnRpY2F0b3I7CkBAIC0xMDUsMTAgKzEwNiwxOSBAQCBwdWJsaWMgY2xhc3MgTWFpbiB7CiAKIAlwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBnY0V4ZWN1dG9yOwogCisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1CID0gMTAyNCAqIDEwMjQ7CisKIAkvKioKIAkgKiA8cD5Db25zdHJ1Y3RvciBmb3IgTWFpbi48L3A+CiAJICovCiAJcHVibGljIE1haW4oKSB7CisJCWZpbmFsIFdpbmRvd0NhY2hlQ29uZmlnIGMgPSBuZXcgV2luZG93Q2FjaGVDb25maWcoKTsKKwkJYy5zZXRQYWNrZWRHaXRNTUFQKHRydWUpOworCQljLnNldFBhY2tlZEdpdFdpbmRvd1NpemUoOCAqIDEwMjQpOworCQljLnNldFBhY2tlZEdpdExpbWl0KDEwICogTUIpOworCQljLnNldERlbHRhQmFzZUNhY2hlTGltaXQoMTAgKiBNQik7CisJCWMuc2V0U3RyZWFtRmlsZVRocmVzaG9sZCg1MCAqIE1CKTsKKwkJYy5pbnN0YWxsKCk7CiAJCUh0dHBUcmFuc3BvcnQuc2V0Q29ubmVjdGlvbkZhY3RvcnkobmV3IEh0dHBDbGllbnRDb25uZWN0aW9uRmFjdG9yeSgpKTsKIAkJQnVpbHRpbkxGUy5yZWdpc3RlcigpOwogCQlnY0V4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKG5ldyBUaHJlYWRGYWN0b3J5KCkgewpAQCAtMTMxLDcgKzE0MSw3IEBAIHB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHRhc2tCb2R5KSB7CiAJICogICAgICAgICAgICBhcmd1bWVudHMuCiAJICogQHRocm93cyBqYXZhLmxhbmcuRXhjZXB0aW9uCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIG1ha2Ugc3VyZSBidWlsdC1pbiBmaWx0ZXJzIGFyZSByZWdpc3RlcmVkCiAJCUJ1aWx0aW5MRlMucmVnaXN0ZXIoKTsKIApAQCAtMTU1LDcgKzE2NSw3IEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGZpbmFsIFN0cmluZ1tdIGFyZ3YpIHRocm93cyBFeGNlcHRpb24gewogCSAqICAgICAgICAgICAgYXJndW1lbnRzLgogCSAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHJ1bihmaW5hbCBTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBydW4oU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXdyaXRlciA9IGNyZWF0ZUVycm9yV3JpdGVyKCk7CiAJCXRyeSB7CiAJCQlpZiAoIWluc3RhbGxDb25zb2xlKCkpIHsKQEAgLTIxNywxMCArMjI3LDEwIEBAIHByb3RlY3RlZCB2b2lkIHJ1bihmaW5hbCBTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAl9CiAKIAlQcmludFdyaXRlciBjcmVhdGVFcnJvcldyaXRlcigpIHsKLQkJcmV0dXJuIG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKFN5c3RlbS5lcnIsIFVURl84KSk7CisJCXJldHVybiBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0uZXJyLCBDSEFSU0VUKSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoZmluYWwgU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIENtZExpbmVQYXJzZXIgY2xwID0gbmV3IFN1YmNvbW1hbmRMaW5lUGFyc2VyKHRoaXMpOwogCiAJCXRyeSB7CkBAIC0yNDYsMTIgKzI1NiwxMiBAQCBwcml2YXRlIHZvaWQgZXhlY3V0ZShmaW5hbCBTdHJpbmdbXSBhcmd2KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQl3cml0ZXIucHJpbnRsbihDTElUZXh0LmdldCgpLm1vc3RDb21tb25seVVzZWRDb21tYW5kc0FyZSk7CiAJCQkJZmluYWwgQ29tbWFuZFJlZltdIGNvbW1vbiA9IENvbW1hbmRDYXRhbG9nLmNvbW1vbigpOwogCQkJCWludCB3aWR0aCA9IDA7Ci0JCQkJZm9yIChmaW5hbCBDb21tYW5kUmVmIGMgOiBjb21tb24pIHsKKwkJCQlmb3IgKENvbW1hbmRSZWYgYyA6IGNvbW1vbikgewogCQkJCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjLmdldE5hbWUoKS5sZW5ndGgoKSk7CiAJCQkJfQogCQkJCXdpZHRoICs9IDI7CiAKLQkJCQlmb3IgKGZpbmFsIENvbW1hbmRSZWYgYyA6IGNvbW1vbikgeworCQkJCWZvciAoQ29tbWFuZFJlZiBjIDogY29tbW9uKSB7CiAJCQkJCXdyaXRlci5wcmludCgnICcpOwogCQkJCQl3cml0ZXIucHJpbnQoYy5nZXROYW1lKCkpOwogCQkJCQlmb3IgKGludCBpID0gYy5nZXROYW1lKCkubGVuZ3RoKCk7IGkgPCB3aWR0aDsgaSsrKSB7CkBAIC0yODYsNyArMjk2LDcgQEAgcHJpdmF0ZSB2b2lkIGV4ZWN1dGUoZmluYWwgU3RyaW5nW10gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQl2b2lkIGluaXQoZmluYWwgVGV4dEJ1aWx0aW4gY21kKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgaW5pdChUZXh0QnVpbHRpbiBjbWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChjbWQucmVxdWlyZXNSZXBvc2l0b3J5KCkpIHsKIAkJCWNtZC5pbml0KG9wZW5HaXREaXIoZ2l0ZGlyKSwgbnVsbCk7CiAJCX0gZWxzZSB7CkBAIC0zNTAsNyArMzYwLDcgQEAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbnN0YWxsQ29uc29sZSgpIHsKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5zdGFsbChmaW5hbCBTdHJpbmcgbmFtZSkKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGluc3RhbGwoU3RyaW5nIG5hbWUpCiAJCQl0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwKIAkJCU5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CiAJCXRyeSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWVyZ2VCYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vTWVyZ2VCYXNlLmphdmEKaW5kZXggNjJhODhhZS4uNjg0MmQ4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL01lcmdlQmFzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9NZXJnZUJhc2UuamF2YQpAQCAtNjgsNyArNjgsNyBAQCB2b2lkIGNvbW1pdF8wKGZpbmFsIFJldkNvbW1pdCBjKSB7CiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgYyA6IGNvbW1pdHMpCisJCWZvciAoUmV2Q29tbWl0IGMgOiBjb21taXRzKQogCQkJYXJnV2Fsay5tYXJrU3RhcnQoYyk7CiAJCWFyZ1dhbGsuc2V0UmV2RmlsdGVyKFJldkZpbHRlci5NRVJHRV9CQVNFKTsKIAkJaW50IG1heCA9IGFsbCA/IEludGVnZXIuTUFYX1ZBTFVFIDogMTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9QdXNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUHVzaC5qYXZhCmluZGV4IDMwOWRjYTIuLmJlOGFkMzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9QdXNoLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1B1c2guamF2YQpAQCAtMTQ5LDcgKzE0OSw3IEBAIHByaXZhdGUgdm9pZCBwcmludFB1c2hSZXN1bHQoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlciwgZmluYWwgVVJJaXNoIHVyaSwKIAkJYm9vbGVhbiBldmVyeXRoaW5nVXBUb0RhdGUgPSB0cnVlOwogCiAJCS8vIGF0IGZpcnN0LCBwcmludCB1cC10by1kYXRlIG9uZXMuLi4KLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CiAJCQlpZiAocnJ1LmdldFN0YXR1cygpID09IFN0YXR1cy5VUF9UT19EQVRFKSB7CiAJCQkJaWYgKHZlcmJvc2UpCiAJCQkJCXByaW50UmVmVXBkYXRlUmVzdWx0KHJlYWRlciwgdXJpLCByZXN1bHQsIHJydSk7CkBAIC0xNTcsMTMgKzE1NywxMyBAQCBwcml2YXRlIHZvaWQgcHJpbnRQdXNoUmVzdWx0KGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIsIGZpbmFsIFVSSWlzaCB1cmksCiAJCQkJZXZlcnl0aGluZ1VwVG9EYXRlID0gZmFsc2U7CiAJCX0KIAotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdC5nZXRSZW1vdGVVcGRhdGVzKCkpIHsKIAkJCS8vIC4uLnRoZW4gc3VjY2Vzc2Z1bCB1cGRhdGVzLi4uCiAJCQlpZiAocnJ1LmdldFN0YXR1cygpID09IFN0YXR1cy5PSykKIAkJCQlwcmludFJlZlVwZGF0ZVJlc3VsdChyZWFkZXIsIHVyaSwgcmVzdWx0LCBycnUpOwogCQl9CiAKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQuZ2V0UmVtb3RlVXBkYXRlcygpKSB7CiAJCQkvLyAuLi5maW5hbGx5LCBvdGhlcnMgKHByb2JsZW1hdGljKQogCQkJaWYgKHJydS5nZXRTdGF0dXMoKSAhPSBTdGF0dXMuT0sKIAkJCQkJJiYgcnJ1LmdldFN0YXR1cygpICE9IFN0YXR1cy5VUF9UT19EQVRFKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JlbW90ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JlbW90ZS5qYXZhCmluZGV4IDk0OGNiYzUuLjMzMDhlMTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZW1vdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmVtb3RlLmphdmEKQEAgLTE0Niw3ICsxNDYsNyBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgcHJpbnRVc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgQ21kTGluZVBhcnNlciBjbHApCisJcHVibGljIHZvaWQgcHJpbnRVc2FnZShTdHJpbmcgbWVzc2FnZSwgQ21kTGluZVBhcnNlciBjbHApCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQllcnJ3LnByaW50bG4obWVzc2FnZSk7CiAJCWVycncucHJpbnRsbigiamdpdCByZW1vdGUgWy0tdmVyYm9zZSAoLXYpXSBbLS1oZWxwICgtaCldIik7IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZMaXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2TGlzdC5qYXZhCmluZGV4IDhjODhhNWMuLjEwMWZiYjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZMaXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Jldkxpc3QuamF2YQpAQCAtNTMsNyArNTMsNyBAQAogY2xhc3MgUmV2TGlzdCBleHRlbmRzIFJldldhbGtUZXh0QnVpbHRpbiB7CiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzaG93KGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBzaG93KFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJaWYgKGMuaGFzKFJldkZsYWcuVU5JTlRFUkVTVElORykpCiAJCQlvdXR3LnByaW50KCctJyk7CiAJCWMuZ2V0SWQoKS5jb3B5VG8ob3V0YnVmZmVyLCBvdXR3KTsKQEAgLTY3LDcgKzY3LDcgQEAgcHJvdGVjdGVkIHZvaWQgc2hvdyhmaW5hbCBSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIHNob3coZmluYWwgT2JqZWN0V2FsayBvdywgZmluYWwgUmV2T2JqZWN0IG9iaikKKwlwcm90ZWN0ZWQgdm9pZCBzaG93KE9iamVjdFdhbGsgb3csIFJldk9iamVjdCBvYmopCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJaWYgKG9iai5oYXMoUmV2RmxhZy5VTklOVEVSRVNUSU5HKSkKIAkJCW91dHcucHJpbnQoJy0nKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZQYXJzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JldlBhcnNlLmphdmEKaW5kZXggMjFhZGY3My4uYWMwOGNkNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JldlBhcnNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JldlBhcnNlLmphdmEKQEAgLTQ1LDExICs0NSw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOwotCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwpAQCAtNzQsOCArNzEsNyBAQCBjbGFzcyBSZXZQYXJzZSBleHRlbmRzIFRleHRCdWlsdGluIHsKIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJaWYgKGFsbCkgewotCQkJTWFwPFN0cmluZywgUmVmPiBhbGxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCQlmb3IgKGZpbmFsIFJlZiByIDogYWxsUmVmcy52YWx1ZXMoKSkgeworCQkJZm9yIChSZWYgciA6IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpKSB7CiAJCQkJT2JqZWN0SWQgb2JqZWN0SWQgPSByLmdldE9iamVjdElkKCk7CiAJCQkJLy8gZ2V0UmVmcyBza2lwcyBkYW5nbGluZyBzeW1yZWZzLCBzbyBvYmplY3RJZCBzaG91bGQgbmV2ZXIgYmUKIAkJCQkvLyBudWxsLgpAQCAtOTEsNyArODcsNyBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkJCUNMSVRleHQuZm9ybWF0KENMSVRleHQuZ2V0KCkubmVlZFNpbmdsZVJldmlzaW9uKSk7CiAJCQl9CiAKLQkJCWZvciAoZmluYWwgT2JqZWN0SWQgbyA6IGNvbW1pdHMpIHsKKwkJCWZvciAoT2JqZWN0SWQgbyA6IGNvbW1pdHMpIHsKIAkJCQlvdXR3LnByaW50bG4oby5uYW1lKCkpOwogCQkJfQogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2V2Fsa1RleHRCdWlsdGluLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vUmV2V2Fsa1RleHRCdWlsdGluLmphdmEKaW5kZXggM2ZjOTEwMS4uMTVhYmVhYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1JldldhbGtUZXh0QnVpbHRpbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9SZXZXYWxrVGV4dEJ1aWx0aW4uamF2YQpAQCAtNDcsMTQgKzQ3LDEyIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZDb25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsLkNMSVRleHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5wZ20ub3B0LlBhdGhUcmVlRmlsdGVySGFuZGxlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuRm9sbG93RmlsdGVyOwpAQCAtOTMsNyArOTEsNyBAQCBhYnN0cmFjdCBjbGFzcyBSZXZXYWxrVGV4dEJ1aWx0aW4gZXh0ZW5kcyBUZXh0QnVpbHRpbiB7CiAKIAlwcml2YXRlIGZpbmFsIEVudW1TZXQ8UmV2U29ydD4gc29ydGluZyA9IEVudW1TZXQubm9uZU9mKFJldlNvcnQuY2xhc3MpOwogCi0JcHJpdmF0ZSB2b2lkIGVuYWJsZVJldlNvcnQoZmluYWwgUmV2U29ydCB0eXBlLCBmaW5hbCBib29sZWFuIG9uKSB7CisJcHJpdmF0ZSB2b2lkIGVuYWJsZVJldlNvcnQoUmV2U29ydCB0eXBlLCBib29sZWFuIG9uKSB7CiAJCWlmIChvbikKIAkJCXNvcnRpbmcuYWRkKHR5cGUpOwogCQllbHNlCkBAIC0xMDEsMjIgKzk5LDIyIEBAIHByaXZhdGUgdm9pZCBlbmFibGVSZXZTb3J0KGZpbmFsIFJldlNvcnQgdHlwZSwgZmluYWwgYm9vbGVhbiBvbikgewogCX0KIAogCUBPcHRpb24obmFtZSA9ICItLWRhdGUtb3JkZXIiKQotCXZvaWQgZW5hYmxlRGF0ZU9yZGVyKGZpbmFsIGJvb2xlYW4gb24pIHsKKwl2b2lkIGVuYWJsZURhdGVPcmRlcihib29sZWFuIG9uKSB7CiAJCWVuYWJsZVJldlNvcnQoUmV2U29ydC5DT01NSVRfVElNRV9ERVNDLCBvbik7CiAJfQogCiAJQE9wdGlvbihuYW1lID0gIi0tdG9wby1vcmRlciIpCi0Jdm9pZCBlbmFibGVUb3BvT3JkZXIoZmluYWwgYm9vbGVhbiBvbikgeworCXZvaWQgZW5hYmxlVG9wb09yZGVyKGJvb2xlYW4gb24pIHsKIAkJZW5hYmxlUmV2U29ydChSZXZTb3J0LlRPUE8sIG9uKTsKIAl9CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS1yZXZlcnNlIikKLQl2b2lkIGVuYWJsZVJldmVyc2UoZmluYWwgYm9vbGVhbiBvbikgeworCXZvaWQgZW5hYmxlUmV2ZXJzZShib29sZWFuIG9uKSB7CiAJCWVuYWJsZVJldlNvcnQoUmV2U29ydC5SRVZFUlNFLCBvbik7CiAJfQogCiAJQE9wdGlvbihuYW1lID0gIi0tYm91bmRhcnkiKQotCXZvaWQgZW5hYmxlQm91bmRhcnkoZmluYWwgYm9vbGVhbiBvbikgeworCXZvaWQgZW5hYmxlQm91bmRhcnkoYm9vbGVhbiBvbikgewogCQllbmFibGVSZXZTb3J0KFJldlNvcnQuQk9VTkRBUlksIG9uKTsKIAl9CiAKQEAgLTEzMiwxNyArMTMwLDE3IEBAIHZvaWQgZW5hYmxlQm91bmRhcnkoZmluYWwgYm9vbGVhbiBvbikgewogCXByaXZhdGUgZmluYWwgTGlzdDxSZXZGaWx0ZXI+IHJldkxpbWl0ZXIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogCUBPcHRpb24obmFtZSA9ICItLWF1dGhvciIpCi0Jdm9pZCBhZGRBdXRob3JSZXZGaWx0ZXIoZmluYWwgU3RyaW5nIHdobykgeworCXZvaWQgYWRkQXV0aG9yUmV2RmlsdGVyKFN0cmluZyB3aG8pIHsKIAkJcmV2TGltaXRlci5hZGQoQXV0aG9yUmV2RmlsdGVyLmNyZWF0ZSh3aG8pKTsKIAl9CiAKIAlAT3B0aW9uKG5hbWUgPSAiLS1jb21taXR0ZXIiKQotCXZvaWQgYWRkQ29tbWl0dGVyUmV2RmlsdGVyKGZpbmFsIFN0cmluZyB3aG8pIHsKKwl2b2lkIGFkZENvbW1pdHRlclJldkZpbHRlcihTdHJpbmcgd2hvKSB7CiAJCXJldkxpbWl0ZXIuYWRkKENvbW1pdHRlclJldkZpbHRlci5jcmVhdGUod2hvKSk7CiAJfQogCiAJQE9wdGlvbihuYW1lID0gIi0tZ3JlcCIpCi0Jdm9pZCBhZGRDTWVzc2FnZVJldkZpbHRlcihmaW5hbCBTdHJpbmcgbXNnKSB7CisJdm9pZCBhZGRDTWVzc2FnZVJldkZpbHRlcihTdHJpbmcgbXNnKSB7CiAJCXJldkxpbWl0ZXIuYWRkKE1lc3NhZ2VSZXZGaWx0ZXIuY3JlYXRlKG1zZykpOwogCX0KIApAQCAtMTUzLDcgKzE1MSw3IEBAIHZvaWQgYWRkQ01lc3NhZ2VSZXZGaWx0ZXIoZmluYWwgU3RyaW5nIG1zZykgewogCUBPdmVycmlkZQogCXByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewogCQl3YWxrID0gY3JlYXRlV2FsaygpOwotCQlmb3IgKGZpbmFsIFJldlNvcnQgcyA6IHNvcnRpbmcpCisJCWZvciAoUmV2U29ydCBzIDogc29ydGluZykKIAkJCXdhbGsuc29ydChzLCB0cnVlKTsKIAogCQlpZiAocGF0aEZpbHRlciA9PSBUcmVlRmlsdGVyLkFMTCkgewpAQCAtMTcxLDkgKzE2OSw3IEBAIGVsc2UgaWYgKHJldkxpbWl0ZXIuc2l6ZSgpID4gMSkKIAkJCXdhbGsuc2V0UmV2RmlsdGVyKEFuZFJldkZpbHRlci5jcmVhdGUocmV2TGltaXRlcikpOwogCiAJCWlmIChhbGwpIHsKLQkJCU1hcDxTdHJpbmcsIFJlZj4gcmVmcyA9Ci0JCQkJZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCk7Ci0JCQlmb3IgKFJlZiBhIDogcmVmcy52YWx1ZXMoKSkgeworCQkJZm9yIChSZWYgYSA6IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpKSB7CiAJCQkJT2JqZWN0SWQgb2lkID0gYS5nZXRQZWVsZWRPYmplY3RJZCgpOwogCQkJCWlmIChvaWQgPT0gbnVsbCkKIAkJCQkJb2lkID0gYS5nZXRPYmplY3RJZCgpOwpAQCAtMTkxLDcgKzE4Nyw3IEBAIGVsc2UgaWYgKHJldkxpbWl0ZXIuc2l6ZSgpID4gMSkKIAkJCQl0aHJvdyBkaWUoTWVzc2FnZUZvcm1hdC5mb3JtYXQoQ0xJVGV4dC5nZXQoKS5jYW5ub3RSZXNvbHZlLCBDb25zdGFudHMuSEVBRCkpOwogCQkJY29tbWl0cy5hZGQod2Fsay5wYXJzZUNvbW1pdChoZWFkKSk7CiAJCX0KLQkJZm9yIChmaW5hbCBSZXZDb21taXQgYyA6IGNvbW1pdHMpIHsKKwkJZm9yIChSZXZDb21taXQgYyA6IGNvbW1pdHMpIHsKIAkJCWZpbmFsIFJldkNvbW1pdCByZWFsID0gYXJnV2FsayA9PSB3YWxrID8gYyA6IHdhbGsucGFyc2VDb21taXQoYyk7CiAJCQlpZiAoYy5oYXMoUmV2RmxhZy5VTklOVEVSRVNUSU5HKSkKIAkJCQl3YWxrLm1hcmtVbmludGVyZXN0aW5nKHJlYWwpOwpAQCAtMjM3LDcgKzIzMyw3IEBAIGVsc2UgaWYgKGFyZ1dhbGsgIT0gbnVsbCkKIAkgKi8KIAlwcm90ZWN0ZWQgaW50IHdhbGtMb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWludCBuID0gMDsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgYyA6IHdhbGspIHsKKwkJZm9yIChSZXZDb21taXQgYyA6IHdhbGspIHsKIAkJCWlmICgrK24gPiBtYXhDb3VudCAmJiBtYXhDb3VudCA+PSAwKQogCQkJCWJyZWFrOwogCQkJc2hvdyhjKTsKQEAgLTI2NCw3ICsyNjAsNyBAQCBwcm90ZWN0ZWQgaW50IHdhbGtMb29wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICBUaGUgY3VycmVudCB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdH0KIAkgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBzaG93KGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uOworCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHNob3coUmV2Q29tbWl0IGMpIHRocm93cyBFeGNlcHRpb247CiAKIAkvKioKIAkgKiAiU2hvdyIgdGhlIGN1cnJlbnQgUmV2Q29tbWl0IHdoZW4gY2FsbGVkIGZyb20gdGhlIG1haW4gcHJvY2Vzc2luZyBsb29wLgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Nob3cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9TaG93LmphdmEKaW5kZXggZGUwNDA0NS4uODlhMTVmZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Nob3cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vU2hvdy5qYXZhCkBAIC0xNjcsNyArMTY3LDcgQEAgdm9pZCBub1ByZWZpeChAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgYm9vbGVhbiBvbikgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBpbml0KGZpbmFsIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgZmluYWwgU3RyaW5nIGdpdERpcikgeworCXByb3RlY3RlZCB2b2lkIGluaXQoUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBTdHJpbmcgZ2l0RGlyKSB7CiAJCXN1cGVyLmluaXQocmVwb3NpdG9yeSwgZ2l0RGlyKTsKIAkJZGlmZkZtdCA9IG5ldyBEaWZmRm9ybWF0dGVyKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShvdXRzKSk7CiAJfQpAQCAtMjQ4LDcgKzI0OCw3IEBAIHByaXZhdGUgdm9pZCBzaG93KFJldlRhZyB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkJb3V0dy5wcmludGxuKCk7CiAJCWZpbmFsIFN0cmluZ1tdIGxpbmVzID0gdGFnLmdldEZ1bGxNZXNzYWdlKCkuc3BsaXQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChmaW5hbCBTdHJpbmcgcyA6IGxpbmVzKSB7CisJCWZvciAoU3RyaW5nIHMgOiBsaW5lcykgewogCQkJb3V0dy5wcmludCgiICAgICIpOyAvLyROT04tTkxTLTEkCiAJCQlvdXR3LnByaW50KHMpOwogCQkJb3V0dy5wcmludGxuKCk7CkBAIC0yNTksNyArMjU5LDcgQEAgcHJpdmF0ZSB2b2lkIHNob3coUmV2VGFnIHRhZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCXByaXZhdGUgdm9pZCBzaG93KFJldlRyZWUgb2JqKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB3YWxrID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl3YWxrLnJlc2V0KCk7CiAJCQl3YWxrLmFkZFRyZWUob2JqKTsKIApAQCAtMjczLDcgKzI3Myw3IEBAIHByaXZhdGUgdm9pZCBzaG93KFJldlRyZWUgb2JqKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBzaG93KFJldldhbGsgcncsIGZpbmFsIFJldkNvbW1pdCBjKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgc2hvdyhSZXZXYWxrIHJ3LCBSZXZDb21taXQgYykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWNoYXJbXSBvdXRidWZmZXIgPSBuZXcgY2hhcltDb25zdGFudHMuT0JKRUNUX0lEX0xFTkdUSCAqIDJdOwogCiAJCW91dHcucHJpbnQoQ0xJVGV4dC5nZXQoKS5jb21taXRMYWJlbCk7CkBAIC0yOTIsNyArMjkyLDcgQEAgcHJpdmF0ZSB2b2lkIHNob3coUmV2V2FsayBydywgZmluYWwgUmV2Q29tbWl0IGMpIHRocm93cyBFeGNlcHRpb24gewogCiAJCW91dHcucHJpbnRsbigpOwogCQlmaW5hbCBTdHJpbmdbXSBsaW5lcyA9IGMuZ2V0RnVsbE1lc3NhZ2UoKS5zcGxpdCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGZpbmFsIFN0cmluZyBzIDogbGluZXMpIHsKKwkJZm9yIChTdHJpbmcgcyA6IGxpbmVzKSB7CiAJCQlvdXR3LnByaW50KCIgICAgIik7IC8vJE5PTi1OTFMtMSQKIAkJCW91dHcucHJpbnQocyk7CiAJCQlvdXR3LnByaW50bG4oKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9TaG93UmVmLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vU2hvd1JlZi5qYXZhCmluZGV4IDdiNTlkNDMuLjYzMThhNjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9TaG93UmVmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1Nob3dSZWYuamF2YQpAQCAtNDUsMjMgKzQ1LDE5IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ207CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOwotCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUmVmTWFwOwogCiBAQ29tbWFuZCh1c2FnZSA9ICJ1c2FnZV9TaG93UmVmIikKIGNsYXNzIFNob3dSZWYgZXh0ZW5kcyBUZXh0QnVpbHRpbiB7CiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJZm9yIChmaW5hbCBSZWYgciA6IGdldFNvcnRlZFJlZnMoKSkgeworCQlmb3IgKFJlZiByIDogZ2V0U29ydGVkUmVmcygpKSB7CiAJCQlzaG93KHIuZ2V0T2JqZWN0SWQoKSwgci5nZXROYW1lKCkpOwogCQkJaWYgKHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSAhPSBudWxsKQogCQkJCXNob3coci5nZXRQZWVsZWRPYmplY3RJZCgpLCByLmdldE5hbWUoKSArICJee30iKTsgLy8kTk9OLU5MUy0xJApAQCAtNjksMTQgKzY1LDEzIEBAIHByb3RlY3RlZCB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCXByaXZhdGUgSXRlcmFibGU8UmVmPiBnZXRTb3J0ZWRSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCU1hcDxTdHJpbmcsIFJlZj4gYWxsID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCWlmIChhbGwgaW5zdGFuY2VvZiBSZWZNYXAKLQkJCQl8fCAoYWxsIGluc3RhbmNlb2YgU29ydGVkTWFwICYmICgoU29ydGVkTWFwKSBhbGwpLmNvbXBhcmF0b3IoKSA9PSBudWxsKSkKLQkJCXJldHVybiBhbGwudmFsdWVzKCk7Ci0JCXJldHVybiBSZWZDb21wYXJhdG9yLnNvcnQoYWxsLnZhbHVlcygpKTsKKwkJTGlzdDxSZWY+IGFsbCA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOworCQkvLyBUT0RPKGpybikgY2hlY2sgaWYgd2UgY2FuIHJlaW50cm9kdWNlIGZhc3QtcGF0aCBieSBlLmcuIGltcGxlbWVudGluZworCQkvLyBTb3J0ZWRMaXN0CisJCXJldHVybiBSZWZDb21wYXJhdG9yLnNvcnQoYWxsKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc2hvdyhmaW5hbCBBbnlPYmplY3RJZCBpZCwgZmluYWwgU3RyaW5nIG5hbWUpCisJcHJpdmF0ZSB2b2lkIHNob3coQW55T2JqZWN0SWQgaWQsIFN0cmluZyBuYW1lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0dy5wcmludChpZC5uYW1lKCkpOwogCQlvdXR3LnByaW50KCdcdCcpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1RleHRCdWlsdGluLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGV4dEJ1aWx0aW4uamF2YQppbmRleCBiYzM3NTVkLi43ZTViNTQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGV4dEJ1aWx0aW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVGV4dEJ1aWx0aW4uamF2YQpAQCAtMTI5LDcgKzEyOSw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXh0QnVpbHRpbiB7CiAJLyoqIFJldldhbGsgdXNlZCBkdXJpbmcgY29tbWFuZCBsaW5lIHBhcnNpbmcsIGlmIGl0IHdhcyByZXF1aXJlZC4gKi8KIAlwcm90ZWN0ZWQgUmV2V2FsayBhcmdXYWxrOwogCi0JZmluYWwgdm9pZCBzZXRDb21tYW5kTmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworCWZpbmFsIHZvaWQgc2V0Q29tbWFuZE5hbWUoU3RyaW5nIG5hbWUpIHsKIAkJY29tbWFuZE5hbWUgPSBuYW1lOwogCX0KIApAQCAtMTc2LDcgKzE3Niw3IEBAIHB1YmxpYyB2b2lkIGluaXRSYXcoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBmaW5hbCBTdHJpbmcgZ2l0RGlyLAogCSAqICAgICAgICAgICAgdmFsdWUgb2YgdGhlIHtAY29kZSAtLWdpdC1kaXJ9IGNvbW1hbmQgbGluZSBvcHRpb24sIGlmCiAJICogICAgICAgICAgICB7QGNvZGUgcmVwb3NpdG9yeX0gaXMgbnVsbC4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KGZpbmFsIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSwgZmluYWwgU3RyaW5nIGdpdERpcikgeworCXByb3RlY3RlZCB2b2lkIGluaXQoUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBTdHJpbmcgZ2l0RGlyKSB7CiAJCXRyeSB7CiAJCQlmaW5hbCBTdHJpbmcgb3V0cHV0RW5jb2RpbmcgPSByZXBvc2l0b3J5ICE9IG51bGwgPyByZXBvc2l0b3J5CiAJCQkJCS5nZXRDb25maWcoKS5nZXRTdHJpbmcoImkxOG4iLCBudWxsLCAibG9nT3V0cHV0RW5jb2RpbmciKSA6IG51bGw7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtMjM5LDcgKzIzOSw3IEBAIHB1YmxpYyBmaW5hbCB2b2lkIGV4ZWN1dGUoU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICB0aGUgYXJndW1lbnRzIHN1cHBsaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIGlmIGFueS4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUFyZ3VtZW50cyhmaW5hbCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHBhcnNlQXJndW1lbnRzKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIENtZExpbmVQYXJzZXIgY2xwID0gbmV3IENtZExpbmVQYXJzZXIodGhpcyk7CiAJCWhlbHAgPSBjb250YWluc0hlbHAoYXJncyk7CiAJCXRyeSB7CkBAIC0yNjcsNyArMjY3LDcgQEAgcHJvdGVjdGVkIHZvaWQgcGFyc2VBcmd1bWVudHMoZmluYWwgU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQucGdtLm9wdC5DbWRMaW5lUGFyc2VyfSBvYmplY3QuCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCi0JcHVibGljIHZvaWQgcHJpbnRVc2FnZUFuZEV4aXQoZmluYWwgQ21kTGluZVBhcnNlciBjbHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgcHJpbnRVc2FnZUFuZEV4aXQoQ21kTGluZVBhcnNlciBjbHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXByaW50VXNhZ2VBbmRFeGl0KCIiLCBjbHApOyAvLyROT04tTkxTLTEkCiAJfQogCkBAIC0yODAsNyArMjgwLDcgQEAgcHVibGljIHZvaWQgcHJpbnRVc2FnZUFuZEV4aXQoZmluYWwgQ21kTGluZVBhcnNlciBjbHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5vcHQuQ21kTGluZVBhcnNlcn0gb2JqZWN0LgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyB2b2lkIHByaW50VXNhZ2VBbmRFeGl0KGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBDbWRMaW5lUGFyc2VyIGNscCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBwcmludFVzYWdlQW5kRXhpdChTdHJpbmcgbWVzc2FnZSwgQ21kTGluZVBhcnNlciBjbHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXByaW50VXNhZ2UobWVzc2FnZSwgY2xwKTsKIAkJdGhyb3cgZGllKHRydWUpOwogCX0KQEAgLTI5NSw3ICsyOTUsNyBAQCBwdWJsaWMgdm9pZCBwcmludFVzYWdlQW5kRXhpdChmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgQ21kTGluZVBhcnNlciBjbHApIHRocgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludFVzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBDbWRMaW5lUGFyc2VyIGNscCkKKwlwcm90ZWN0ZWQgdm9pZCBwcmludFVzYWdlKFN0cmluZyBtZXNzYWdlLCBDbWRMaW5lUGFyc2VyIGNscCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWVycncucHJpbnRsbihtZXNzYWdlKTsKIAkJZXJydy5wcmludCgiamdpdCAiKTsgLy8kTk9OLU5MUy0xJApAQCAtMzYxLDcgKzM2MSw3IEBAIHB1YmxpYyBSZXBvc2l0b3J5IGdldFJlcG9zaXRvcnkoKSB7CiAJCXJldHVybiBkYjsKIAl9CiAKLQlPYmplY3RJZCByZXNvbHZlKGZpbmFsIFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCU9iamVjdElkIHJlc29sdmUoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIE9iamVjdElkIHIgPSBkYi5yZXNvbHZlKHMpOwogCQlpZiAociA9PSBudWxsKQogCQkJdGhyb3cgZGllKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENMSVRleHQuZ2V0KCkubm90QVJldmlzaW9uLCBzKSk7CkBAIC0zNzUsNyArMzc1LDcgQEAgT2JqZWN0SWQgcmVzb2x2ZShmaW5hbCBTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgIHRleHR1YWwgZXhwbGFuYXRpb24KIAkgKiBAcmV0dXJuIGEgcnVudGltZSBleGNlcHRpb24gdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byB0aHJvdwogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRGllIGRpZShmaW5hbCBTdHJpbmcgd2h5KSB7CisJcHJvdGVjdGVkIHN0YXRpYyBEaWUgZGllKFN0cmluZyB3aHkpIHsKIAkJcmV0dXJuIG5ldyBEaWUod2h5KTsKIAl9CiAKQEAgLTM4OCw3ICszODgsNyBAQCBwcm90ZWN0ZWQgc3RhdGljIERpZSBkaWUoZmluYWwgU3RyaW5nIHdoeSkgewogCSAqICAgICAgICAgICAgd2h5IHRoZSBjb21tYW5kIGhhcyBmYWlsZWQuCiAJICogQHJldHVybiBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gdGhyb3cKIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIERpZSBkaWUoZmluYWwgU3RyaW5nIHdoeSwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHJvdGVjdGVkIHN0YXRpYyBEaWUgZGllKFN0cmluZyB3aHksIFRocm93YWJsZSBjYXVzZSkgewogCQlyZXR1cm4gbmV3IERpZSh3aHksIGNhdXNlKTsKIAl9CiAKQEAgLTQxNiw3ICs0MTYsNyBAQCBwcm90ZWN0ZWQgc3RhdGljIERpZSBkaWUoYm9vbGVhbiBhYm9ydGVkKSB7CiAJICogQHJldHVybiBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gdGhyb3cKIAkgKiBAc2luY2UgNC4yCiAJICovCi0JcHJvdGVjdGVkIHN0YXRpYyBEaWUgZGllKGJvb2xlYW4gYWJvcnRlZCwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisJcHJvdGVjdGVkIHN0YXRpYyBEaWUgZGllKGJvb2xlYW4gYWJvcnRlZCwgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXJldHVybiBuZXcgRGllKGFib3J0ZWQsIGNhdXNlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9WZXJzaW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vVmVyc2lvbi5qYXZhCmluZGV4IDVlZmMwM2IuLjU4YWNjNWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9WZXJzaW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL1ZlcnNpb24uamF2YQpAQCAtOTYsMTQgKzk2LDkgQEAgcHJpdmF0ZSBTdHJpbmcgZ2V0QnVuZGxlVmVyc2lvbigpIHsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QnVuZGxlVmVyc2lvbihVUkwgdXJsKSB7Ci0JCXRyeSB7Ci0JCQlJbnB1dFN0cmVhbSBpcyA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQl0cnkgewotCQkJCU1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KGlzKTsKLQkJCQlyZXR1cm4gbWFuaWZlc3QuZ2V0TWFpbkF0dHJpYnV0ZXMoKS5nZXRWYWx1ZSgiQnVuZGxlLVZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkJfSBmaW5hbGx5IHsKLQkJCQlpcy5jbG9zZSgpOwotCQkJfQorCQl0cnkgKElucHV0U3RyZWFtIGlzID0gdXJsLm9wZW5TdHJlYW0oKSkgeworCQkJTWFuaWZlc3QgbWFuaWZlc3QgPSBuZXcgTWFuaWZlc3QoaXMpOworCQkJcmV0dXJuIG1hbmlmZXN0LmdldE1haW5BdHRyaWJ1dGVzKCkuZ2V0VmFsdWUoIkJ1bmRsZS1WZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJLy8gZG8gbm90aGluZyAtIHdpbGwgcmV0dXJuIG51bGwKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL0JlbmNobWFya1JlZnRhYmxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvQmVuY2htYXJrUmVmdGFibGUuamF2YQppbmRleCAyNDhlYWFjLi41NzVhMTIyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvQmVuY2htYXJrUmVmdGFibGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvQmVuY2htYXJrUmVmdGFibGUuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGdtLmRlYnVnOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5IRUFEOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuTUFTVEVSOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9IRUFEUzsKQEAgLTE1NCw3ICsxNTQsNyBAQCBwcml2YXRlIFJlZkxpc3Q8UmVmPiByZWFkTHNSZW1vdGUoKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBGaWxlTm90Rm91bmRFeGNlcHRpb24gewogCQlSZWZMaXN0LkJ1aWxkZXI8UmVmPiBsaXN0ID0gbmV3IFJlZkxpc3QuQnVpbGRlcjw+KCk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0obHNSZW1vdGVQYXRoKSwgVVRGXzgpKSkgeworCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0obHNSZW1vdGVQYXRoKSwgQ0hBUlNFVCkpKSB7CiAJCQlSZWYgbGFzdCA9IG51bGw7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9NYWtlQ2FjaGVUcmVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvTWFrZUNhY2hlVHJlZS5qYXZhCmluZGV4IDEyN2U1NDEuLjJhMTMyNmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9NYWtlQ2FjaGVUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL01ha2VDYWNoZVRyZWUuamF2YQpAQCAtNjUsNyArNjUsNyBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc2hvdyh0cmVlKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc2hvdyhmaW5hbCBEaXJDYWNoZVRyZWUgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgc2hvdyhEaXJDYWNoZVRyZWUgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0dy5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENMSVRleHQuZ2V0KCkuY2FjaGVUcmVlUGF0aEluZm8sCiAJCQkJdHJlZS5nZXRQYXRoU3RyaW5nKCksIHZhbHVlT2YodHJlZS5nZXRFbnRyeVNwYW4oKSksCiAJCQkJdmFsdWVPZih0cmVlLmdldENoaWxkQ291bnQoKSkpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkQ29tbWl0R3JhcGguamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkQ29tbWl0R3JhcGguamF2YQppbmRleCAyZTQxZWVjLi4yZDE2ZmVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvUmVidWlsZENvbW1pdEdyYXBoLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1JlYnVpbGRDb21taXRHcmFwaC5qYXZhCkBAIC00Myw4ICs0Myw2IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5wZ20uZGVidWc7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOwotCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CkBAIC0xMTcsNyArMTE1LDcgQEAgY2xhc3MgUmVidWlsZENvbW1pdEdyYXBoIGV4dGVuZHMgVGV4dEJ1aWx0aW4gewogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmICghcmVhbGx5ICYmICFkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQUxMKS5pc0VtcHR5KCkpIHsKKwkJaWYgKCFyZWFsbHkgJiYgZGIuZ2V0UmVmRGF0YWJhc2UoKS5oYXNSZWZzKCkpIHsKIAkJCUZpbGUgZGlyZWN0b3J5ID0gZGIuZ2V0RGlyZWN0b3J5KCk7CiAJCQlTdHJpbmcgYWJzb2x1dGVQYXRoID0gZGlyZWN0b3J5ID09IG51bGwgPyAibnVsbCIgLy8kTk9OLU5MUy0xJAogCQkJCQk6IGRpcmVjdG9yeS5nZXRBYnNvbHV0ZVBhdGgoKTsKQEAgLTIyNCw3ICsyMjIsNyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBUb1Jld3JpdGUgewogCiAJCU9iamVjdElkIG5ld0lkOwogCi0JCVRvUmV3cml0ZShmaW5hbCBPYmplY3RJZCBvLCBmaW5hbCBsb25nIHQsIGZpbmFsIE9iamVjdElkW10gcCkgeworCQlUb1Jld3JpdGUoT2JqZWN0SWQgbywgbG9uZyB0LCBPYmplY3RJZFtdIHApIHsKIAkJCW9sZElkID0gbzsKIAkJCWNvbW1pdFRpbWUgPSB0OwogCQkJb2xkUGFyZW50cyA9IHA7CkBAIC0yNDcsOCArMjQ1LDcgQEAgcHJpdmF0ZSB2b2lkIGRldGFjaEhlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJcHJpdmF0ZSB2b2lkIGRlbGV0ZUFsbFJlZnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKGRiKTsKLQkJTWFwPFN0cmluZywgUmVmPiByZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZWZzLnZhbHVlcygpKSB7CisJCWZvciAoUmVmIHIgOiBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKSkgewogCQkJaWYgKENvbnN0YW50cy5IRUFELmVxdWFscyhyLmdldE5hbWUoKSkpCiAJCQkJY29udGludWU7CiAJCQlmaW5hbCBSZWZVcGRhdGUgdSA9IGRiLnVwZGF0ZVJlZihyLmdldE5hbWUoKSk7CkBAIC0yNjEsNyArMjU4LDcgQEAgcHJpdmF0ZSB2b2lkIHJlY3JlYXRlUmVmcygpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBNYXA8U3RyaW5nLCBSZWY+IHJlZnMgPSBjb21wdXRlTmV3UmVmcygpOwogCQluZXcgUmVmV3JpdGVyKHJlZnMudmFsdWVzKCkpIHsKIAkJCUBPdmVycmlkZQotCQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVGaWxlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBieXRlW10gY29udGVudCkKKwkJCXByb3RlY3RlZCB2b2lkIHdyaXRlRmlsZShTdHJpbmcgbmFtZSwgYnl0ZVtdIGNvbnRlbnQpCiAJCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIG5hbWUpOwogCQkJCWZpbmFsIExvY2tGaWxlIGxjayA9IG5ldyBMb2NrRmlsZShmaWxlKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9SZWJ1aWxkUmVmVHJlZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1JlYnVpbGRSZWZUcmVlLmphdmEKaW5kZXggMzE3MjQ4My4uMDYzNjAwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1JlYnVpbGRSZWZUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1JlYnVpbGRSZWZUcmVlLmphdmEKQEAgLTE1NCwxNCArMTU0LDE0IEBAIHByaXZhdGUgUmVmVHJlZSByZWJ1aWxkKFJlZkRhdGFiYXNlIHJlZmRiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCQloZWFkKSk7CiAJCX0KIAotCQlmb3IgKFJlZiByIDogcmVmZGIuZ2V0UmVmcyhSZWZEYXRhYmFzZS5BTEwpLnZhbHVlcygpKSB7CisJCWZvciAoUmVmIHIgOiByZWZkYi5nZXRSZWZzKCkpIHsKIAkJCWlmIChyLmdldE5hbWUoKS5lcXVhbHModHhuQ29tbWl0dGVkKSB8fCByLmdldE5hbWUoKS5lcXVhbHMoSEVBRCkKIAkJCQkJfHwgci5nZXROYW1lKCkuc3RhcnRzV2l0aCh0eG5OYW1lc3BhY2UpKSB7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCQljbWRzLmFkZChuZXcgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWUuQ29tbWFuZCgKIAkJCQkJbnVsbCwKLQkJCQkJZGIucGVlbChyKSkpOworCQkJCQlkYi5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocikpKTsKIAkJfQogCQl0cmVlLmFwcGx5KGNtZHMpOwogCQlyZXR1cm4gdHJlZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q2FjaGVUcmVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd0NhY2hlVHJlZS5qYXZhCmluZGV4IDIwZmE0YTMuLjZiOTdlMDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q2FjaGVUcmVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dDYWNoZVRyZWUuamF2YQpAQCAtNjcsNyArNjcsNyBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc2hvdyh0cmVlKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc2hvdyhmaW5hbCBEaXJDYWNoZVRyZWUgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgc2hvdyhEaXJDYWNoZVRyZWUgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0dy5wcmludGxuKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KENMSVRleHQuZ2V0KCkuY2FjaGVUcmVlUGF0aEluZm8sCiAJCQkJdHJlZS5nZXRQYXRoU3RyaW5nKCksIHZhbHVlT2YodHJlZS5nZXRFbnRyeVNwYW4oKSksCiAJCQkJdmFsdWVPZih0cmVlLmdldENoaWxkQ291bnQoKSkpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q29tbWFuZHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93Q29tbWFuZHMuamF2YQppbmRleCBhOTYwZWM2Li5hZjU2ZDY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd0NvbW1hbmRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dDb21tYW5kcy5qYXZhCkBAIC02NSwxMSArNjUsMTEgQEAgcHJvdGVjdGVkIHZvaWQgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIENvbW1hbmRSZWZbXSBsaXN0ID0gQ29tbWFuZENhdGFsb2cuYWxsKCk7CiAKIAkJaW50IHdpZHRoID0gMDsKLQkJZm9yIChmaW5hbCBDb21tYW5kUmVmIGMgOiBsaXN0KQorCQlmb3IgKENvbW1hbmRSZWYgYyA6IGxpc3QpCiAJCQl3aWR0aCA9IE1hdGgubWF4KHdpZHRoLCBjLmdldE5hbWUoKS5sZW5ndGgoKSk7CiAJCXdpZHRoICs9IDI7CiAKLQkJZm9yIChmaW5hbCBDb21tYW5kUmVmIGMgOiBsaXN0KSB7CisJCWZvciAoQ29tbWFuZFJlZiBjIDogbGlzdCkgewogCQkJZXJydy5wcmludChjLmlzQ29tbW9uKCkgPyAnKicgOiAnICcpOwogCQkJZXJydy5wcmludCgnICcpOwogCkBAIC04Nyw3ICs4Nyw3IEBAIHN0YXRpYyBlbnVtIEZvcm1hdCB7CiAJCS8qKiAqLwogCQlVU0FHRSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXZvaWQgcHJpbnQoVGhyb3dpbmdQcmludFdyaXRlciBlcnIsIGZpbmFsIENvbW1hbmRSZWYgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCXZvaWQgcHJpbnQoVGhyb3dpbmdQcmludFdyaXRlciBlcnIsIENvbW1hbmRSZWYgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQlTdHJpbmcgdXNhZ2UgPSBjLmdldFVzYWdlKCk7CiAJCQkJaWYgKHVzYWdlICE9IG51bGwgJiYgdXNhZ2UubGVuZ3RoKCkgPiAwKQogCQkJCQllcnIucHJpbnQoQ0xJVGV4dC5nZXQoKS5yZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyh1c2FnZSkpOwpAQCAtOTcsNyArOTcsNyBAQCB2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBmaW5hbCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8qKiAqLwogCQlDTEFTU0VTIHsKIAkJCUBPdmVycmlkZQotCQkJdm9pZCBwcmludChUaHJvd2luZ1ByaW50V3JpdGVyIGVyciwgZmluYWwgQ29tbWFuZFJlZiBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJdm9pZCBwcmludChUaHJvd2luZ1ByaW50V3JpdGVyIGVyciwgQ29tbWFuZFJlZiBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWVyci5wcmludChjLmdldEltcGxlbWVudGF0aW9uQ2xhc3NOYW1lKCkpOwogCQkJfQogCQl9LApAQCAtMTA1LDcgKzEwNSw3IEBAIHZvaWQgcHJpbnQoVGhyb3dpbmdQcmludFdyaXRlciBlcnIsIGZpbmFsIENvbW1hbmRSZWYgYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJLyoqICovCiAJCVVSTFMgewogCQkJQE92ZXJyaWRlCi0JCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBmaW5hbCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCQl2b2lkIHByaW50KFRocm93aW5nUHJpbnRXcml0ZXIgZXJyLCBDb21tYW5kUmVmIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJZmluYWwgQ2xhc3NMb2FkZXIgbGRyID0gYy5nZXRJbXBsZW1lbnRhdGlvbkNsYXNzTG9hZGVyKCk7CiAKIAkJCQlTdHJpbmcgY24gPSBjLmdldEltcGxlbWVudGF0aW9uQ2xhc3NOYW1lKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd1BhY2tEZWx0YS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1Nob3dQYWNrRGVsdGEuamF2YQppbmRleCBiYmMxYjBmLi5mMzllY2JlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvU2hvd1BhY2tEZWx0YS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9TaG93UGFja0RlbHRhLmphdmEKQEAgLTEyNSwxMiArMTI1LDEzIEBAIHB1YmxpYyB2b2lkIHNlbGVjdChPYmplY3RUb1BhY2sgb3RwLCBTdG9yZWRPYmplY3RSZXByZXNlbnRhdGlvbiBuZXh0KSB7CiAJCQlwdHIrKzsKIAkJcHRyKys7CiAKLQkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIiAvKiBqYXZhIDcgKi8pCi0JCVRlbXBvcmFyeUJ1ZmZlci5IZWFwIHJhdyA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcChidWZBcnJheS5sZW5ndGgpOwotCQlJbmZsYXRlcklucHV0U3RyZWFtIGluZiA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKAotCQkJCW5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZBcnJheSwgcHRyLCBidWZBcnJheS5sZW5ndGgpKTsKLQkJcmF3LmNvcHkoaW5mKTsKLQkJaW5mLmNsb3NlKCk7Ci0JCXJldHVybiByYXcudG9CeXRlQXJyYXkoKTsKKwkJdHJ5IChUZW1wb3JhcnlCdWZmZXIuSGVhcCByYXcgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoCisJCQkJYnVmQXJyYXkubGVuZ3RoKTsKKwkJCQlJbmZsYXRlcklucHV0U3RyZWFtIGluZiA9IG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKAorCQkJCQkJbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ1ZkFycmF5LCBwdHIsCisJCQkJCQkJCWJ1ZkFycmF5Lmxlbmd0aCkpKSB7CisJCQlyYXcuY29weShpbmYpOworCQkJcmV0dXJuIHJhdy50b0J5dGVBcnJheSgpOworCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1RleHRIYXNoRnVuY3Rpb25zLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvVGV4dEhhc2hGdW5jdGlvbnMuamF2YQppbmRleCA4M2I3YmNlLi5iYjUxYjUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvVGV4dEhhc2hGdW5jdGlvbnMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvVGV4dEhhc2hGdW5jdGlvbnMuamF2YQpAQCAtMjg4LDExICsyODgsOCBAQCBwcm90ZWN0ZWQgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWVsc2UKIAkJCQlyYi5maW5kR2l0RGlyKGRpcik7CiAKLQkJCVJlcG9zaXRvcnkgcmVwbyA9IHJiLmJ1aWxkKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChSZXBvc2l0b3J5IHJlcG8gPSByYi5idWlsZCgpKSB7CiAJCQkJcnVuKHJlcG8pOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlyZXBvLmNsb3NlKCk7CiAJCQl9CiAJCX0KIAl9CkBAIC01MDIsNyArNDk5LDcgQEAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCB0YWJsZUJpdHMoZmluYWwgaW50IHN6KSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlQml0cyhpbnQgc3opIHsKIAkJaW50IGJpdHMgPSAzMSAtIEludGVnZXIubnVtYmVyT2ZMZWFkaW5nWmVyb3Moc3opOwogCQlpZiAoYml0cyA9PSAwKQogCQkJYml0cyA9IDE7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvV3JpdGVSZWZ0YWJsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL2RlYnVnL1dyaXRlUmVmdGFibGUuamF2YQppbmRleCA2Y2JjMWIwLi5jNWVhMDI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vZGVidWcvV3JpdGVSZWZ0YWJsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9kZWJ1Zy9Xcml0ZVJlZnRhYmxlLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5kZWJ1ZzsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuSEVBRDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk1BU1RFUjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfSEVBRFM7CkBAIC0xOTIsNyArMTkyLDcgQEAgcHJpdmF0ZSB2b2lkIHByaW50ZihTdHJpbmcgZm10LCBPYmplY3QuLi4gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlzdGF0aWMgTGlzdDxSZWY+IHJlYWRSZWZzKFN0cmluZyBpbnB1dEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUxpc3Q8UmVmPiByZWZzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlKSwgVVRGXzgpKSkgeworCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGlucHV0RmlsZSksIENIQVJTRVQpKSkgewogCQkJU3RyaW5nIGxpbmU7CiAJCQl3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAJCQkJT2JqZWN0SWQgaWQgPSBPYmplY3RJZC5mcm9tU3RyaW5nKGxpbmUuc3Vic3RyaW5nKDAsIDQwKSk7CkBAIC0yMjcsNyArMjI3LDcgQEAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxMb2dFbnRyeT4gcmVhZExvZyhTdHJpbmcgbG9nUGF0aCkKIAogCQlMaXN0PExvZ0VudHJ5PiBsb2cgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKLQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShsb2dQYXRoKSwgVVRGXzgpKSkgeworCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihuZXcgRmlsZUlucHV0U3RyZWFtKGxvZ1BhdGgpLCBDSEFSU0VUKSkpIHsKIAkJCUBTdXBwcmVzc1dhcm5pbmdzKCJubHMiKQogCQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIoW14sXSspIiAvLyAxOiByZWYKIAkJCQkJKyAiLChbMC05XSsoPzpbLl1bMC05XSspPykiIC8vIDI6IHRpbWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvQWJzdHJhY3RUcmVlSXRlcmF0b3JIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L0Fic3RyYWN0VHJlZUl0ZXJhdG9ySGFuZGxlci5qYXZhCmluZGV4IDZmZTc5MjcuLmExNGY2NTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvQWJzdHJhY3RUcmVlSXRlcmF0b3JIYW5kbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9BYnN0cmFjdFRyZWVJdGVyYXRvckhhbmRsZXIuamF2YQpAQCAtOTgsNyArOTgsNyBAQCBwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3JIYW5kbGVyKGZpbmFsIENtZExpbmVQYXJzZXIgcGFyc2VyLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAKIAkJaWYgKG5ldyBGaWxlKG5hbWUpLmlzRGlyZWN0b3J5KCkpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvQ21kTGluZVBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9DbWRMaW5lUGFyc2VyLmphdmEKaW5kZXggZTA3MWJkZi4uNWNjOThjYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9DbWRMaW5lUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9DbWRMaW5lUGFyc2VyLmphdmEKQEAgLTExMSw3ICsxMTEsNyBAQCBwdWJsaWMgY2xhc3MgQ21kTGluZVBhcnNlciBleHRlbmRzIG9yZy5rb2hzdWtlLmFyZ3M0ai5DbWRMaW5lUGFyc2VyIHsKIAkgKiAgICAgICAgICAgICBpZiB0aGUgb3B0aW9uIGJlYW4gY2xhc3MgaXMgdXNpbmcgYXJnczRqIGFubm90YXRpb25zCiAJICogICAgICAgICAgICAgaW5jb3JyZWN0bHkuCiAJICovCi0JcHVibGljIENtZExpbmVQYXJzZXIoZmluYWwgT2JqZWN0IGJlYW4pIHsKKwlwdWJsaWMgQ21kTGluZVBhcnNlcihPYmplY3QgYmVhbikgewogCQl0aGlzKGJlYW4sIG51bGwpOwogCX0KIApAQCAtMTMwLDcgKzEzMCw3IEBAIHB1YmxpYyBDbWRMaW5lUGFyc2VyKGZpbmFsIE9iamVjdCBiZWFuKSB7CiAJICogICAgICAgICAgICAgaWYgdGhlIG9wdGlvbiBiZWFuIGNsYXNzIGlzIHVzaW5nIGFyZ3M0aiBhbm5vdGF0aW9ucwogCSAqICAgICAgICAgICAgIGluY29ycmVjdGx5LgogCSAqLwotCXB1YmxpYyBDbWRMaW5lUGFyc2VyKGZpbmFsIE9iamVjdCBiZWFuLCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgQ21kTGluZVBhcnNlcihPYmplY3QgYmVhbiwgUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKGJlYW4pOwogCQlpZiAoYmVhbiBpbnN0YW5jZW9mIFRleHRCdWlsdGluKSB7CiAJCQljbWQgPSAoVGV4dEJ1aWx0aW4pIGJlYW47CkBAIC0xNDMsNyArMTQzLDcgQEAgcHVibGljIENtZExpbmVQYXJzZXIoZmluYWwgT2JqZWN0IGJlYW4sIFJlcG9zaXRvcnkgcmVwbykgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBwYXJzZUFyZ3VtZW50KGZpbmFsIFN0cmluZy4uLiBhcmdzKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgcGFyc2VBcmd1bWVudChTdHJpbmcuLi4gYXJncykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiB0bXAgPSBuZXcgQXJyYXlMaXN0PD4oYXJncy5sZW5ndGgpOwogCQlmb3IgKGludCBhcmdpID0gMDsgYXJnaSA8IGFyZ3MubGVuZ3RoOyBhcmdpKyspIHsKIAkJCWZpbmFsIFN0cmluZyBzdHIgPSBhcmdzW2FyZ2ldOwpAQCAtMjMyLDcgKzIzMiw3IEBAIHByaXZhdGUgdm9pZCByZXN0b3JlUmVxdWlyZWRPcHRpb25zKExpc3Q8T3B0aW9uSGFuZGxlcj4gYmFja3VwKSB7CiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBhcnJheSBjb250YWlucyBoZWxwIG9wdGlvbgogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0hlbHAoZmluYWwgU3RyaW5nLi4uIGFyZ3MpIHsKKwlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0hlbHAoU3RyaW5nLi4uIGFyZ3MpIHsKIAkJcmV0dXJuIFRleHRCdWlsdGluLmNvbnRhaW5zSGVscChhcmdzKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvT2JqZWN0SWRIYW5kbGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L09iamVjdElkSGFuZGxlci5qYXZhCmluZGV4IDBlNWIwZjUuLjVmN2U4MWUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvT2JqZWN0SWRIYW5kbGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9PYmplY3RJZEhhbmRsZXIuamF2YQpAQCAtODQsNyArODQsNyBAQCBwdWJsaWMgT2JqZWN0SWRIYW5kbGVyKGZpbmFsIENtZExpbmVQYXJzZXIgcGFyc2VyLCBmaW5hbCBPcHRpb25EZWYgb3B0aW9uLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAJCWZpbmFsIE9iamVjdElkIGlkOwogCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9QYXRoVHJlZUZpbHRlckhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUGF0aFRyZWVGaWx0ZXJIYW5kbGVyLmphdmEKaW5kZXggMzNkNjY5Yy4uZDk5Zjg4ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9QYXRoVHJlZUZpbHRlckhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1BhdGhUcmVlRmlsdGVySGFuZGxlci5qYXZhCkBAIC04NCw3ICs4NCw3IEBAIHB1YmxpYyBQYXRoVHJlZUZpbHRlckhhbmRsZXIoZmluYWwgQ21kTGluZVBhcnNlciBwYXJzZXIsCiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBpbnQgcGFyc2VBcmd1bWVudHMoZmluYWwgUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBDbWRMaW5lRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIExpc3Q8UGF0aEZpbHRlcj4gZmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQlmb3IgKGludCBpZHggPSAwOzsgaWR4KyspIHsKIAkJCWZpbmFsIFN0cmluZyBwYXRoOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZWZTcGVjSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZWZTcGVjSGFuZGxlci5qYXZhCmluZGV4IGRkODUyMGEuLjI5NTc3ZWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmVmU3BlY0hhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JlZlNwZWNIYW5kbGVyLmphdmEKQEAgLTc4LDcgKzc4LDcgQEAgcHVibGljIFJlZlNwZWNIYW5kbGVyKGZpbmFsIENtZExpbmVQYXJzZXIgcGFyc2VyLCBmaW5hbCBPcHRpb25EZWYgb3B0aW9uLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlzZXR0ZXIuYWRkVmFsdWUobmV3IFJlZlNwZWMocGFyYW1zLmdldFBhcmFtZXRlcigwKSkpOwogCQlyZXR1cm4gMTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JldkNvbW1pdEhhbmRsZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2Q29tbWl0SGFuZGxlci5qYXZhCmluZGV4IGQyZmE3NjQuLmI5MjVlMzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2Q29tbWl0SGFuZGxlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2Q29tbWl0SGFuZGxlci5qYXZhCkBAIC04OCw3ICs4OCw3IEBAIHB1YmxpYyBSZXZDb21taXRIYW5kbGVyKGZpbmFsIENtZExpbmVQYXJzZXIgcGFyc2VyLCBmaW5hbCBPcHRpb25EZWYgb3B0aW9uLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAKIAkJYm9vbGVhbiBpbnRlcmVzdGluZyA9IHRydWU7CkBAIC0xMTUsNyArMTE1LDcgQEAgcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhmaW5hbCBQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlyZXR1cm4gMTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYWRkT25lKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBib29sZWFuIGludGVyZXN0aW5nKQorCXByaXZhdGUgdm9pZCBhZGRPbmUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaW50ZXJlc3RpbmcpCiAJCQl0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CiAJCWZpbmFsIE9iamVjdElkIGlkOwogCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZXZUcmVlSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9SZXZUcmVlSGFuZGxlci5qYXZhCmluZGV4IDk0NDQzNjMuLjg1OTIyYTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvUmV2VHJlZUhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1JldlRyZWVIYW5kbGVyLmphdmEKQEAgLTg3LDcgKzg3LDcgQEAgcHVibGljIFJldlRyZWVIYW5kbGVyKGZpbmFsIENtZExpbmVQYXJzZXIgcGFyc2VyLCBmaW5hbCBPcHRpb25EZWYgb3B0aW9uLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAJCWZpbmFsIE9iamVjdElkIGlkOwogCQl0cnkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9TdWJjb21tYW5kSGFuZGxlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC5wZ20vc3JjL29yZy9lY2xpcHNlL2pnaXQvcGdtL29wdC9TdWJjb21tYW5kSGFuZGxlci5qYXZhCmluZGV4IGQ2MDA3MWYuLjkyZWViZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQucGdtL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BnbS9vcHQvU3ViY29tbWFuZEhhbmRsZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnBnbS9zcmMvb3JnL2VjbGlwc2UvamdpdC9wZ20vb3B0L1N1YmNvbW1hbmRIYW5kbGVyLmphdmEKQEAgLTg0LDcgKzg0LDcgQEAgcHVibGljIFN1YmNvbW1hbmRIYW5kbGVyKGZpbmFsIENtZExpbmVQYXJzZXIgcGFyc2VyLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IHBhcnNlQXJndW1lbnRzKGZpbmFsIFBhcmFtZXRlcnMgcGFyYW1zKSB0aHJvd3MgQ21kTGluZUV4Y2VwdGlvbiB7CisJcHVibGljIGludCBwYXJzZUFyZ3VtZW50cyhQYXJhbWV0ZXJzIHBhcmFtcykgdGhyb3dzIENtZExpbmVFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbmFtZSA9IHBhcmFtcy5nZXRQYXJhbWV0ZXIoMCk7CiAJCWZpbmFsIENvbW1hbmRSZWYgY3IgPSBDb21tYW5kQ2F0YWxvZy5nZXQobmFtZSk7CiAJCWlmIChjciA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDg1NWNkYTUuLjRiODNmYjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsNTggKzMsNTggQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdC50ZXN0CiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QKLUJ1bmRsZS1WZXJzaW9uOiA0LjExLjgucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlcl9uYW1lCiBCdW5kbGUtQWN0aXZhdGlvblBvbGljeTogbGF6eQogQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEphdmFTRS0xLjgKIEltcG9ydC1QYWNrYWdlOiBjb20uZ29vZ2xlY29kZS5qYXZhZXdhaDt2ZXJzaW9uPSJbMS4xLjYsMi4wLjApIiwKICBjb20uamNyYWZ0LmpzY2g7dmVyc2lvbj0iWzAuMS41NCwwLjIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50czt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZm5tYXRjaDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLmludGVybmFsO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZnNjazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5pbzt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5sZnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5sczt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wZ207dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnBnbS5pbnRlcm5hbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGU7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHA7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5zaGExO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmF3dHVpO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5kaWZmO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ldmVudHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5mbm1hdGNoO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLmludGVybmFsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5mc2NrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdHJlZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGZzO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ub3Rlczt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucGdtLmludGVybmFsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UucGFjazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKICBvcmcuanVuaXQ7dmVyc2lvbj0iWzQuMTIsNS4wLjApIiwKICBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCiAgb3JnLmp1bml0LnJ1bGVzO3ZlcnNpb249Ils0LjEyLDUuMC4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0NHaXRWc0pHaXRSYW5kb21JZ25vcmVQYXR0ZXJuVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9DR2l0VnNKR2l0UmFuZG9tSWdub3JlUGF0dGVyblRlc3QuamF2YQppbmRleCA0MzhkMmQ2Li40ZDllODY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0NHaXRWc0pHaXRSYW5kb21JZ25vcmVQYXR0ZXJuVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvQ0dpdFZzSkdpdFJhbmRvbUlnbm9yZVBhdHRlcm5UZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CkBAIC0xNTgsNyArMTU4LDcgQEAgcHVibGljIENHaXRJZ25vcmVSdWxlKEZpbGUgZ2l0RGlyLCBTdHJpbmcgcGF0dGVybikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXRoaXMuZ2l0RGlyID0gZ2l0RGlyOwogCQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKIAkJCUZpbGVzLndyaXRlKEZpbGVVdGlscy50b1BhdGgobmV3IEZpbGUoZ2l0RGlyLCAiLmdpdGlnbm9yZSIpKSwKLQkJCQkJKHBhdHRlcm4gKyAiXG4iKS5nZXRCeXRlcyhVVEZfOCksIFN0YW5kYXJkT3Blbk9wdGlvbi5DUkVBVEUsCisJCQkJCShwYXR0ZXJuICsgIlxuIikuZ2V0Qnl0ZXMoQ0hBUlNFVCksIFN0YW5kYXJkT3Blbk9wdGlvbi5DUkVBVEUsCiAJCQkJCVN0YW5kYXJkT3Blbk9wdGlvbi5UUlVOQ0FURV9FWElTVElORywKIAkJCQkJU3RhbmRhcmRPcGVuT3B0aW9uLldSSVRFKTsKIAkJfQpAQCAtMTg4LDcgKzE4OCw3IEBAIHByaXZhdGUgUHJvY2VzcyBzdGFydENnaXRDaGVja0lnbm9yZShTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCVByb2Nlc3MgcHJvYyA9IFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4ZWMoY29tbWFuZCwgbmV3IFN0cmluZ1swXSwKIAkJCQkJZ2l0RGlyKTsKIAkJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IHByb2MuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKLQkJCQlvdXQud3JpdGUoKHBhdGggKyAiXG4iKS5nZXRCeXRlcyhVVEZfOCkpOworCQkJCW91dC53cml0ZSgocGF0aCArICJcbiIpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJCQlvdXQuZmx1c2goKTsKIAkJCX0KIAkJCXJldHVybiBwcm9jOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VHaXRQYXRjaEhpc3RvcnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRUdpdFBhdGNoSGlzdG9yeVRlc3QuamF2YQppbmRleCAzZjllZjEyLi43OWQ4ZDBlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRUdpdFBhdGNoSGlzdG9yeVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvZXh0dHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRUdpdFBhdGNoSGlzdG9yeVRlc3QuamF2YQpAQCAtODUsNyArODUsNyBAQCBzdGF0aWMgY2xhc3MgUGF0Y2hSZWFkZXIgZXh0ZW5kcyBDb21taXRSZWFkZXIgewogCiAJCWludCBlcnJvcnM7CiAKLQkJUGF0Y2hSZWFkZXIoZmluYWwgSGFzaE1hcDxTdHJpbmcsIEhhc2hNYXA8U3RyaW5nLCBTdGF0SW5mbz4+IHMpCisJCVBhdGNoUmVhZGVyKEhhc2hNYXA8U3RyaW5nLCBIYXNoTWFwPFN0cmluZywgU3RhdEluZm8+PiBzKQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlzdXBlcihuZXcgU3RyaW5nW10geyAiLXAiIH0pOwogCQkJc3RhdHMgPSBzOwpAQCAtMTAzLDcgKzEwMyw3IEBAIHZvaWQgb25Db21taXQoU3RyaW5nIGNpZCwgYnl0ZVtdIGJ1ZikgewogCQkJcC5wYXJzZShidWYsIDAsIGJ1Zi5sZW5ndGggLSAxKTsKIAkJCWFzc2VydEVxdWFscygiRmlsZSBjb3VudCAiICsgY2lkLCBmaWxlcy5zaXplKCksIHAuZ2V0RmlsZXMoKS5zaXplKCkpOwogCQkJaWYgKCFwLmdldEVycm9ycygpLmlzRW1wdHkoKSkgewotCQkJCWZvciAoZmluYWwgRm9ybWF0RXJyb3IgZSA6IHAuZ2V0RXJyb3JzKCkpIHsKKwkJCQlmb3IgKEZvcm1hdEVycm9yIGUgOiBwLmdldEVycm9ycygpKSB7CiAJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZXJyb3IgIiArIGUuZ2V0TWVzc2FnZSgpKTsKIAkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgIGF0ICIgKyBlLmdldExpbmVUZXh0KCkpOwogCQkJCX0KQEAgLTExMSw3ICsxMTEsNyBAQCB2b2lkIG9uQ29tbWl0KFN0cmluZyBjaWQsIGJ5dGVbXSBidWYpIHsKIAkJCQlmYWlsKCJVbmV4cGVjdGVkIGVycm9yIGluICIgKyBjaWQpOwogCQkJfQogCi0JCQlmb3IgKGZpbmFsIEZpbGVIZWFkZXIgZmggOiBwLmdldEZpbGVzKCkpIHsKKwkJCWZvciAoRmlsZUhlYWRlciBmaCA6IHAuZ2V0RmlsZXMoKSkgewogCQkJCWZpbmFsIFN0cmluZyBmaWxlTmFtZTsKIAkJCQlpZiAoZmguZ2V0Q2hhbmdlVHlwZSgpICE9IEZpbGVIZWFkZXIuQ2hhbmdlVHlwZS5ERUxFVEUpCiAJCQkJCWZpbGVOYW1lID0gZmguZ2V0TmV3UGF0aCgpOwpAQCAtMTIxLDcgKzEyMSw3IEBAIHZvaWQgb25Db21taXQoU3RyaW5nIGNpZCwgYnl0ZVtdIGJ1ZikgewogCQkJCWZpbmFsIFN0cmluZyBuaWQgPSBmaWxlTmFtZSArICIgaW4gIiArIGNpZDsKIAkJCQlhc3NlcnROb3ROdWxsKCJObyAiICsgbmlkLCBzKTsKIAkJCQlpbnQgYWRkZWQgPSAwLCBkZWxldGVkID0gMDsKLQkJCQlmb3IgKGZpbmFsIEh1bmtIZWFkZXIgaCA6IGZoLmdldEh1bmtzKCkpIHsKKwkJCQlmb3IgKEh1bmtIZWFkZXIgaCA6IGZoLmdldEh1bmtzKCkpIHsKIAkJCQkJYWRkZWQgKz0gaC5nZXRPbGRJbWFnZSgpLmdldExpbmVzQWRkZWQoKTsKIAkJCQkJZGVsZXRlZCArPSBoLmdldE9sZEltYWdlKCkuZ2V0TGluZXNEZWxldGVkKCk7CiAJCQkJfQpAQCAtMTQ3LDcgKzE0Nyw3IEBAIHZvaWQgb25Db21taXQoU3RyaW5nIGNpZCwgYnl0ZVtdIGJ1ZikgewogCQkJYXNzZXJ0VHJ1ZSgiTWlzc2VkIGZpbGVzIGluICIgKyBjaWQsIGZpbGVzLmlzRW1wdHkoKSk7CiAJCX0KIAotCQlwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXAoZmluYWwgYnl0ZVtdIGJ1ZikgeworCQlwcml2YXRlIHN0YXRpYyB2b2lkIGR1bXAoYnl0ZVtdIGJ1ZikgewogCQkJU3RyaW5nIHN0cjsKIAkJCXRyeSB7CiAJCQkJc3RyID0gbmV3IFN0cmluZyhidWYsIDAsIGJ1Zi5sZW5ndGggLSAxLCAiSVNPLTg4NTktMSIpOwpAQCAtMTg4LDcgKzE4OCw3IEBAIHZvaWQgb25Db21taXQoU3RyaW5nIGNvbW1pdElkLCBieXRlW10gYnVmKSB7CiAJc3RhdGljIGFic3RyYWN0IGNsYXNzIENvbW1pdFJlYWRlciB7CiAJCXByaXZhdGUgUHJvY2VzcyBwcm9jOwogCi0JCUNvbW1pdFJlYWRlcihmaW5hbCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlDb21taXRSZWFkZXIoU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWZpbmFsIFN0cmluZ1tdIHJlYWxBcmdzID0gbmV3IFN0cmluZ1szICsgYXJncy5sZW5ndGggKyAxXTsKIAkJCXJlYWxBcmdzWzBdID0gImdpdCI7CiAJCQlyZWFsQXJnc1sxXSA9ICJsb2ciOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L2V4dHRzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JQZXJmb3JtYW5jZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yUGVyZm9ybWFuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzODM4OQotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9leHR0c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yUGVyZm9ybWFuY2VUZXN0LmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCwgVGhvbWFzIFdvbGYgPHRob21hcy53b2xmQHBhcmFub3IuY2g+CisgKiBhbmQgb3RoZXIgY29weXJpZ2h0IG93bmVycyBhcyBkb2N1bWVudGVkIGluIHRoZSBwcm9qZWN0J3MgSVAgbG9nLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlCisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2UgdjEuMCB3aGljaAorICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGlzIHJlcHJvZHVjZWQgYmVsb3csIGFuZCBpcworICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocAorICoKKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvcgorICogd2l0aG91dCBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nCisgKiBjb25kaXRpb25zIGFyZSBtZXQ6CisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKgorICogLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nCisgKiAgIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZAorICogICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogLSBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIEluYy4gbm9yIHRoZQorICogICBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZQorICogICBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiAgIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQKKyAqIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsCisgKiBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUworICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IKKyAqIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCisgKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKKyAqIExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIKKyAqIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsCisgKiBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorICogQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmVld2FsazsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5HaXQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIuUGF0aEZpbHRlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBTaW1wbGUgcGVyZm9ybWFuY2UgdGVzdCBmb3IgZ2l0IGFkZCAvIEZpbGVUcmVlSXRlcmF0b3IuCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlVHJlZUl0ZXJhdG9yUGVyZm9ybWFuY2VUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKKworCXByaXZhdGUgc3RhdGljIGludCBOX09GX0ZJTEVTID0gNTAxOworCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UGVyZm9ybWFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCWxvbmcgdGltZXNbXSA9IG5ldyBsb25nW05fT0ZfRklMRVNdOworCQkJbG9uZyBzdW0gPSAwOworCQkJU3RyaW5nIGxhc3ROYW1lID0gbnVsbDsKKwkJCWZvciAoaW50IGkgPSAwOyBpIDwgTl9PRl9GSUxFUzsgaSsrKSB7CisJCQkJbGFzdE5hbWUgPSAiYSIgKyAoaSArIDEwMDAwMCkgKyAiLnR4dCI7CisJCQkJd3JpdGVUcmFzaEZpbGUobGFzdE5hbWUsICIiKTsKKwkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7CisJCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKGxhc3ROYW1lKS5jYWxsKCk7CisJCQkJbG9uZyBlbGFwc2VkID0gU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydDsKKwkJCQl0aW1lc1tpXSA9IGVsYXBzZWQ7CisJCQkJc3VtICs9IGVsYXBzZWQ7CisJCQl9CisJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsICjCtXMpICIgKyBzdW0gLyAxMDAwLjApOworCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aW1lcy5sZW5ndGg7IGkrKykgeworCQkJCVN5c3RlbS5vdXQKKwkJCQkJCS5wcmludGxuKCJUaW1lICIgKyBpICsgIiAowrVzKSA9ICIgKyB0aW1lc1tpXSAvIDEwMDAuMCk7CisJCQl9CisJCQlGaWxlVHJlZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgRmlsZVRyZWVJdGVyYXRvcihkYik7CisJCQl0cnkgKFRyZWVXYWxrIHdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCQkJd2Fsay5zZXRGaWx0ZXIoUGF0aEZpbHRlci5jcmVhdGUobGFzdE5hbWUpKTsKKwkJCQl3YWxrLmFkZFRyZWUoaXRlcik7CisJCQkJbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOworCQkJCWlmICh3YWxrLm5leHQoKSkgeworCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIldhbGsgdGltZSAowrVzKSA9ICIKKwkJCQkJCQkrIChTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0KSAvIDEwMDAuMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmFpbCgiRmlsZSBub3QgZm91bmQiKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sCmluZGV4IDQzZjQwMzcuLmU2YzcxMjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC9wb20ueG1sCkBAIC01Miw3ICs1Miw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudGVzdDwvYXJ0aWZhY3RJZD4KQEAgLTYyLDYgKzYyLDEwIEBACiAgICAgSlVuaXQgdGVzdHMgZm9yIHRoZSBjb3JlIGxpYnJhcnkuCiAgIDwvZGVzY3JpcHRpb24+CiAKKyAgPHByb3BlcnRpZXM+CisgICAgPG1hdmVuLmphdmFkb2Muc2tpcD50cnVlPC9tYXZlbi5qYXZhZG9jLnNraXA+CisgIDwvcHJvcGVydGllcz4KKwogICA8ZGVwZW5kZW5jaWVzPgogICAgIDxkZXBlbmRlbmN5PgogICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdGVzdHMuYnpsIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3Rlc3RzLmJ6bAppbmRleCBjNzVhYjc2Li5mMzY4MDAwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdGVzdHMuYnpsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90ZXN0cy5iemwKQEAgLTE5LDYgKzE5LDEwIEBACiAgICAgICAgIGlmICJsaWIiIG5vdCBpbiBsYWJlbHM6CiAgICAgICAgICAgICBsYWJlbHMuYXBwZW5kKCJsaWIiKQogCisgICAgICAgICMgVE9ETyhodHRwOi8vZWNsaXAuc2UvNTM0Mjg1KTogTWFrZSB0aGlzIHRlc3QgcGFzcyByZWxpYWJseQorICAgICAgICAjIGFuZCByZW1vdmUgdGhlIGZsYWt5IGF0dHJpYnV0ZS4KKyAgICAgICAgZmxha3kgPSBzcmMuZW5kc3dpdGgoIkNyaXNzQ3Jvc3NNZXJnZVRlc3QuamF2YSIpCisKICAgICAgICAgYWRkaXRpb25hbF9kZXBzID0gW10KICAgICAgICAgaWYgc3JjLmVuZHN3aXRoKCJSb290TG9jYWxlVGVzdC5qYXZhIik6CiAgICAgICAgICAgICBhZGRpdGlvbmFsX2RlcHMgPSBbCkBAIC01Miw1ICs1Niw2IEBACiAgICAgICAgICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5qdW5pdDpqdW5pdCIsCiAgICAgICAgICAgICAgICAgIi8vb3JnLmVjbGlwc2UuamdpdC5sZnM6amdpdC1sZnMiLAogICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIGZsYWt5ID0gZmxha3ksCiAgICAgICAgICAgICBqdm1fZmxhZ3MgPSBbIi1YbXgyNTZtIiwgIi1EZmlsZS5lbmNvZGluZz1VVEYtOCJdLAogICAgICAgICApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FwcGx5Q29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCmluZGV4IDE3MjgwN2MuLjFkZDMyOWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXBwbHlDb21tYW5kVGVzdC5qYXZhCkBAIC02NCw3ICs2NCw3IEBAIHB1YmxpYyBjbGFzcyBBcHBseUNvbW1hbmRUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAogCXByaXZhdGUgUmF3VGV4dCBiOwogCi0JcHJpdmF0ZSBBcHBseVJlc3VsdCBpbml0KGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIEFwcGx5UmVzdWx0IGluaXQoU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gaW5pdChuYW1lLCB0cnVlLCB0cnVlKTsKIAl9CiAKQEAgLTI3Myw3ICsyNzMsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Tm9uQVNDSUlEZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RmFsc2UobmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgIk5vbkFTQ0lJRGVsIikuZXhpc3RzKCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSByZWFkRmlsZShmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSByZWFkRmlsZShTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IGdldFRlc3RSZXNvdXJjZShwYXRjaEZpbGUpOwogCQlpZiAoaW4gPT0gbnVsbCkgewogCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKQEAgLTI5MSw3ICsyOTEsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Tm9uQVNDSUlEZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGdldFRlc3RSZXNvdXJjZShmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlKSB7CisJcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0VGVzdFJlc291cmNlKFN0cmluZyBwYXRjaEZpbGUpIHsKIAkJcmV0dXJuIEFwcGx5Q29tbWFuZFRlc3QuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKQogCQkJCS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJvcmcvZWNsaXBzZS9qZ2l0L2RpZmYvIiArIHBhdGNoRmlsZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcmNoaXZlQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggZWRhYjk2Yi4uMTMwMGY5OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcmNoaXZlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0FyY2hpdmVDb21tYW5kVGVzdC5qYXZhCkBAIC0yMjksMTEgKzIyOSw2IEBAIHB1YmxpYyBNb2NrT3V0cHV0U3RyZWFtIGNyZWF0ZUFyY2hpdmVPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIHMsCiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIHZvaWQgcHV0RW50cnkoTW9ja091dHB1dFN0cmVhbSBvdXQsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKSB7Ci0JCQlwdXRFbnRyeShvdXQsIG51bGwsIHBhdGgsIG1vZGUsIGxvYWRlcik7Ci0JCX0KLQotCQlAT3ZlcnJpZGUKIAkJcHVibGljIHZvaWQgcHV0RW50cnkoTW9ja091dHB1dFN0cmVhbSBvdXQsIE9iamVjdElkIHRyZWUsIFN0cmluZyBwYXRoLCBGaWxlTW9kZSBtb2RlLCBPYmplY3RMb2FkZXIgbG9hZGVyKSB7CiAJCQlTdHJpbmcgY29udGVudCA9IG1vZGUgIT0gRmlsZU1vZGUuVFJFRSA/IG5ldyBTdHJpbmcobG9hZGVyLmdldEJ5dGVzKCkpIDogbnVsbDsKIAkJCWVudHJpZXMucHV0KHBhdGgsIGNvbnRlbnQpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CbGFtZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JsYW1lQ29tbWFuZFRlc3QuamF2YQppbmRleCBmMzdhYTEzLi43YTFkMjIyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JsYW1lQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JsYW1lQ29tbWFuZFRlc3QuamF2YQpAQCAtMTM2LDcgKzEzNiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RNb3ZlVG9PdGhlckRpcigpIHRocm93cyBFeGNlcHRpb24gewogCQl0ZXN0UmVuYW1lKCJzdWJkaXIvZmlsZTEudHh0IiwgIm90aGVyZGlyL2ZpbGUxLnR4dCIpOwogCX0KIAotCXByaXZhdGUgdm9pZCB0ZXN0UmVuYW1lKGZpbmFsIFN0cmluZyBzb3VyY2VQYXRoLCBmaW5hbCBTdHJpbmcgZGVzdFBhdGgpCisJcHJpdmF0ZSB2b2lkIHRlc3RSZW5hbWUoU3RyaW5nIHNvdXJjZVBhdGgsIFN0cmluZyBkZXN0UGF0aCkKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgewogCQkJU3RyaW5nW10gY29udGVudDEgPSBuZXcgU3RyaW5nW10geyAiYSIsICJiIiwgImMiIH07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JyYW5jaENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0JyYW5jaENvbW1hbmRUZXN0LmphdmEKaW5kZXggMmZlNDBiOS4uMDhmMWZkZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9CcmFuY2hDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQnJhbmNoQ29tbWFuZFRlc3QuamF2YQpAQCAtMTkxLDYgKzE5MSwxOCBAQCBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQW5kTGlzdCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCS0gYWxsQmVmb3JlKTsKIAl9CiAKKwlAVGVzdChleHBlY3RlZCA9IEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQnJhbmNoSEVBRCgpIHRocm93cyBFeGNlcHRpb24geworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgiSEVBRCIpLmNhbGwoKTsKKwkJZmFpbCgiQ3JlYXRlIGJyYW5jaCB3aXRoIGludmFsaWQgcmVmIG5hbWUgc2hvdWxkIGZhaWwiKTsKKwl9CisKKwlAVGVzdChleHBlY3RlZCA9IEludmFsaWRSZWZOYW1lRXhjZXB0aW9uLmNsYXNzKQorCXB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQnJhbmNoRGFzaCgpIHRocm93cyBFeGNlcHRpb24geworCQlnaXQuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZSgiLXgiKS5jYWxsKCk7CisJCWZhaWwoIkNyZWF0ZSBicmFuY2ggd2l0aCBpbnZhbGlkIHJlZiBuYW1lIHNob3VsZCBmYWlsIik7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TGlzdEFsbEJyYW5jaGVzU2hvdWxkTm90RGllKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXNldFVwUmVwb1dpdGhSZW1vdGUoKS5icmFuY2hMaXN0KCkuc2V0TGlzdE1vZGUoTGlzdE1vZGUuQUxMKS5jYWxsKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZFRlc3QuamF2YQppbmRleCAzNTRiOWM2Li5mYmMyY2Y2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmRUZXN0LmphdmEKQEAgLTMzOCw3ICszMzgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2hlcnJ5UGlja091ckNvbW1pdE5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgUmV2Q29tbWl0IHByZXBhcmVDaGVycnlQaWNrKGZpbmFsIEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgUmV2Q29tbWl0IHByZXBhcmVDaGVycnlQaWNrKEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBjcmVhdGUsIGFkZCBhbmQgY29tbWl0IGZpbGUgYQogCQl3cml0ZVRyYXNoRmlsZSgiYSIsICJhIik7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiYSIpLmNhbGwoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZFRlc3QuamF2YQppbmRleCAwZGQzNzQ5Li4zYTEzYWE1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kVGVzdC5qYXZhCkBAIC01NCw3ICs1NCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVab25lOwogCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkVtdHB5Q29tbWl0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5FbXB0eUNvbW1pdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuV3JvbmdSZXBvc2l0b3J5U3RhdGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5kaWZmLkRpZmZFbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlLkRpckNhY2hlOwpAQCAtNTUzLDggKzU1Myw4IEBAIHB1YmxpYyB2b2lkIGNvbW1pdEVtcHR5Q29tbWl0cygpIHRocm93cyBFeGNlcHRpb24gewogCQkJCWdpdC5jb21taXQoKS5zZXRBdXRob3IoIk5ldyBBdXRob3IiLCAibmV3YXV0aG9yQGV4YW1wbGUub3JnIikKIAkJCQkJCS5zZXRNZXNzYWdlKCJhZ2FpbiBubyBjaGFuZ2UiKS5zZXRBbGxvd0VtcHR5KGZhbHNlKQogCQkJCQkJLmNhbGwoKTsKLQkJCQlmYWlsKCJEaWRuJ3QgZ2V0IHRoZSBleHBlY3RlZCBFbXRweUNvbW1pdEV4Y2VwdGlvbiIpOwotCQkJfSBjYXRjaCAoRW10cHlDb21taXRFeGNlcHRpb24gZSkgeworCQkJCWZhaWwoIkRpZG4ndCBnZXQgdGhlIGV4cGVjdGVkIEVtcHR5Q29tbWl0RXhjZXB0aW9uIik7CisJCQl9IGNhdGNoIChFbXB0eUNvbW1pdEV4Y2VwdGlvbiBlKSB7CiAJCQkJLy8gZXhwZWN0IHRoaXMgZXhjZXB0aW9uCiAJCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0T25seVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0T25seVRlc3QuamF2YQppbmRleCBjYzIxYjQ3Li5iYmQ2ZWMwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdE9ubHlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRPbmx5VGVzdC5qYXZhCkBAIC0xMjg5LDcgKzEyODksNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXhwZWN0ZWRfZjNfaWR4KGZpbmFsIGludCBzdGF0ZSkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZ2V0SGVhZChmaW5hbCBHaXQgZ2l0LCBmaW5hbCBTdHJpbmcgcGF0aCkKKwlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZ2V0SGVhZChHaXQgZ2l0LCBTdHJpbmcgcGF0aCkKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQl0cnkgewogCQkJZmluYWwgUmVwb3NpdG9yeSByZXBvID0gZ2l0LmdldFJlcG9zaXRvcnkoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmRUZXN0LmphdmEKaW5kZXggYmU2Nzg5My4uZjIwOTNlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9EZXNjcmliZUNvbW1hbmRUZXN0LmphdmEKQEAgLTU1LDcgKzU1LDYgQEAKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLlJlZk5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkludmFsaWRQYXR0ZXJuRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuUmVwb3NpdG9yeVRlc3RDYXNlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwpAQCAtNjksMTMgKzY4LDE4IEBAIHB1YmxpYyBjbGFzcyBEZXNjcmliZUNvbW1hbmRUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAogCXByaXZhdGUgR2l0IGdpdDsKIAotCUBQYXJhbWV0ZXIKKwlAUGFyYW1ldGVyKDApCiAJcHVibGljIGJvb2xlYW4gdXNlQW5ub3RhdGVkVGFnczsKIAotCUBQYXJhbWV0ZXJzCisJQFBhcmFtZXRlcigxKQorCXB1YmxpYyBib29sZWFuIGRlc2NyaWJlVXNlQWxsVGFnczsKKworCUBQYXJhbWV0ZXJzKG5hbWUgPSAiZ2l0IHRhZyAtYSB7MH0/LWE6IHdpdGggZ2l0IGRlc2NyaWJlIHsxfT8tLXRhZ3M6IikKIAlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248Qm9vbGVhbltdPiBnZXRVc2VBbm5vdGF0ZWRUYWdzVmFsdWVzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgQm9vbGVhbltdW10geyB7IEJvb2xlYW4uVFJVRSB9LAotCQkJCXsgQm9vbGVhbi5GQUxTRSB9IH0pOworCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgQm9vbGVhbltdW10geyB7IEJvb2xlYW4uVFJVRSwgQm9vbGVhbi5GQUxTRSB9LAorCQkJCXsgQm9vbGVhbi5GQUxTRSwgQm9vbGVhbi5GQUxTRSB9LAorCQkJCXsgQm9vbGVhbi5UUlVFLCBCb29sZWFuLlRSVUUgfSwKKwkJCQl7IEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uVFJVRSB9IH0pOwogCX0KIAogCUBPdmVycmlkZQpAQCAtMTAwLDM1ICsxMDQsNTIgQEAgcHVibGljIHZvaWQgdGVzdERlc2NyaWJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRhZygiYm9iLXQyIik7CiAKIAkJT2JqZWN0SWQgYzQgPSBtb2RpZnkoImRkZCIpOworCQlhc3NlcnROYW1lU3RhcnRzV2l0aChjNCwgIjNlNTYzYzUiKTsKIAogCQlhc3NlcnROdWxsKGRlc2NyaWJlKGMxKSk7CiAJCWFzc2VydE51bGwoZGVzY3JpYmUoYzEsIHRydWUpKTsKIAkJYXNzZXJ0TnVsbChkZXNjcmliZShjMSwgImEqIiwgImIqIiwgImMqIikpOwotCi0JCWFzc2VydEVxdWFscygiYWxpY2UtdDEiLCBkZXNjcmliZShjMikpOwotCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxIiwgZGVzY3JpYmUoYzIsICJhbGljZSoiKSk7CiAJCWFzc2VydE51bGwoZGVzY3JpYmUoYzIsICJib2IqIikpOwogCQlhc3NlcnROdWxsKGRlc2NyaWJlKGMyLCAiP29iKiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MSIsIGRlc2NyaWJlKGMyLCAiYSoiLCAiYioiLCAiYyoiKSk7CiAKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDIiLCBkZXNjcmliZShjMykpOwotCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0wLWc0NDU3OWViIiwgZGVzY3JpYmUoYzMsIHRydWUpKTsKLQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MS0xLWc0NDU3OWViIiwgZGVzY3JpYmUoYzMsICJhbGljZSoiKSk7Ci0JCWFzc2VydEVxdWFscygiYWxpY2UtdDEtMS1nNDQ1NzllYiIsIGRlc2NyaWJlKGMzLCAiYT8/Yz8tdCoiKSk7Ci0JCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMsICJib2IqIikpOwotCQlhc3NlcnRFcXVhbHMoImJvYi10MiIsIGRlc2NyaWJlKGMzLCAiP29iKiIpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDIiLCBkZXNjcmliZShjMywgImEqIiwgImIqIiwgImMqIikpOworCQlpZiAodXNlQW5ub3RhdGVkVGFncyB8fCBkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygiYWxpY2UtdDEiLCBkZXNjcmliZShjMikpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MSIsIGRlc2NyaWJlKGMyLCAiYWxpY2UqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MSIsIGRlc2NyaWJlKGMyLCAiYSoiLCAiYioiLCAiYyoiKSk7CiAKLQkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICIzZTU2M2M1Iik7Ci0JCS8vIHRoZSB2YWx1ZSB2ZXJpZmllZCB3aXRoIGdpdC1kZXNjcmliZSgxKQotCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQpKTsKLQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCB0cnVlKSk7Ci0JCWFzc2VydEVxdWFscygiYWxpY2UtdDEtMi1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYWxpY2UqIikpOwotCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJib2IqIikpOwotCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJhKiIsICJiKiIsICJjKiIpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTAtZzQ0NTc5ZWIiLCBkZXNjcmliZShjMywgdHJ1ZSkpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MS0xLWc0NDU3OWViIiwgZGVzY3JpYmUoYzMsICJhbGljZSoiKSk7CisJCQlhc3NlcnRFcXVhbHMoImFsaWNlLXQxLTEtZzQ0NTc5ZWIiLCBkZXNjcmliZShjMywgImE/P2M/LXQqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDIiLCBkZXNjcmliZShjMywgImJvYioiKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10MiIsIGRlc2NyaWJlKGMzLCAiP29iKiIpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyIiwgZGVzY3JpYmUoYzMsICJhKiIsICJiKiIsICJjKiIpKTsKKworCQkJLy8gdGhlIHZhbHVlIHZlcmlmaWVkIHdpdGggZ2l0LWRlc2NyaWJlKDEpCisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLCBkZXNjcmliZShjNCwgdHJ1ZSkpOworCQkJYXNzZXJ0RXF1YWxzKCJhbGljZS10MS0yLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJhbGljZSoiKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwgZGVzY3JpYmUoYzQsICJib2IqIikpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGRlc2NyaWJlKGM0LCAiYSoiLCAiYioiLCAiYyoiKSk7CisJCX0gZWxzZSB7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzIpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjMykpOworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGM0KSk7CisJCX0KIAogCQkvLyB0ZXN0IGRlZmF1bHQgdGFyZ2V0Ci0JCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLCBnaXQuZGVzY3JpYmUoKS5jYWxsKCkpOworCQlpZiAodXNlQW5ub3RhdGVkVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsIGdpdC5kZXNjcmliZSgpLmNhbGwoKSk7CisJCQlhc3NlcnRFcXVhbHMoImJvYi10Mi0xLWczZTU2M2M1IiwKKwkJCQkJZ2l0LmRlc2NyaWJlKCkuc2V0VGFncyhmYWxzZSkuY2FsbCgpKTsKKwkJCWFzc2VydEVxdWFscygiYm9iLXQyLTEtZzNlNTYzYzUiLAorCQkJCQlnaXQuZGVzY3JpYmUoKS5zZXRUYWdzKHRydWUpLmNhbGwoKSk7CisJCX0gZWxzZSB7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZ2l0LmRlc2NyaWJlKCkuY2FsbCgpKTsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBnaXQuZGVzY3JpYmUoKS5zZXRUYWdzKGZhbHNlKS5jYWxsKCkpOworCQkJYXNzZXJ0RXF1YWxzKCJib2ItdDItMS1nM2U1NjNjNSIsCisJCQkJCWdpdC5kZXNjcmliZSgpLnNldFRhZ3ModHJ1ZSkuY2FsbCgpKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC0xNDMsMTIgKzE2NCwxNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpYmVNdWx0aU1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRhZygidjEuMS4xIik7CiAJCU9iamVjdElkIGMyID0gbW9kaWZ5KCJiYmIiKTsKIAorCQlpZiAoIXVzZUFubm90YXRlZFRhZ3MgJiYgIWRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGMxKSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzIpKTsKKwkJCXJldHVybjsKKwkJfQorCiAJCS8vIEVuc3VyZSB0aGF0IGlmIHdlJ3JlIGludGVyZXN0ZWQgaW4gYW55IHRhZ3MsIHdlIGdldCB0aGUgbW9zdCByZWNlbnQgdGFnCiAJCS8vIGFzIHBlciBHaXQgYmVoYXZpb3VyIHNpbmNlIDEuNy4xLjEKIAkJaWYgKHVzZUFubm90YXRlZFRhZ3MpIHsKIAkJCWFzc2VydEVxdWFscygidjEuMS4xIiwgZGVzY3JpYmUoYzEpKTsKIAkJCWFzc2VydEVxdWFscygidjEuMS4xLTEtZ2I4OWRlYWQiLCBkZXNjcmliZShjMikpOwotCiAJCQkvLyBFbnN1cmUgdGhhdCBpZiB3ZSdyZSBvbmx5IGludGVyZXN0ZWQgaW4gb25lIG9mIG11bHRpcGxlIHRhZ3MsIHdlIGdldCB0aGUgcmlnaHQgbWF0Y2gKIAkJCWFzc2VydEVxdWFscygidjEuMC4xIiwgZGVzY3JpYmUoYzEsICJ2MS4wKiIpKTsKIAkJCWFzc2VydEVxdWFscygidjEuMS4xIiwgZGVzY3JpYmUoYzEsICJ2MS4xKiIpKTsKQEAgLTIwNCw3ICsyMzAsMTEgQEAgcHVibGljIHZvaWQgdGVzdERlc2NyaWJlQnJhbmNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCU9iamVjdElkIGM0ID0gbWVyZ2UoYzIpOwogCiAJCWFzc2VydE5hbWVTdGFydHNXaXRoKGM0LCAiMTE5ODkyYiIpOwotCQlhc3NlcnRFcXVhbHMoInQtMi1nMTE5ODkyYiIsIGRlc2NyaWJlKGM0KSk7IC8vIDIgY29tbWl0czogYzQgYW5kIGMzCisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzIHx8IGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCIyIGNvbW1pdHM6IGM0IGFuZCBjMyIsICJ0LTItZzExOTg5MmIiLCBkZXNjcmliZShjNCkpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGM0KSk7CisJCX0KIAkJYXNzZXJ0TnVsbChkZXNjcmliZShjMykpOwogCQlhc3NlcnROdWxsKGRlc2NyaWJlKGMzLCB0cnVlKSk7CiAJfQpAQCAtMjM2LDE0ICsyNjYsNzYgQEAgcHVibGljIHZvaWQgdDFEb21pbmF0ZXNUMigpIHRocm93cyBFeGNlcHRpb24gewogCQlicmFuY2goImIiLCBjMSk7CiAKIAkJT2JqZWN0SWQgYzMgPSBtb2RpZnkoImNjYyIpOworCQlhc3NlcnROYW1lU3RhcnRzV2l0aChjMywgIjAyNDRlN2YiKTsKIAogCQlPYmplY3RJZCBjNCA9IG1lcmdlKGMyKTsKIAogCQlhc3NlcnROYW1lU3RhcnRzV2l0aChjNCwgIjExOTg5MmIiKTsKLQkJYXNzZXJ0RXF1YWxzKCJ0Mi0yLWcxMTk4OTJiIiwgZGVzY3JpYmUoYzQpKTsgLy8gMiBjb21taXRzOiBjNCBhbmQgYzMKKworCQlpZiAodXNlQW5ub3RhdGVkVGFncyB8fCBkZXNjcmliZVVzZUFsbFRhZ3MpIHsKKwkJCWFzc2VydEVxdWFscygidDItMi1nMTE5ODkyYiIsIGRlc2NyaWJlKGM0KSk7IC8vIDIgY29tbWl0czogYzQgYW5kIGMzCisJCQlhc3NlcnRFcXVhbHMoInQxLTEtZzAyNDRlN2YiLCBkZXNjcmliZShjMykpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RXF1YWxzKG51bGwsIGRlc2NyaWJlKGM0KSk7CisJCQlhc3NlcnRFcXVhbHMobnVsbCwgZGVzY3JpYmUoYzMpKTsKKwkJfQorCX0KKworCS8qKgorCSAqIFdoZW4gdDEgYW5ub3RhdGVkIGRvbWluYXRlcyB0MiBsaWdodHdlaWdodCB0YWcKKwkgKgorCSAqIDxwcmU+CisJICogdDEgLSstPiB0MiAgLQorCSAqICAgICB8ICAgICAgIHwKKwkgKiAgICAgKy0+IGMzIC0rLT4gYzQKKwkgKiA8L3ByZT4KKwkgKgorCSAqIEB0aHJvd3MgRXhjZXB0aW9uCisJICovCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0MUFubm90YXRlZERvbWluYXRlc1QybGlnaHR3ZWlnaHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJT2JqZWN0SWQgYzEgPSBtb2RpZnkoImFhYSIpOworCQl0YWcoInQxIiwgdXNlQW5ub3RhdGVkVGFncyk7CisKKwkJT2JqZWN0SWQgYzIgPSBtb2RpZnkoImJiYiIpOworCQl0YWcoInQyIiwgZmFsc2UpOworCisJCWFzc2VydE5hbWVTdGFydHNXaXRoKGMyLCAiMzc0N2RiMyIpOworCQlpZiAodXNlQW5ub3RhdGVkVGFncyAmJiAhZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMoCisJCQkJCSJvbmx5IGFubm90YXRlZCB0YWcgdDEgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgZGVzY3JpYmUiLAorCQkJCQkidDEtMS1nMzc0N2RiMyIsIGRlc2NyaWJlKGMyKSk7IC8vIDEgY29tbWl0czogdDIgb3ZlcnJpZGRlbgorCQkJCQkJCQkJCQkJCS8vIGJ5IHQxCisJCX0gZWxzZSBpZiAoIXVzZUFubm90YXRlZFRhZ3MgJiYgIWRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJubyBjb21taXRzIHRvIGRlc2NyaWJlIGV4cGVjdGVkIiwgbnVsbCwgZGVzY3JpYmUoYzIpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEVxdWFscygibGlnaHR3ZWlnaHQgdGFnIHQyIGV4cGVjdGVkIGluIGRlc2NyaWJlIiwgInQyIiwKKwkJCQkJZGVzY3JpYmUoYzIpKTsKKwkJfQorCisJCWJyYW5jaCgiYiIsIGMxKTsKKworCQlPYmplY3RJZCBjMyA9IG1vZGlmeSgiY2NjIik7CiAKIAkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzMsICIwMjQ0ZTdmIik7Ci0JCWFzc2VydEVxdWFscygidDEtMS1nMDI0NGU3ZiIsIGRlc2NyaWJlKGMzKSk7CisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzIHx8IGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJ0MS0xLWcwMjQ0ZTdmIiwgZGVzY3JpYmUoYzMpKTsKKwkJfQorCisJCU9iamVjdElkIGM0ID0gbWVyZ2UoYzIpOworCisJCWFzc2VydE5hbWVTdGFydHNXaXRoKGM0LCAiMTE5ODkyYiIpOworCQlpZiAoZGVzY3JpYmVVc2VBbGxUYWdzKSB7CisJCQlhc3NlcnRFcXVhbHMoCisJCQkJCSIyIGNvbW1pdHMgZm9yIGRlc2NyaWJlIGNvbW1pdCBpbmNyZW1lbnQgZXhwZWN0ZWQgc2luY2UgbGlnaHR3ZWlnaHQgdGFnOiBjNCBhbmQgYzMiLAorCQkJCQkidDItMi1nMTE5ODkyYiIsIGRlc2NyaWJlKGM0KSk7IC8vIDIgY29tbWl0czogYzQgYW5kIGMzCisJCX0gZWxzZSBpZiAoIXVzZUFubm90YXRlZFRhZ3MgJiYgIWRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJubyBtYXRjaGluZyBjb21taXRzIGV4cGVjdGVkIiwgbnVsbCwgZGVzY3JpYmUoYzQpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEVxdWFscygKKwkJCQkJIjMgY29tbWl0cyBmb3IgZGVzY3JpYmUgY29tbWl0IGluY3JlbWVudCBleHBlY3RlZCBzaW5jZSBhbm5vdGF0ZWQgdGFnOiBjNCBhbmQgYzMgYW5kIGMyIiwKKwkJCQkJInQxLTMtZzExOTg5MmIiLCBkZXNjcmliZShjNCkpOyAvLworCQl9CiAJfQogCiAJLyoqCkBAIC0yNzEsNyArMzYzLDExIEBAIHB1YmxpYyB2b2lkIHQxbmVhcmVyVDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJT2JqZWN0SWQgYzQgPSBtZXJnZSh0MSk7CiAKIAkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICJiYjM4OWE0Iik7Ci0JCWFzc2VydEVxdWFscygidDEtMy1nYmIzODlhNCIsIGRlc2NyaWJlKGM0KSk7CisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzIHx8IGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJ0MS0zLWdiYjM4OWE0IiwgZGVzY3JpYmUoYzQpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjNCkpOworCQl9CiAJfQogCiAJLyoqCkBAIC0zMDAsNyArMzk2LDExIEBAIHB1YmxpYyB2b2lkIHQxc2FtZURlcHRoVDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJT2JqZWN0SWQgYzQgPSBtZXJnZShjMik7CiAKIAkJYXNzZXJ0TmFtZVN0YXJ0c1dpdGgoYzQsICJiYjM4OWE0Iik7Ci0JCWFzc2VydEVxdWFscygidDItNC1nYmIzODlhNCIsIGRlc2NyaWJlKGM0KSk7CisJCWlmICh1c2VBbm5vdGF0ZWRUYWdzIHx8IGRlc2NyaWJlVXNlQWxsVGFncykgeworCQkJYXNzZXJ0RXF1YWxzKCJ0Mi00LWdiYjM4OWE0IiwgZGVzY3JpYmUoYzQpKTsKKwkJfSBlbHNlIHsKKwkJCWFzc2VydEVxdWFscyhudWxsLCBkZXNjcmliZShjNCkpOworCQl9CiAJfQogCiAJcHJpdmF0ZSBPYmplY3RJZCBtZXJnZShPYmplY3RJZCBjMikgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CkBAIC0zMTQsMTAgKzQxNCwxNSBAQCBwcml2YXRlIE9iamVjdElkIG1vZGlmeShTdHJpbmcgY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIHRhZyhTdHJpbmcgdGFnKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKKwkJdGFnKHRhZywgdGhpcy51c2VBbm5vdGF0ZWRUYWdzKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgdGFnKFN0cmluZyB0YWcsIGJvb2xlYW4gYW5ub3RhdGVkVGFnKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKIAkJVGFnQ29tbWFuZCB0YWdDb21tYW5kID0gZ2l0LnRhZygpLnNldE5hbWUodGFnKQotCQkJCS5zZXRBbm5vdGF0ZWQodXNlQW5ub3RhdGVkVGFncyk7Ci0JCWlmICh1c2VBbm5vdGF0ZWRUYWdzKQorCQkJCS5zZXRBbm5vdGF0ZWQoYW5ub3RhdGVkVGFnKTsKKwkJaWYgKGFubm90YXRlZFRhZykgewogCQkJdGFnQ29tbWFuZC5zZXRNZXNzYWdlKHRhZyk7CisJCX0KIAkJdGFnQ29tbWFuZC5jYWxsKCk7CiAJfQogCkBAIC0zMjksMTUgKzQzNCwxNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHRvdWNoKEZpbGUgZiwgU3RyaW5nIGNvbnRlbnRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCXByaXZhdGUgU3RyaW5nIGRlc2NyaWJlKE9iamVjdElkIGMxLCBib29sZWFuIGxvbmdEZXNjKQogCQkJdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2l0LmRlc2NyaWJlKCkuc2V0VGFyZ2V0KGMxKS5zZXRMb25nKGxvbmdEZXNjKS5jYWxsKCk7CisJCXJldHVybiBnaXQuZGVzY3JpYmUoKS5zZXRUYXJnZXQoYzEpLnNldFRhZ3MoZGVzY3JpYmVVc2VBbGxUYWdzKQorCQkJCS5zZXRMb25nKGxvbmdEZXNjKS5jYWxsKCk7CiAJfQogCiAJcHJpdmF0ZSBTdHJpbmcgZGVzY3JpYmUoT2JqZWN0SWQgYzEpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGRlc2NyaWJlKGMxLCBmYWxzZSk7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpYmUoT2JqZWN0SWQgYzEsIFN0cmluZy4uLiBwYXR0ZXJucykgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEludmFsaWRQYXR0ZXJuRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdpdC5kZXNjcmliZSgpLnNldFRhcmdldChjMSkuc2V0TWF0Y2gocGF0dGVybnMpLmNhbGwoKTsKKwlwcml2YXRlIFN0cmluZyBkZXNjcmliZShPYmplY3RJZCBjMSwgU3RyaW5nLi4uIHBhdHRlcm5zKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdpdC5kZXNjcmliZSgpLnNldFRhcmdldChjMSkuc2V0VGFncyhkZXNjcmliZVVzZUFsbFRhZ3MpCisJCQkJLnNldE1hdGNoKHBhdHRlcm5zKS5jYWxsKCk7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnROYW1lU3RhcnRzV2l0aChPYmplY3RJZCBjNCwgU3RyaW5nIHByZWZpeCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Fb2xTdHJlYW1UeXBlVXRpbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRW9sU3RyZWFtVHlwZVV0aWxUZXN0LmphdmEKaW5kZXggMWUzYTM5YS4uYmIzMDNjYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Fb2xTdHJlYW1UeXBlVXRpbFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0VvbFN0cmVhbVR5cGVVdGlsVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29yZUNvbmZpZy5Fb2xTdHJlYW1UeXBlLkFVVE9fQ1JMRjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29yZUNvbmZpZy5Fb2xTdHJlYW1UeXBlLkFVVE9fTEY7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvcmVDb25maWcuRW9sU3RyZWFtVHlwZS5ESVJFQ1Q7CkBAIC0xNTAsOCArMTUwLDggQEAgcHJpdmF0ZSB2b2lkIHRlc3RDaGVja291dChFb2xTdHJlYW1UeXBlIHN0cmVhbVR5cGVUZXh0LAogCQkJRW9sU3RyZWFtVHlwZSBzdHJlYW1UeXBlV2l0aEJpbmFyeUNoZWNrLCBTdHJpbmcgb3V0cHV0LAogCQkJU3RyaW5nIGV4cGVjdGVkQ29udmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiOwotCQlieXRlW10gb3V0cHV0Qnl0ZXMgPSBvdXRwdXQuZ2V0Qnl0ZXMoVVRGXzgpOwotCQlieXRlW10gZXhwZWN0ZWRDb252ZXJzaW9uQnl0ZXMgPSBleHBlY3RlZENvbnZlcnNpb24uZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gb3V0cHV0Qnl0ZXMgPSBvdXRwdXQuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CisJCWJ5dGVbXSBleHBlY3RlZENvbnZlcnNpb25CeXRlcyA9IGV4cGVjdGVkQ29udmVyc2lvbi5nZXRCeXRlcyhDSEFSU0VUKTsKIAogCQkvLyB0ZXN0IHVzaW5nIG91dHB1dCB0ZXh0IGFuZCBhc3N1bWluZyBpdCB3YXMgZGVjbGFyZWQgVEVYVAogCQliID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwpAQCAtMjc3LDggKzI3Nyw4IEBAIHB1YmxpYyB2b2lkIHRlc3RDaGVja2luQ1JMRigpIHRocm93cyBFeGNlcHRpb24gewogCXByaXZhdGUgdm9pZCB0ZXN0Q2hlY2tpbihFb2xTdHJlYW1UeXBlIHN0cmVhbVR5cGVUZXh0LAogCQkJRW9sU3RyZWFtVHlwZSBzdHJlYW1UeXBlV2l0aEJpbmFyeUNoZWNrLCBTdHJpbmcgaW5wdXQsCiAJCQlTdHJpbmcgZXhwZWN0ZWRDb252ZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJYnl0ZVtdIGlucHV0Qnl0ZXMgPSBpbnB1dC5nZXRCeXRlcyhVVEZfOCk7Ci0JCWJ5dGVbXSBleHBlY3RlZENvbnZlcnNpb25CeXRlcyA9IGV4cGVjdGVkQ29udmVyc2lvbi5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBpbnB1dEJ5dGVzID0gaW5wdXQuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CisJCWJ5dGVbXSBleHBlY3RlZENvbnZlcnNpb25CeXRlcyA9IGV4cGVjdGVkQ29udmVyc2lvbi5nZXRCeXRlcyhDSEFSU0VUKTsKIAogCQkvLyB0ZXN0IHVzaW5nIGlucHV0IHRleHQgYW5kIGFzc3VtaW5nIGl0IHdhcyBkZWNsYXJlZCBURVhUCiAJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBFb2xTdHJlYW1UeXBlVXRpbC53cmFwSW5wdXRTdHJlYW0oCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kVGVzdC5qYXZhCmluZGV4IDUzMGZiMWIuLmFkYzRkOTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvRmV0Y2hDb21tYW5kVGVzdC5qYXZhCkBAIC00MywxMiArNDMsMTcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCitpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkpHaXRUZXN0VXRpbDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlJlcG9zaXRvcnlUZXN0Q2FzZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CkBAIC0xMDUsNiArMTEwLDI1IEBAIHB1YmxpYyB2b2lkIHRlc3RGZXRjaCgpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZvcmNlZEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJlbW90ZUdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJjb21taXQiKS5jYWxsKCk7CisJCXJlbW90ZUdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJjb21taXQyIikuY2FsbCgpOworCQlnaXQuZmV0Y2goKS5zZXRSZW1vdGUoInRlc3QiKQorCQkJCS5zZXRSZWZTcGVjcygicmVmcy9oZWFkcy9tYXN0ZXI6cmVmcy9oZWFkcy9tYXN0ZXIiKS5jYWxsKCk7CisKKwkJcmVtb3RlR2l0LmNvbW1pdCgpLnNldEFtZW5kKHRydWUpLnNldE1lc3NhZ2UoImFtZW5kZWQiKS5jYWxsKCk7CisJCUZldGNoUmVzdWx0IHJlcyA9IGdpdC5mZXRjaCgpLnNldFJlbW90ZSgidGVzdCIpCisJCQkJLnNldFJlZlNwZWNzKCJyZWZzL2hlYWRzL21hc3RlcjpyZWZzL2hlYWRzL21hc3RlciIpLmNhbGwoKTsKKwkJYXNzZXJ0RXF1YWxzKFJlZlVwZGF0ZS5SZXN1bHQuUkVKRUNURUQsCisJCQkJcmVzLmdldFRyYWNraW5nUmVmVXBkYXRlKCJyZWZzL2hlYWRzL21hc3RlciIpLmdldFJlc3VsdCgpKTsKKwkJcmVzID0gZ2l0LmZldGNoKCkuc2V0UmVtb3RlKCJ0ZXN0IikKKwkJCQkuc2V0UmVmU3BlY3MoInJlZnMvaGVhZHMvbWFzdGVyOnJlZnMvaGVhZHMvbWFzdGVyIikKKwkJCQkuc2V0Rm9yY2VVcGRhdGUodHJ1ZSkuY2FsbCgpOworCQlhc3NlcnRFcXVhbHMoUmVmVXBkYXRlLlJlc3VsdC5GT1JDRUQsCisJCQkJcmVzLmdldFRyYWNraW5nUmVmVXBkYXRlKCJyZWZzL2hlYWRzL21hc3RlciIpLmdldFJlc3VsdCgpKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIGZldGNoQWRkc0JyYW5jaGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBicmFuY2gxID0gImIxIjsKIAkJZmluYWwgU3RyaW5nIGJyYW5jaDIgPSAiYjIiOwpAQCAtMjc1LDYgKzI5OSw0NSBAQCBwdWJsaWMgdm9pZCBmZXRjaFdpdGhFeHBsaWNpdFRhZ3NTaG91bGRVcGRhdGVMb2NhbCgpIHRocm93cyBFeGNlcHRpb24gewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoV2l0aFBydW5lU2hvdWxkS2VlcE9yaWdpbkhlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJLy8gQ3JlYXRlIGEgY29tbWl0IGluIHRoZSB0ZXN0IHJlcG8uCisJCWNvbW1pdEZpbGUoImZvbyIsICJmb28iLCAibWFzdGVyIik7CisJCS8vIFByb2R1Y2UgYSByZWFsIGNsb25lIG9mIHRoZSBnaXQgcmVwbworCQlHaXQgY2xvbmVkID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCisJCQkJLnNldERpcmVjdG9yeShjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0Q2xvbmVSZXBvc2l0b3J5IikpCisJCQkJLnNldFVSSSgiZmlsZTovLyIKKwkJCQkJCSsgZ2l0LmdldFJlcG9zaXRvcnkoKS5nZXRXb3JrVHJlZSgpLmdldEFic29sdXRlUGF0aCgpKQorCQkJCS5jYWxsKCk7CisJCWFzc2VydE5vdE51bGwoY2xvbmVkKTsKKwkJUmVwb3NpdG9yeSBjbG9uZWRSZXBvID0gY2xvbmVkLmdldFJlcG9zaXRvcnkoKTsKKwkJYWRkUmVwb1RvQ2xvc2UoY2xvbmVkUmVwbyk7CisJCU9iamVjdElkIG9yaWdpbk1hc3RlcklkID0gY2xvbmVkUmVwbworCQkJCS5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlciIpOworCQlhc3NlcnROb3ROdWxsKCJTaG91bGQgaGF2ZSBvcmlnaW4vbWFzdGVyIiwgb3JpZ2luTWFzdGVySWQpOworCQlhc3NlcnROb3RFcXVhbHMoIm9yaWdpbi9tYXN0ZXIgc2hvdWxkIG5vdCBiZSB6ZXJvIElEIiwKKwkJCQlPYmplY3RJZC56ZXJvSWQoKSwgb3JpZ2luTWFzdGVySWQpOworCQkvLyBDYW5vbmljYWwgZ2l0IGNyZWF0ZXMgb3JpZ2luL0hFQUQ7IEpHaXQgKGZvciBub3cpIGRvZXNuJ3QuIExldCdzCisJCS8vIHByZXRlbmQgd2UgZGlkIHRoZSBjbG9uZSB2aWEgY29tbWFuZC1saW5lIGdpdC4KKwkJT2JqZWN0SWQgb3JpZ2luSGVhZElkID0gY2xvbmVkUmVwby5yZXNvbHZlKCJyZWZzL3JlbW90ZXMvb3JpZ2luL0hFQUQiKTsKKwkJaWYgKG9yaWdpbkhlYWRJZCA9PSBudWxsKSB7CisJCQlKR2l0VGVzdFV0aWwud3JpdGUoCisJCQkJCW5ldyBGaWxlKGNsb25lZFJlcG8uZ2V0RGlyZWN0b3J5KCksCisJCQkJCQkJInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCIpLAorCQkJCQkicmVmOiByZWZzL3JlbW90ZXMvb3JpZ2luL21hc3RlclxuIik7CisJCQlvcmlnaW5IZWFkSWQgPSBjbG9uZWRSZXBvLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCIpOworCQl9CisJCWFzc2VydEVxdWFscygiU2hvdWxkIGhhdmUgb3JpZ2luL0hFQUQiLCBvcmlnaW5NYXN0ZXJJZCwgb3JpZ2luSGVhZElkKTsKKwkJRmV0Y2hSZXN1bHQgcmVzdWx0ID0gY2xvbmVkLmZldGNoKCkuc2V0UmVtb3RlKCJvcmlnaW4iKQorCQkJCS5zZXRSZW1vdmVEZWxldGVkUmVmcyh0cnVlKS5jYWxsKCk7CisJCWFzc2VydFRydWUoIkZldGNoIGFmdGVyIGNsb25lIHNob3VsZCBiZSB1cC10by1kYXRlIiwKKwkJCQlyZXN1bHQuZ2V0VHJhY2tpbmdSZWZVcGRhdGVzKCkuaXNFbXB0eSgpKTsKKwkJYXNzZXJ0RXF1YWxzKCJvcmlnaW4vbWFzdGVyIHNob3VsZCBzdGlsbCBleGlzdCIsIG9yaWdpbk1hc3RlcklkLAorCQkJCWNsb25lZFJlcG8ucmVzb2x2ZSgicmVmcy9yZW1vdGVzL29yaWdpbi9tYXN0ZXIiKSk7CisJCWFzc2VydEVxdWFscygib3JpZ2luL0hFQUQgc2hvdWxkIGJlIHVuY2hhbmdlZCIsIG9yaWdpbkhlYWRJZCwKKwkJCQljbG9uZWRSZXBvLnJlc29sdmUoInJlZnMvcmVtb3Rlcy9vcmlnaW4vSEVBRCIpKTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIGZldGNoQWRkUmVmc1dpdGhEdXBsaWNhdGVSZWZzcGVjKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBicmFuY2hOYW1lID0gImJyYW5jaCI7CiAJCWZpbmFsIFN0cmluZyByZW1vdGVCcmFuY2hOYW1lID0gInRlc3QvIiArIGJyYW5jaE5hbWU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmRUZXN0LmphdmEKaW5kZXggYmQwZWZhZC4uNGVmNTExZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mb2dDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTG9nQ29tbWFuZFRlc3QuamF2YQpAQCAtMTE2LDcgKzExNiw3IEBAIHB1YmxpYyB2b2lkIGxvZ0FsbENvbW1pdHNXaXRoVGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUl0ZXJhdG9yPFJldkNvbW1pdD4gbG9nID0gZ2l0LmxvZygpLmFsbCgpLmNhbGwoKS5pdGVyYXRvcigpOwogCQlhc3NlcnRUcnVlKGxvZy5oYXNOZXh0KCkpOwogCQlSZXZDb21taXQgY29tbWl0ID0gbG9nLm5leHQoKTsKLQkJdGFnID0gZGIucGVlbCh0YWcpOworCQl0YWcgPSBkYi5nZXRSZWZEYXRhYmFzZSgpLnBlZWwodGFnKTsKIAogCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldE5hbWUoKSwgdGFnLmdldFBlZWxlZE9iamVjdElkKCkuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0VHJ1ZShjb21taXRzLmNvbnRhaW5zKGNvbW1pdCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQppbmRleCA0YjIzMzQ5Li45YWYwMDNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL01lcmdlQ29tbWFuZFRlc3QuamF2YQpAQCAtNTQsNiArNTQsNyBAQAogCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLk1lcmdlQ29tbWFuZC5GYXN0Rm9yd2FyZE1vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuTWVyZ2VSZXN1bHQuTWVyZ2VTdGF0dXM7CkBAIC0xNTg0LDI3ICsxNTg1LDMxIEBAIHB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmVNZXJnZVdpdGhDb25mbGljdCgpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoTWVyZ2VTdGF0dXMuQ09ORkxJQ1RJTkcsIHJlc3VsdC5nZXRNZXJnZVN0YXR1cygpKTsKIAl9CiAKKwlwcml2YXRlIFJlZiBwcmVwYXJlU3VjY2Vzc2Z1bE1lcmdlKEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24geworCQl3cml0ZVRyYXNoRmlsZSgiYSIsICIxXG5hXG4zXG4iKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJhIikuY2FsbCgpOworCQlSZXZDb21taXQgaW5pdGlhbENvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJpbml0aWFsIikuY2FsbCgpOworCisJCWNyZWF0ZUJyYW5jaChpbml0aWFsQ29tbWl0LCAicmVmcy9oZWFkcy9zaWRlIik7CisJCWNoZWNrb3V0QnJhbmNoKCJyZWZzL2hlYWRzL3NpZGUiKTsKKworCQl3cml0ZVRyYXNoRmlsZSgiYiIsICIxXG5iXG4zXG4iKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJiIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgic2lkZSIpLmNhbGwoKTsKKworCQljaGVja291dEJyYW5jaCgicmVmcy9oZWFkcy9tYXN0ZXIiKTsKKworCQl3cml0ZVRyYXNoRmlsZSgiYyIsICIxXG5jXG4zXG4iKTsKKwkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJjIikuY2FsbCgpOworCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgibWFpbiIpLmNhbGwoKTsKKworCQlyZXR1cm4gZGIuZXhhY3RSZWYoInJlZnMvaGVhZHMvc2lkZSIpOworCX0KKwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE1lcmdlV2l0aE1lc3NhZ2VPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKLQkJCXdyaXRlVHJhc2hGaWxlKCJhIiwgIjFcbmFcbjNcbiIpOwotCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJhIikuY2FsbCgpOwotCQkJUmV2Q29tbWl0IGluaXRpYWxDb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCIpLmNhbGwoKTsKLQotCQkJY3JlYXRlQnJhbmNoKGluaXRpYWxDb21taXQsICJyZWZzL2hlYWRzL3NpZGUiKTsKLQkJCWNoZWNrb3V0QnJhbmNoKCJyZWZzL2hlYWRzL3NpZGUiKTsKLQotCQkJd3JpdGVUcmFzaEZpbGUoImIiLCAiMVxuYlxuM1xuIik7Ci0JCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImIiKS5jYWxsKCk7Ci0JCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgic2lkZSIpLmNhbGwoKTsKLQotCQkJY2hlY2tvdXRCcmFuY2goInJlZnMvaGVhZHMvbWFzdGVyIik7Ci0KLQkJCXdyaXRlVHJhc2hGaWxlKCJjIiwgIjFcbmNcbjNcbiIpOwotCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJjIikuY2FsbCgpOwotCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIm1haW4iKS5jYWxsKCk7Ci0KLQkJCVJlZiBzaWRlQnJhbmNoID0gZGIuZXhhY3RSZWYoInJlZnMvaGVhZHMvc2lkZSIpOworCQkJUmVmIHNpZGVCcmFuY2ggPSBwcmVwYXJlU3VjY2Vzc2Z1bE1lcmdlKGdpdCk7CiAKIAkJCWdpdC5tZXJnZSgpLmluY2x1ZGUoc2lkZUJyYW5jaCkuc2V0U3RyYXRlZ3koTWVyZ2VTdHJhdGVneS5SRVNPTFZFKQogCQkJCQkuc2V0TWVzc2FnZSgidXNlciBtZXNzYWdlIikuY2FsbCgpOwpAQCAtMTYxOCw2ICsxNjIzLDQzIEBAIHB1YmxpYyB2b2lkIHRlc3RNZXJnZVdpdGhNZXNzYWdlT3B0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJfQogCiAJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VXaXRoQ2hhbmdlSWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCVJlZiBzaWRlQnJhbmNoID0gcHJlcGFyZVN1Y2Nlc3NmdWxNZXJnZShnaXQpOworCisJCQlnaXQubWVyZ2UoKS5pbmNsdWRlKHNpZGVCcmFuY2gpLnNldFN0cmF0ZWd5KE1lcmdlU3RyYXRlZ3kuUkVTT0xWRSkKKwkJCQkJLnNldEluc2VydENoYW5nZUlkKHRydWUpLmNhbGwoKTsKKworCQkJYXNzZXJ0TnVsbChkYi5yZWFkTWVyZ2VDb21taXRNc2coKSk7CisKKwkJCUl0ZXJhdG9yPFJldkNvbW1pdD4gaXQgPSBnaXQubG9nKCkuY2FsbCgpLml0ZXJhdG9yKCk7CisJCQlSZXZDb21taXQgbmV3SGVhZCA9IGl0Lm5leHQoKTsKKwkJCVN0cmluZyBjb21taXRNZXNzYWdlID0gbmV3SGVhZC5nZXRGdWxsTWVzc2FnZSgpOworCQkJYXNzZXJ0VHJ1ZShQYXR0ZXJuLmNvbXBpbGUoIlxuQ2hhbmdlLUlkOiBJWzAtOWEtZkEtRl17NDB9XG4iKQorCQkJCQkubWF0Y2hlcihjb21taXRNZXNzYWdlKS5maW5kKCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VXaXRoTWVzc2FnZUFuZENoYW5nZUlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CisJCQlSZWYgc2lkZUJyYW5jaCA9IHByZXBhcmVTdWNjZXNzZnVsTWVyZ2UoZ2l0KTsKKworCQkJZ2l0Lm1lcmdlKCkuaW5jbHVkZShzaWRlQnJhbmNoKS5zZXRTdHJhdGVneShNZXJnZVN0cmF0ZWd5LlJFU09MVkUpCisJCQkJCS5zZXRNZXNzYWdlKCJ1c2VyIG1lc3NhZ2UiKS5zZXRJbnNlcnRDaGFuZ2VJZCh0cnVlKS5jYWxsKCk7CisKKwkJCWFzc2VydE51bGwoZGIucmVhZE1lcmdlQ29tbWl0TXNnKCkpOworCisJCQlJdGVyYXRvcjxSZXZDb21taXQ+IGl0ID0gZ2l0LmxvZygpLmNhbGwoKS5pdGVyYXRvcigpOworCQkJUmV2Q29tbWl0IG5ld0hlYWQgPSBpdC5uZXh0KCk7CisJCQlTdHJpbmcgY29tbWl0TWVzc2FnZSA9IG5ld0hlYWQuZ2V0RnVsbE1lc3NhZ2UoKTsKKwkJCWFzc2VydFRydWUoY29tbWl0TWVzc2FnZS5zdGFydHNXaXRoKCJ1c2VyIG1lc3NhZ2VcblxuIikpOworCQkJYXNzZXJ0VHJ1ZShQYXR0ZXJuLmNvbXBpbGUoIlxuQ2hhbmdlLUlkOiBJWzAtOWEtZkEtRl17NDB9XG4iKQorCQkJCQkubWF0Y2hlcihjb21taXRNZXNzYWdlKS5maW5kKCkpOworCQl9CisJfQorCisJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VDb25mbGljdFdpdGhNZXNzYWdlT3B0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CiAJCQl3cml0ZVRyYXNoRmlsZSgiYSIsICIxXG5hXG4zXG4iKTsKQEAgLTE2NTcsNyArMTY5OSw3IEBAIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2FuRXhlY3V0ZShHaXQgZ2l0LCBTdHJpbmcgcGF0aCkgewogCQkJCS5nZXRXb3JrVHJlZSgpLCBwYXRoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgUmV2Q29tbWl0IGFkZEFsbEFuZENvbW1pdChmaW5hbCBHaXQgZ2l0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHN0YXRpYyBSZXZDb21taXQgYWRkQWxsQW5kQ29tbWl0KEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24gewogCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CiAJCXJldHVybiBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgibWVzc2FnZSIpLmNhbGwoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL05vdGVzQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTm90ZXNDb21tYW5kVGVzdC5qYXZhCmluZGV4IDZlMDZlOTUuLmUyMzRhYTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTm90ZXNDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvTm90ZXNDb21tYW5kVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTg4LDcgKzg4LDcgQEAgcHVibGljIHZvaWQgdGVzdEFkZEFuZFJlbW92ZU5vdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZ2l0Lm5vdGVzQWRkKCkuc2V0T2JqZWN0SWQoY29tbWl0Mikuc2V0TWVzc2FnZSgiZGF0YSIpLmNhbGwoKTsKIAkJTm90ZSBub3RlID0gZ2l0Lm5vdGVzU2hvdygpLnNldE9iamVjdElkKGNvbW1pdDIpLmNhbGwoKTsKIAkJU3RyaW5nIGNvbnRlbnQgPSBuZXcgU3RyaW5nKGRiLm9wZW4obm90ZS5nZXREYXRhKCkpLmdldENhY2hlZEJ5dGVzKCksCi0JCQkJVVRGXzgpOworCQkJCUNIQVJTRVQpOwogCQlhc3NlcnRFcXVhbHMoY29udGVudCwgImRhdGEiKTsKIAogCQlnaXQubm90ZXNSZW1vdmUoKS5zZXRPYmplY3RJZChjb21taXQyKS5jYWxsKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFRlc3QuamF2YQppbmRleCA5NDYxYzQyLi4wYjBlM2JmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1bGxDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtNTkyLDcgKzU5Miw3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVRvRmlsZShGaWxlIGFjdEZpbGUsIFN0cmluZyBzdHJpbmcpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oYWN0RmlsZSkpIHsKLQkJCWZvcy53cml0ZShzdHJpbmcuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCWZvcy53cml0ZShzdHJpbmcuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQl9CiAJfQogCkBAIC02MDYsNyArNjA2LDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRGaWxlQ29udGVudHNFcXVhbChGaWxlIGFjdEZpbGUsIFN0cmluZyBzdHJpbmcpCiAJCQkJYm9zLndyaXRlKGJ1ZmZlciwgMCwgcmVhZCk7CiAJCQkJcmVhZCA9IGZpcy5yZWFkKGJ1ZmZlcik7CiAJCQl9Ci0JCQlTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoYm9zLnRvQnl0ZUFycmF5KCksIFVURl84KTsKKwkJCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhib3MudG9CeXRlQXJyYXkoKSwgQ0hBUlNFVCk7CiAJCQlhc3NlcnRFcXVhbHMoc3RyaW5nLCBjb250ZW50KTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVsbENvbW1hbmRXaXRoUmViYXNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKaW5kZXggOTEzYjRhYy4uYjM0OWM2NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdWxsQ29tbWFuZFdpdGhSZWJhc2VUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtMzk2LDcgKzM5Niw3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCB3cml0ZVRvRmlsZShGaWxlIGFjdEZpbGUsIFN0cmluZyBzdHJpbmcpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oYWN0RmlsZSkpIHsKLQkJCWZvcy53cml0ZShzdHJpbmcuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCWZvcy53cml0ZShzdHJpbmcuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQl9CiAJfQogCkBAIC00MTAsNyArNDEwLDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRGaWxlQ29udGVudHNFcXVhbChGaWxlIGFjdEZpbGUsIFN0cmluZyBzdHJpbmcpCiAJCQkJYm9zLndyaXRlKGJ1ZmZlciwgMCwgcmVhZCk7CiAJCQkJcmVhZCA9IGZpcy5yZWFkKGJ1ZmZlcik7CiAJCQl9Ci0JCQlTdHJpbmcgY29udGVudCA9IG5ldyBTdHJpbmcoYm9zLnRvQnl0ZUFycmF5KCksIFVURl84KTsKKwkJCVN0cmluZyBjb250ZW50ID0gbmV3IFN0cmluZyhib3MudG9CeXRlQXJyYXkoKSwgQ0hBUlNFVCk7CiAJCQlhc3NlcnRFcXVhbHMoc3RyaW5nLCBjb250ZW50KTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kVGVzdC5qYXZhCmluZGV4IGUwYzE0OTkuLjFhZjM3ZTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZFRlc3QuamF2YQpAQCAtMTUyLDcgKzE1Miw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQcmVQdXNoSG9vaygpIHRocm93cyBKR2l0SW50ZXJuYWxFeGNlcHRpb24sIElPRXhjZXB0aW9uLAogCQl9CiAJfQogCi0JcHJpdmF0ZSBGaWxlIHdyaXRlSG9va0ZpbGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkYXRhKQorCXByaXZhdGUgRmlsZSB3cml0ZUhvb2tGaWxlKFN0cmluZyBuYW1lLCBTdHJpbmcgZGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgcGF0aCA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCkgKyAiLy5naXQvaG9va3MvIiwgbmFtZSk7CiAJCUpHaXRUZXN0VXRpbC53cml0ZShwYXRoLCBkYXRhKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZFRlc3QuamF2YQppbmRleCAyYmY5MWFlLi45NmU3MDkxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOwogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdDsKIGltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKQEAgLTE0NjQsNyArMTQ2NCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RBdXRob3JTY3JpcHRDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKCJHSVRfQVVUSE9SX0RBVEU9J0AxMjM0NTY3ODkgLTAxMDAnIiwgbGluZXNbMl0pOwogCiAJCVBlcnNvbklkZW50IHBhcnNlZElkZW50ID0gZ2l0LnJlYmFzZSgpLnBhcnNlQXV0aG9yKAotCQkJCWNvbnZlcnRlZEF1dGhvci5nZXRCeXRlcyhVVEZfOCkpOworCQkJCWNvbnZlcnRlZEF1dGhvci5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWFzc2VydEVxdWFscyhpZGVudC5nZXROYW1lKCksIHBhcnNlZElkZW50LmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscyhpZGVudC5nZXRFbWFpbEFkZHJlc3MoKSwgcGFyc2VkSWRlbnQuZ2V0RW1haWxBZGRyZXNzKCkpOwogCQkvLyB0aGlzIGlzIHJvdW5kZWQgdG8gdGhlIGxhc3Qgc2Vjb25kCkBAIC0xNDgxLDcgKzE0ODEsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0QXV0aG9yU2NyaXB0Q29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydEVxdWFscygiR0lUX0FVVEhPUl9EQVRFPSdAMTIzNDU2Nzg5ICswOTMwJyIsIGxpbmVzWzJdKTsKIAogCQlwYXJzZWRJZGVudCA9IGdpdC5yZWJhc2UoKS5wYXJzZUF1dGhvcigKLQkJCQljb252ZXJ0ZWRBdXRob3IuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQljb252ZXJ0ZWRBdXRob3IuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlhc3NlcnRFcXVhbHMoaWRlbnQuZ2V0TmFtZSgpLCBwYXJzZWRJZGVudC5nZXROYW1lKCkpOwogCQlhc3NlcnRFcXVhbHMoaWRlbnQuZ2V0RW1haWxBZGRyZXNzKCksIHBhcnNlZElkZW50LmdldEVtYWlsQWRkcmVzcygpKTsKIAkJYXNzZXJ0RXF1YWxzKDEyMzQ1Njc4OTAwMEwsIHBhcnNlZElkZW50LmdldFdoZW4oKS5nZXRUaW1lKCkpOwpAQCAtMjEwNCw3ICsyMTA0LDcgQEAgcHJpdmF0ZSBpbnQgY291bnRQaWNrcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWludCBjb3VudCA9IDA7CiAJCUZpbGUgdG9kb0ZpbGUgPSBnZXRUb2RvRmlsZSgpOwogCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKLQkJCQluZXcgRmlsZUlucHV0U3RyZWFtKHRvZG9GaWxlKSwgVVRGXzgpKSkgeworCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0odG9kb0ZpbGUpLCBDSEFSU0VUKSkpIHsKIAkJCVN0cmluZyBsaW5lID0gYnIucmVhZExpbmUoKTsKIAkJCXdoaWxlIChsaW5lICE9IG51bGwpIHsKIAkJCQlpbnQgZmlyc3RCbGFuayA9IGxpbmUuaW5kZXhPZignICcpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1Jlc2V0Q29tbWFuZFRlc3QuamF2YQppbmRleCBiYTUxODgxLi44ZjU2YTkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1Jlc2V0Q29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1Jlc2V0Q29tbWFuZFRlc3QuamF2YQpAQCAtMTAwLDM5ICsxMDAsMzkgQEAgcHVibGljIHZvaWQgc2V0dXBSZXBvc2l0b3J5KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBKR2l0SW50ZXJuYWxFeGNlcHRpb24sCiAJCUZpbGUgbmVzdGVkRmlsZSA9IG5ldyBGaWxlKGRpciwgImIudHh0Iik7CiAJCUZpbGVVdGlscy5jcmVhdGVOZXdGaWxlKG5lc3RlZEZpbGUpOwogCi0JCVByaW50V3JpdGVyIG5lc3RlckZpbGVXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmVzdGVkRmlsZSk7Ci0JCW5lc3RlckZpbGVXcml0ZXIucHJpbnQoImNvbnRlbnQiKTsKLQkJbmVzdGVyRmlsZVdyaXRlci5mbHVzaCgpOworCQl0cnkgKFByaW50V3JpdGVyIG5lc3RlZEZpbGVXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmVzdGVkRmlsZSkpIHsKKwkJCW5lc3RlZEZpbGVXcml0ZXIucHJpbnQoImNvbnRlbnQiKTsKKwkJCW5lc3RlZEZpbGVXcml0ZXIuZmx1c2goKTsKIAotCQkvLyBjcmVhdGUgZmlsZQotCQlpbmRleEZpbGUgPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiYS50eHQiKTsKLQkJRmlsZVV0aWxzLmNyZWF0ZU5ld0ZpbGUoaW5kZXhGaWxlKTsKLQkJUHJpbnRXcml0ZXIgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKGluZGV4RmlsZSk7Ci0JCXdyaXRlci5wcmludCgiY29udGVudCIpOwotCQl3cml0ZXIuZmx1c2goKTsKKwkJCS8vIGNyZWF0ZSBmaWxlCisJCQlpbmRleEZpbGUgPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiYS50eHQiKTsKKwkJCUZpbGVVdGlscy5jcmVhdGVOZXdGaWxlKGluZGV4RmlsZSk7CisJCQl0cnkgKFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihpbmRleEZpbGUpKSB7CisJCQkJd3JpdGVyLnByaW50KCJjb250ZW50Iik7CisJCQkJd3JpdGVyLmZsdXNoKCk7CiAKLQkJLy8gYWRkIGZpbGUgYW5kIGNvbW1pdCBpdAotCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImRpciIpLmFkZEZpbGVwYXR0ZXJuKCJhLnR4dCIpLmNhbGwoKTsKLQkJc2Vjb25kQ29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBhLnR4dCBhbmQgZGlyL2IudHh0IikKLQkJCQkuY2FsbCgpOworCQkJCS8vIGFkZCBmaWxlIGFuZCBjb21taXQgaXQKKwkJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImRpciIpLmFkZEZpbGVwYXR0ZXJuKCJhLnR4dCIpLmNhbGwoKTsKKwkJCQlzZWNvbmRDb21taXQgPSBnaXQuY29tbWl0KCkKKwkJCQkJCS5zZXRNZXNzYWdlKCJhZGRpbmcgYS50eHQgYW5kIGRpci9iLnR4dCIpLmNhbGwoKTsKIAotCQlwcmVzdGFnZSA9IERpckNhY2hlLnJlYWQoZGIuZ2V0SW5kZXhGaWxlKCksIGRiLmdldEZTKCkpLmdldEVudHJ5KAotCQkJCWluZGV4RmlsZS5nZXROYW1lKCkpOworCQkJCXByZXN0YWdlID0gRGlyQ2FjaGUucmVhZChkYi5nZXRJbmRleEZpbGUoKSwgZGIuZ2V0RlMoKSkKKwkJCQkJCS5nZXRFbnRyeShpbmRleEZpbGUuZ2V0TmFtZSgpKTsKIAotCQkvLyBtb2RpZnkgZmlsZSBhbmQgYWRkIHRvIGluZGV4Ci0JCXdyaXRlci5wcmludCgibmV3IGNvbnRlbnQiKTsKLQkJd3JpdGVyLmNsb3NlKCk7Ci0JCW5lc3RlckZpbGVXcml0ZXIucHJpbnQoIm5ldyBjb250ZW50Iik7Ci0JCW5lc3RlckZpbGVXcml0ZXIuY2xvc2UoKTsKKwkJCQkvLyBtb2RpZnkgZmlsZSBhbmQgYWRkIHRvIGluZGV4CisJCQkJd3JpdGVyLnByaW50KCJuZXcgY29udGVudCIpOworCQkJfQorCQkJbmVzdGVkRmlsZVdyaXRlci5wcmludCgibmV3IGNvbnRlbnQiKTsKKwkJfQogCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImEudHh0IikuYWRkRmlsZXBhdHRlcm4oImRpciIpLmNhbGwoKTsKIAogCQkvLyBjcmVhdGUgYSBmaWxlIG5vdCBhZGRlZCB0byB0aGUgaW5kZXgKIAkJdW50cmFja2VkRmlsZSA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksCiAJCQkJIm5vdEFkZGVkVG9JbmRleC50eHQiKTsKIAkJRmlsZVV0aWxzLmNyZWF0ZU5ld0ZpbGUodW50cmFja2VkRmlsZSk7Ci0JCVByaW50V3JpdGVyIHdyaXRlcjIgPSBuZXcgUHJpbnRXcml0ZXIodW50cmFja2VkRmlsZSk7Ci0JCXdyaXRlcjIucHJpbnQoImNvbnRlbnQiKTsKLQkJd3JpdGVyMi5jbG9zZSgpOworCQl0cnkgKFByaW50V3JpdGVyIHdyaXRlcjIgPSBuZXcgUHJpbnRXcml0ZXIodW50cmFja2VkRmlsZSkpIHsKKwkJCXdyaXRlcjIucHJpbnQoImNvbnRlbnQiKTsKKwkJfQogCX0KIAogCUBUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1JldmVydENvbW1hbmRUZXN0LmphdmEKaW5kZXggZWE2MzEwNC4uZDc3YzRlMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXZlcnRDb21tYW5kVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmV2ZXJ0Q29tbWFuZFRlc3QuamF2YQpAQCAtMzc5LDcgKzM3OSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXZlcnRPdXJDb21taXROYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIFJldkNvbW1pdCBwcmVwYXJlUmV2ZXJ0KGZpbmFsIEdpdCBnaXQpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgUmV2Q29tbWl0IHByZXBhcmVSZXZlcnQoR2l0IGdpdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCS8vIGNyZWF0ZSwgYWRkIGFuZCBjb21taXQgZmlsZSBhCiAJCXdyaXRlVHJhc2hGaWxlKCJhIiwgImEiKTsKIAkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJhIikuY2FsbCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaENyZWF0ZUNvbW1hbmRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZFRlc3QuamF2YQppbmRleCBiOWY5ZjViLi4zYjU4MmQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZFRlc3QuamF2YQpAQCAtOTQsNyArOTQsNyBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQl1bnRyYWNrZWRGaWxlID0gd3JpdGVUcmFzaEZpbGUoInVudHJhY2tlZC50eHQiLCAiY29udGVudCIpOwogCX0KIAotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVN0YXNoZWRDb21taXQoZmluYWwgUmV2Q29tbWl0IGNvbW1pdCkKKwlwcml2YXRlIHZvaWQgdmFsaWRhdGVTdGFzaGVkQ29tbWl0KFJldkNvbW1pdCBjb21taXQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl2YWxpZGF0ZVN0YXNoZWRDb21taXQoY29tbWl0LCAyKTsKIAl9CkBAIC0xNDAsNyArMTQwLDcgQEAgcHJpdmF0ZSBUcmVlV2FsayBjcmVhdGVUcmVlV2FsaygpIHsKIAkJcmV0dXJuIHdhbGs7CiAJfQogCi0JcHJpdmF0ZSBMaXN0PERpZmZFbnRyeT4gZGlmZldvcmtpbmdBZ2FpbnN0SGVhZChmaW5hbCBSZXZDb21taXQgY29tbWl0KQorCXByaXZhdGUgTGlzdDxEaWZmRW50cnk+IGRpZmZXb3JraW5nQWdhaW5zdEhlYWQoUmV2Q29tbWl0IGNvbW1pdCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoVHJlZVdhbGsgd2FsayA9IGNyZWF0ZVRyZWVXYWxrKCkpIHsKIAkJCXdhbGsuYWRkVHJlZShjb21taXQuZ2V0UGFyZW50KDApLmdldFRyZWUoKSk7CkBAIC0xNDksNyArMTQ5LDcgQEAgcHJpdmF0ZSBMaXN0PERpZmZFbnRyeT4gZGlmZldvcmtpbmdBZ2FpbnN0SGVhZChmaW5hbCBSZXZDb21taXQgY29tbWl0KQogCQl9CiAJfQogCi0JcHJpdmF0ZSBMaXN0PERpZmZFbnRyeT4gZGlmZkluZGV4QWdhaW5zdEhlYWQoZmluYWwgUmV2Q29tbWl0IGNvbW1pdCkKKwlwcml2YXRlIExpc3Q8RGlmZkVudHJ5PiBkaWZmSW5kZXhBZ2FpbnN0SGVhZChSZXZDb21taXQgY29tbWl0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChUcmVlV2FsayB3YWxrID0gY3JlYXRlVHJlZVdhbGsoKSkgewogCQkJd2Fsay5hZGRUcmVlKGNvbW1pdC5nZXRQYXJlbnQoMCkuZ2V0VHJlZSgpKTsKQEAgLTE1OCw3ICsxNTgsNyBAQCBwcml2YXRlIExpc3Q8RGlmZkVudHJ5PiBkaWZmSW5kZXhBZ2FpbnN0SGVhZChmaW5hbCBSZXZDb21taXQgY29tbWl0KQogCQl9CiAJfQogCi0JcHJpdmF0ZSBMaXN0PERpZmZFbnRyeT4gZGlmZkluZGV4QWdhaW5zdFdvcmtpbmcoZmluYWwgUmV2Q29tbWl0IGNvbW1pdCkKKwlwcml2YXRlIExpc3Q8RGlmZkVudHJ5PiBkaWZmSW5kZXhBZ2FpbnN0V29ya2luZyhSZXZDb21taXQgY29tbWl0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChUcmVlV2FsayB3YWxrID0gY3JlYXRlVHJlZVdhbGsoKSkgewogCQkJd2Fsay5hZGRUcmVlKGNvbW1pdC5nZXRQYXJlbnQoMSkuZ2V0VHJlZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvVGFnQ29tbWFuZFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9hcGkvVGFnQ29tbWFuZFRlc3QuamF2YQppbmRleCA4NzA5OGI2Li5hMjIwZTc3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvYXBpL1RhZ0NvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9UYWdDb21tYW5kVGVzdC5qYXZhCkBAIC00Miw2ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5hcGk7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfVEFHUzsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKIApAQCAtNjYsMTkgKzY3LDIyIEBAIHB1YmxpYyB2b2lkIHRlc3RUYWdnaW5nT25IZWFkKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQkJCVJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKGRiKSkgewogCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJpbml0aWFsIGNvbW1pdCIpLmNhbGwoKTsKIAkJCVJlZiB0YWdSZWYgPSBnaXQudGFnKCkuc2V0TmFtZSgidGFnIikuY2FsbCgpOwotCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLCBkYi5wZWVsKHRhZ1JlZikuZ2V0UGVlbGVkT2JqZWN0SWQoKSk7CisJCQlhc3NlcnRFcXVhbHMoY29tbWl0LmdldElkKCksCisJCQkJCWRiLmdldFJlZkRhdGFiYXNlKCkucGVlbCh0YWdSZWYpLmdldFBlZWxlZE9iamVjdElkKCkpOwogCQkJYXNzZXJ0RXF1YWxzKCJ0YWciLCB3YWxrLnBhcnNlVGFnKHRhZ1JlZi5nZXRPYmplY3RJZCgpKS5nZXRUYWdOYW1lKCkpOwogCQl9CiAJfQogCiAJQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0VGFnZ2luZygpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIEpHaXRJbnRlcm5hbEV4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgdGVzdFRhZ2dpbmcoKQorCQkJdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSkdpdEludGVybmFsRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CiAJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCBjb21taXQiKS5jYWxsKCk7CiAJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoInNlY29uZCBjb21taXQiKS5jYWxsKCk7CiAJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgidGhpcmQgY29tbWl0IikuY2FsbCgpOwogCQkJUmVmIHRhZ1JlZiA9IGdpdC50YWcoKS5zZXRPYmplY3RJZChjb21taXQpLnNldE5hbWUoInRhZyIpLmNhbGwoKTsKLQkJCWFzc2VydEVxdWFscyhjb21taXQuZ2V0SWQoKSwgZGIucGVlbCh0YWdSZWYpLmdldFBlZWxlZE9iamVjdElkKCkpOworCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdC5nZXRJZCgpLAorCQkJCQlkYi5nZXRSZWZEYXRhYmFzZSgpLnBlZWwodGFnUmVmKS5nZXRQZWVsZWRPYmplY3RJZCgpKTsKIAkJfQogCX0KIApAQCAtMTM1LDI2ICsxMzksMzAgQEAgcHVibGljIHZvaWQgdGVzdEZhaWx1cmVPblNpZ25lZFRhZ3MoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKIAkJfQogCX0KIAorCXByaXZhdGUgTGlzdDxSZWY+IGdldFRhZ3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmc0J5UHJlZml4KFJfVEFHUyk7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRyeSAoR2l0IGdpdCA9IG5ldyBHaXQoZGIpKSB7CiAJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiaW5pdGlhbCBjb21taXQiKS5jYWxsKCk7CiAJCQlSZWYgdGFnUmVmID0gZ2l0LnRhZygpLnNldE5hbWUoInRhZyIpLmNhbGwoKTsKLQkJCWFzc2VydEVxdWFscygxLCBkYi5nZXRUYWdzKCkuc2l6ZSgpKTsKKwkJCWFzc2VydEVxdWFscygxLCBnZXRUYWdzKCkuc2l6ZSgpKTsKIAogCQkJTGlzdDxTdHJpbmc+IGRlbGV0ZWQgPSBnaXQudGFnRGVsZXRlKCkuc2V0VGFncyh0YWdSZWYuZ2V0TmFtZSgpKQogCQkJCQkuY2FsbCgpOwogCQkJYXNzZXJ0RXF1YWxzKDEsIGRlbGV0ZWQuc2l6ZSgpKTsKIAkJCWFzc2VydEVxdWFscyh0YWdSZWYuZ2V0TmFtZSgpLCBkZWxldGVkLmdldCgwKSk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgZGIuZ2V0VGFncygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoMCwgZ2V0VGFncygpLnNpemUoKSk7CiAKIAkJCVJlZiB0YWdSZWYxID0gZ2l0LnRhZygpLnNldE5hbWUoInRhZzEiKS5jYWxsKCk7CiAJCQlSZWYgdGFnUmVmMiA9IGdpdC50YWcoKS5zZXROYW1lKCJ0YWcyIikuY2FsbCgpOwotCQkJYXNzZXJ0RXF1YWxzKDIsIGRiLmdldFRhZ3MoKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKDIsIGdldFRhZ3MoKS5zaXplKCkpOwogCQkJZGVsZXRlZCA9IGdpdC50YWdEZWxldGUoKS5zZXRUYWdzKHRhZ1JlZjEuZ2V0TmFtZSgpLCB0YWdSZWYyLmdldE5hbWUoKSkKIAkJCQkJLmNhbGwoKTsKIAkJCWFzc2VydEVxdWFscygyLCBkZWxldGVkLnNpemUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoMCwgZGIuZ2V0VGFncygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoMCwgZ2V0VGFncygpLnNpemUoKSk7CiAJCX0KIAl9CiAKQEAgLTE2MywxMyArMTcxLDEzIEBAIHB1YmxpYyB2b2lkIHRlc3REZWxldGVGdWxsTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgewogCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImluaXRpYWwgY29tbWl0IikuY2FsbCgpOwogCQkJUmVmIHRhZ1JlZiA9IGdpdC50YWcoKS5zZXROYW1lKCJ0YWciKS5jYWxsKCk7Ci0JCQlhc3NlcnRFcXVhbHMoMSwgZGIuZ2V0VGFncygpLnNpemUoKSk7CisJCQlhc3NlcnRFcXVhbHMoMSwgZ2V0VGFncygpLnNpemUoKSk7CiAKIAkJCUxpc3Q8U3RyaW5nPiBkZWxldGVkID0gZ2l0LnRhZ0RlbGV0ZSgpCiAJCQkJCS5zZXRUYWdzKFJlcG9zaXRvcnkuc2hvcnRlblJlZk5hbWUodGFnUmVmLmdldE5hbWUoKSkpLmNhbGwoKTsKIAkJCWFzc2VydEVxdWFscygxLCBkZWxldGVkLnNpemUoKSk7CiAJCQlhc3NlcnRFcXVhbHModGFnUmVmLmdldE5hbWUoKSwgZGVsZXRlZC5nZXQoMCkpOwotCQkJYXNzZXJ0RXF1YWxzKDAsIGRiLmdldFRhZ3MoKS5zaXplKCkpOworCQkJYXNzZXJ0RXF1YWxzKDAsIGdldFRhZ3MoKS5zaXplKCkpOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9BYnN0cmFjdERpZmZUZXN0Q2FzZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvQWJzdHJhY3REaWZmVGVzdENhc2UuamF2YQppbmRleCAwZjEzYTY4Li4zMmYzNDIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9BYnN0cmFjdERpZmZUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0Fic3RyYWN0RGlmZlRlc3RDYXNlLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmRpZmY7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIApAQCAtMjQwLDYgKzI0MCw2IEBAIHB1YmxpYyBzdGF0aWMgUmF3VGV4dCB0KFN0cmluZyB0ZXh0KSB7CiAJCQlyLmFwcGVuZCh0ZXh0LmNoYXJBdChpKSk7CiAJCQlyLmFwcGVuZCgnXG4nKTsKIAkJfQotCQlyZXR1cm4gbmV3IFJhd1RleHQoci50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCXJldHVybiBuZXcgUmF3VGV4dChyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXJSZWZsb3dUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyUmVmbG93VGVzdC5qYXZhCmluZGV4IDQ5ZTVkMWIuLjBlMzQ0ZjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXJSZWZsb3dUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlclJlZmxvd1Rlc3QuamF2YQpAQCAtMTQ2LDcgKzE0Niw3IEBAIHB1YmxpYyB2b2lkIHRlc3ROb05ld0xpbmUyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0Rm9ybWF0dGVkKCJaLnBhdGNoIik7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluaXQoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGluaXQoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWEgPSBuZXcgUmF3VGV4dChyZWFkRmlsZShuYW1lICsgIl9QcmVJbWFnZSIpKTsKIAkJYiA9IG5ldyBSYXdUZXh0KHJlYWRGaWxlKG5hbWUgKyAiX1Bvc3RJbWFnZSIpKTsKIAkJZmlsZSA9IHBhcnNlVGVzdFBhdGNoRmlsZShuYW1lICsgIi5wYXRjaCIpLmdldEZpbGVzKCkuZ2V0KDApOwpAQCAtMTU2LDEzICsxNTYsMTMgQEAgcHJpdmF0ZSB2b2lkIGFzc2VydEZvcm1hdHRlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWFzc2VydEZvcm1hdHRlZChKR2l0VGVzdFV0aWwuZ2V0TmFtZSgpICsgIi5vdXQiKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYXNzZXJ0Rm9ybWF0dGVkKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBhc3NlcnRGb3JtYXR0ZWQoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZtdC5mb3JtYXQoZmlsZSwgYSwgYik7CiAJCWZpbmFsIFN0cmluZyBleHAgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShyZWFkRmlsZShuYW1lKSk7CiAJCWFzc2VydEVxdWFscyhleHAsIFJhd1BhcnNlVXRpbHMuZGVjb2RlKG91dC50b0J5dGVBcnJheSgpKSk7CiAJfQogCi0JcHJpdmF0ZSBieXRlW10gcmVhZEZpbGUoZmluYWwgU3RyaW5nIHBhdGNoRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIGJ5dGVbXSByZWFkRmlsZShTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpOwogCQlpZiAoaW4gPT0gbnVsbCkgewogCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKQEAgLTE4MCw3ICsxODAsNyBAQCBwcml2YXRlIHZvaWQgYXNzZXJ0Rm9ybWF0dGVkKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSBQYXRjaCBwYXJzZVRlc3RQYXRjaEZpbGUoZmluYWwgU3RyaW5nIHBhdGNoRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZShTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKIAkJCWlmIChpbiA9PSBudWxsKSB7CiAJCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0VGVzdC5qYXZhCmluZGV4IDZhZDU5YjkuLjU4YThiMmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dFRlc3QuamF2YQpAQCAtNDQsNyArNDQsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwpAQCAtNjUsNiArNjYsMTYgQEAgcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEJpbmFyeSgpIHsKKwkJU3RyaW5nIGlucHV0ID0gImZvby1hXG5mXDBvLWJcbiI7CisJCWJ5dGVbXSBkYXRhID0gQ29uc3RhbnRzLmVuY29kZUFTQ0lJKGlucHV0KTsKKwkJZmluYWwgUmF3VGV4dCBhID0gbmV3IFJhd1RleHQoZGF0YSk7CisJCWFzc2VydEFycmF5RXF1YWxzKGEuY29udGVudCwgZGF0YSk7CisJCWFzc2VydEVxdWFscyhhLnNpemUoKSwgMSk7CisJCWFzc2VydEVxdWFscyhhLmdldFN0cmluZygwLCAxLCBmYWxzZSksIGlucHV0KTsKKwl9CisKKwlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CiAJCWZpbmFsIFJhd1RleHQgYSA9IG5ldyBSYXdUZXh0KENvbnN0YW50cy5lbmNvZGVBU0NJSSgiZm9vLWFcbmZvby1iXG4iKSk7CiAJCWZpbmFsIFJhd1RleHQgYiA9IG5ldyBSYXdUZXh0KENvbnN0YW50cy5lbmNvZGVBU0NJSSgiZm9vLWJcbmZvby1jXG4iKSk7CkBAIC0xMzYsOCArMTQ3LDggQEAgcHVibGljIHZvaWQgdGVzdENvbXBhcmF0b3JSZWR1Y2VDb21tb25TdGFydEVuZCgpIHsKIAkJZSA9IGMucmVkdWNlQ29tbW9uU3RhcnRFbmQodCgiYWJReHkiKSwgdCgiYWJSeHkiKSwgZSk7CiAJCWFzc2VydEVxdWFscyhuZXcgRWRpdCgyLCAzLCAyLCAzKSwgZSk7CiAKLQkJUmF3VGV4dCBhID0gbmV3IFJhd1RleHQoInBcbmEgYlxuUVxuYyBkXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCVJhd1RleHQgYiA9IG5ldyBSYXdUZXh0KCJwXG5hICBiIFxuUlxuIGMgIGQgXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCVJhd1RleHQgYSA9IG5ldyBSYXdUZXh0KCJwXG5hIGJcblFcbmMgZFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCVJhd1RleHQgYiA9IG5ldyBSYXdUZXh0KCJwXG5hICBiIFxuUlxuIGMgIGQgXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZSA9IG5ldyBFZGl0KDAsIDQsIDAsIDQpOwogCQllID0gUmF3VGV4dENvbXBhcmF0b3IuV1NfSUdOT1JFX0FMTC5yZWR1Y2VDb21tb25TdGFydEVuZChhLCBiLCBlKTsKIAkJYXNzZXJ0RXF1YWxzKG5ldyBFZGl0KDIsIDMsIDIsIDMpLCBlKTsKQEAgLTE0OSwxNCArMTYwLDE0IEBAIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJhdG9yUmVkdWNlQ29tbW9uU3RhcnRFbmRfRW1wdHlMaW5lKCkgewogCQlSYXdUZXh0IGI7CiAJCUVkaXQgZTsKIAotCQlhID0gbmV3IFJhd1RleHQoIlJcbiB5XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIgPSBuZXcgUmF3VGV4dCgiU1xuXG4geVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQlhID0gbmV3IFJhd1RleHQoIlJcbiB5XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYiA9IG5ldyBSYXdUZXh0KCJTXG5cbiB5XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZSA9IG5ldyBFZGl0KDAsIDIsIDAsIDMpOwogCQllID0gUmF3VGV4dENvbXBhcmF0b3IuREVGQVVMVC5yZWR1Y2VDb21tb25TdGFydEVuZChhLCBiLCBlKTsKIAkJYXNzZXJ0RXF1YWxzKG5ldyBFZGl0KDAsIDEsIDAsIDIpLCBlKTsKIAotCQlhID0gbmV3IFJhd1RleHQoIlNcblxuIHlcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYiA9IG5ldyBSYXdUZXh0KCJSXG4geVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQlhID0gbmV3IFJhd1RleHQoIlNcblxuIHlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliID0gbmV3IFJhd1RleHQoIlJcbiB5XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJZSA9IG5ldyBFZGl0KDAsIDMsIDAsIDIpOwogCQllID0gUmF3VGV4dENvbXBhcmF0b3IuREVGQVVMVC5yZWR1Y2VDb21tb25TdGFydEVuZChhLCBiLCBlKTsKIAkJYXNzZXJ0RXF1YWxzKG5ldyBFZGl0KDAsIDIsIDAsIDEpLCBlKTsKQEAgLTE2Nyw4ICsxNzgsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0Q29tcGFyYXRvclJlZHVjZUNvbW1vblN0YXJ0QnV0TGFzdExpbmVOb0VvbCgpIHsKIAkJUmF3VGV4dCBhOwogCQlSYXdUZXh0IGI7CiAJCUVkaXQgZTsKLQkJYSA9IG5ldyBSYXdUZXh0KCJzdGFydCIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYiA9IG5ldyBSYXdUZXh0KCJzdGFydCBvZiBsaW5lIi5nZXRCeXRlcyhVVEZfOCkpOworCQlhID0gbmV3IFJhd1RleHQoInN0YXJ0Ii5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIgPSBuZXcgUmF3VGV4dCgic3RhcnQgb2YgbGluZSIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQllID0gbmV3IEVkaXQoMCwgMSwgMCwgMSk7CiAJCWUgPSBSYXdUZXh0Q29tcGFyYXRvci5ERUZBVUxULnJlZHVjZUNvbW1vblN0YXJ0RW5kKGEsIGIsIGUpOwogCQlhc3NlcnRFcXVhbHMobmV3IEVkaXQoMCwgMSwgMCwgMSksIGUpOwpAQCAtMTc5LDggKzE5MCw4IEBAIHB1YmxpYyB2b2lkIHRlc3RDb21wYXJhdG9yUmVkdWNlQ29tbW9uU3RhcnRCdXRMYXN0TGluZU5vRW9sXzIoKSB7CiAJCVJhd1RleHQgYTsKIAkJUmF3VGV4dCBiOwogCQlFZGl0IGU7Ci0JCWEgPSBuZXcgUmF3VGV4dCgic3RhcnQiLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIgPSBuZXcgUmF3VGV4dCgic3RhcnQgb2Zcbmxhc3RsaW5lIi5nZXRCeXRlcyhVVEZfOCkpOworCQlhID0gbmV3IFJhd1RleHQoInN0YXJ0Ii5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIgPSBuZXcgUmF3VGV4dCgic3RhcnQgb2Zcbmxhc3RsaW5lIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWUgPSBuZXcgRWRpdCgwLCAxLCAwLCAyKTsKIAkJZSA9IFJhd1RleHRDb21wYXJhdG9yLkRFRkFVTFQucmVkdWNlQ29tbW9uU3RhcnRFbmQoYSwgYiwgZSk7CiAJCWFzc2VydEVxdWFscyhuZXcgRWRpdCgwLCAxLCAwLCAyKSwgZSk7CkBAIC0yMzksNiArMjUwLDYgQEAgcHJpdmF0ZSBzdGF0aWMgUmF3VGV4dCB0KFN0cmluZyB0ZXh0KSB7CiAJCQlyLmFwcGVuZCh0ZXh0LmNoYXJBdChpKSk7CiAJCQlyLmFwcGVuZCgnXG4nKTsKIAkJfQotCQlyZXR1cm4gbmV3IFJhd1RleHQoci50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCXJldHVybiBuZXcgUmF3VGV4dChyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1NpbWlsYXJpdHlJbmRleFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1NpbWlsYXJpdHlJbmRleFRlc3QuamF2YQppbmRleCBmMTY4ZTgzLi41MWE2ZjgxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlmZi9TaW1pbGFyaXR5SW5kZXhUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvU2ltaWxhcml0eUluZGV4VGVzdC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5kaWZmOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKQEAgLTgyLDcgKzgyLDcgQEAgcHVibGljIHZvaWQgdGVzdEluZGV4aW5nTGFyZ2VPYmplY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQkJKyAiQVxuIiAvLwogCQkJCSsgIkJcbiIgLy8KIAkJCQkrICJCXG4iIC8vCi0JCQkJKyAiQlxuIikuZ2V0Qnl0ZXMoVVRGXzgpOworCQkJCSsgIkJcbiIpLmdldEJ5dGVzKENIQVJTRVQpOwogCQlTaW1pbGFyaXR5SW5kZXggc2kgPSBuZXcgU2ltaWxhcml0eUluZGV4KCk7CiAJCXNpLmhhc2gobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGluKSwgaW4ubGVuZ3RoLCBmYWxzZSk7CiAJCWFzc2VydEVxdWFscygyLCBzaS5zaXplKCkpOwpAQCAtMTMwLDEyICsxMzAsMTIgQEAgcHVibGljIHZvaWQgdGVzdENvbW1vblNjb3JlTGFyZ2VPYmplY3RfU2FtZUZpbGVzX0NSX2Nhbm9uaWNhbGl6YXRpb24oKQogCQkJCSsgIkRcclxuIiAvLwogCQkJCSsgIkJcclxuIjsKIAkJU2ltaWxhcml0eUluZGV4IHNyYyA9IG5ldyBTaW1pbGFyaXR5SW5kZXgoKTsKLQkJYnl0ZVtdIGJ5dGVzMSA9IHRleHQuZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gYnl0ZXMxID0gdGV4dC5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJc3JjLmhhc2gobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzMSksIGJ5dGVzMS5sZW5ndGgsIHRydWUpOwogCQlzcmMuc29ydCgpOwogCiAJCVNpbWlsYXJpdHlJbmRleCBkc3QgPSBuZXcgU2ltaWxhcml0eUluZGV4KCk7Ci0JCWJ5dGVbXSBieXRlczIgPSB0ZXh0LnJlcGxhY2UoIlxyIiwgIiIpLmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIGJ5dGVzMiA9IHRleHQucmVwbGFjZSgiXHIiLCAiIikuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCWRzdC5oYXNoKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlczIpLCBieXRlczIubGVuZ3RoLCB0cnVlKTsKIAkJZHN0LnNvcnQoKTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlckl0ZXJhdG9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlckl0ZXJhdG9yVGVzdC5qYXZhCmluZGV4IDJiMTA4ODcuLjM1OThmM2EgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkZXJJdGVyYXRvclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZGVySXRlcmF0b3JUZXN0LmphdmEKQEAgLTc4LDcgKzc4LDcgQEAgcHVibGljIHZvaWQgdGVzdFBhdGhGaWx0ZXJHcm91cF9Eb2VzTm90U2tpcFRhaWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQlmaW5hbCBpbnQgZXhwSWR4ID0gMjsKIAkJZmluYWwgRGlyQ2FjaGVCdWlsZGVyIGIgPSBkYy5idWlsZGVyKCk7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IoYikpOwogCQkJdHcuc2V0UmVjdXJzaXZlKHRydWUpOwogCQkJdHcuc2V0RmlsdGVyKFBhdGhGaWx0ZXJHcm91cC5jcmVhdGVGcm9tU3RyaW5ncyhDb2xsZWN0aW9ucwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQ0dpdENvbXBhdGFiaWxpdHlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDR2l0Q29tcGF0YWJpbGl0eVRlc3QuamF2YQppbmRleCBkZWMxNzYyLi5jMzYyZTc0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDR2l0Q29tcGF0YWJpbGl0eVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVDR2l0Q29tcGF0YWJpbGl0eVRlc3QuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKQEAgLTk5LDcgKzk5LDcgQEAgcHVibGljIHZvaWQgdGVzdFRyZWVXYWxrX0xzRmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKGxzLnNpemUoKSwgZGMuZ2V0RW50cnlDb3VudCgpKTsKIAkJewogCQkJZmluYWwgSXRlcmF0b3I8Q0dpdEluZGV4UmVjb3JkPiBySXRyID0gbHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJCXR3LnNldFJlY3Vyc2l2ZSh0cnVlKTsKIAkJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRjKSk7CiAJCQkJd2hpbGUgKHJJdHIuaGFzTmV4dCgpKSB7CkBAIC0xODAsNyArMTgwLDcgQEAgcHVibGljIHZvaWQgdGVzdFJlYWRJbmRleF9EaXJDYWNoZVRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKGNMaXN0LnNpemUoKSwgalRyZWUuZ2V0RW50cnlTcGFuKCkpOwogCiAJCWZpbmFsIEFycmF5TGlzdDxDR2l0THNUcmVlUmVjb3JkPiBzdWJ0cmVlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQlmb3IgKGZpbmFsIENHaXRMc1RyZWVSZWNvcmQgciA6IGNUcmVlLnZhbHVlcygpKSB7CisJCWZvciAoQ0dpdExzVHJlZVJlY29yZCByIDogY1RyZWUudmFsdWVzKCkpIHsKIAkJCWlmIChGaWxlTW9kZS5UUkVFLmVxdWFscyhyLm1vZGUpKQogCQkJCXN1YnRyZWVzLmFkZChyKTsKIAkJfQpAQCAtMjI5LDE0ICsyMjksMTQgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRWM1RyZWVFbnRyeShpbnQgaW5kZXhQb3NpdGlvbiwgU3RyaW5nIHBhdGgsCiAJCWFzc2VydEVxdWFscyhpbnRlbnRUb0FkZCwgZW50cnkuaXNJbnRlbnRUb0FkZCgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBGaWxlIHBhdGhPZihmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByaXZhdGUgc3RhdGljIEZpbGUgcGF0aE9mKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBKR2l0VGVzdFV0aWwuZ2V0VGVzdFJlc291cmNlRmlsZShuYW1lKTsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBDR2l0SW5kZXhSZWNvcmQ+IHJlYWRMc0ZpbGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBDR2l0SW5kZXhSZWNvcmQ+IHIgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CiAJCXRyeSAoQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKAotCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aE9mKCJnaXRnaXQubHNmaWxlcyIpKSwgVVRGXzgpKSkgeworCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aE9mKCJnaXRnaXQubHNmaWxlcyIpKSwgQ0hBUlNFVCkpKSB7CiAJCQlTdHJpbmcgbGluZTsKIAkJCXdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKIAkJCQlmaW5hbCBDR2l0SW5kZXhSZWNvcmQgY3IgPSBuZXcgQ0dpdEluZGV4UmVjb3JkKGxpbmUpOwpAQCAtMjQ5LDcgKzI0OSw3IEBAIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIENHaXRJbmRleFJlY29yZD4gcmVhZExzRmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBDR2l0THNUcmVlUmVjb3JkPiByZWFkTHNUcmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIExpbmtlZEhhc2hNYXA8U3RyaW5nLCBDR2l0THNUcmVlUmVjb3JkPiByID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKLQkJCQluZXcgRmlsZUlucHV0U3RyZWFtKHBhdGhPZigiZ2l0Z2l0LmxzdHJlZSIpKSwgVVRGXzgpKSkgeworCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aE9mKCJnaXRnaXQubHN0cmVlIikpLCBDSEFSU0VUKSkpIHsKIAkJCVN0cmluZyBsaW5lOwogCQkJd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewogCQkJCWZpbmFsIENHaXRMc1RyZWVSZWNvcmQgY3IgPSBuZXcgQ0dpdExzVHJlZVJlY29yZChsaW5lKTsKQEAgLTI2OCw3ICsyNjgsNyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBDR2l0SW5kZXhSZWNvcmQgewogCiAJCWZpbmFsIFN0cmluZyBwYXRoOwogCi0JCUNHaXRJbmRleFJlY29yZChmaW5hbCBTdHJpbmcgbGluZSkgeworCQlDR2l0SW5kZXhSZWNvcmQoU3RyaW5nIGxpbmUpIHsKIAkJCWZpbmFsIGludCB0YWIgPSBsaW5lLmluZGV4T2YoJ1x0Jyk7CiAJCQlmaW5hbCBpbnQgc3AxID0gbGluZS5pbmRleE9mKCcgJyk7CiAJCQlmaW5hbCBpbnQgc3AyID0gbGluZS5pbmRleE9mKCcgJywgc3AxICsgMSk7CkBAIC0yODYsNyArMjg2LDcgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0dpdExzVHJlZVJlY29yZCB7CiAKIAkJZmluYWwgU3RyaW5nIHBhdGg7CiAKLQkJQ0dpdExzVHJlZVJlY29yZChmaW5hbCBTdHJpbmcgbGluZSkgeworCQlDR2l0THNUcmVlUmVjb3JkKFN0cmluZyBsaW5lKSB7CiAJCQlmaW5hbCBpbnQgdGFiID0gbGluZS5pbmRleE9mKCdcdCcpOwogCQkJZmluYWwgaW50IHNwMSA9IGxpbmUuaW5kZXhPZignICcpOwogCQkJZmluYWwgaW50IHNwMiA9IGxpbmUuaW5kZXhPZignICcsIHNwMSArIDEpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlRW50cnlUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeVRlc3QuamF2YQppbmRleCAwNWZhMDA3Li44NmUyODUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeVRlc3QuamF2YQpAQCAtMTgzLDcgKzE4Myw3IEBAIHB1YmxpYyB2b2lkIHRlc3RDb3B5TWV0YURhdGFXaXRob3V0U3RhZ2UoKSB7CiAJCWNvcHlNZXRhRGF0YUhlbHBlcih0cnVlKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGNvcHlNZXRhRGF0YUhlbHBlcihmaW5hbCBib29sZWFuIGtlZXBTdGFnZSkgeworCXByaXZhdGUgc3RhdGljIHZvaWQgY29weU1ldGFEYXRhSGVscGVyKGJvb2xlYW4ga2VlcFN0YWdlKSB7CiAJCURpckNhY2hlRW50cnkgZSA9IG5ldyBEaXJDYWNoZUVudHJ5KCJzb21lL3BhdGgiLCBEaXJDYWNoZUVudHJ5LlNUQUdFXzIpOwogCQllLnNldEFzc3VtZVZhbGlkKGZhbHNlKTsKIAkJZS5zZXRDcmVhdGlvblRpbWUoMkwpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlSXRlcmF0b3JUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvclRlc3QuamF2YQppbmRleCBkZDI0MmU1Li44MjU2NWZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvclRlc3QuamF2YQpAQCAtNzYsNyArNzYsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlUcmVlX1dpdGhUcmVlV2FsaygpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBEaXJDYWNoZSBkYyA9IERpckNhY2hlLm5ld0luQ29yZSgpOwogCQlhc3NlcnRFcXVhbHMoMCwgZGMuZ2V0RW50cnlDb3VudCgpKTsKIAotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShuZXcgRGlyQ2FjaGVJdGVyYXRvcihkYykpOwogCQkJYXNzZXJ0RmFsc2UodHcubmV4dCgpKTsKIAkJfQpAQCAtMTI2LDcgKzEyNiw3IEBAIHB1YmxpYyB2b2lkIHRlc3ROb1N1YnRyZWVfV2l0aFRyZWVXYWxrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWIuZmluaXNoKCk7CiAKIAkJZmluYWwgRGlyQ2FjaGVJdGVyYXRvciBpID0gbmV3IERpckNhY2hlSXRlcmF0b3IoZGMpOwotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShpKTsKIAkJCWludCBwYXRoSWR4ID0gMDsKIAkJCXdoaWxlICh0dy5uZXh0KCkpIHsKQEAgLTE2NCw3ICsxNjQsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlU3VidHJlZV9Ob1JlY3Vyc2lvbigpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBpbnQgZXhwUG9zW10gPSB7IDAsIC0xLCA0IH07CiAKIAkJZmluYWwgRGlyQ2FjaGVJdGVyYXRvciBpID0gbmV3IERpckNhY2hlSXRlcmF0b3IoZGMpOwotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShpKTsKIAkJCXR3LnNldFJlY3Vyc2l2ZShmYWxzZSk7CiAJCQlpbnQgcGF0aElkeCA9IDA7CkBAIC0yMDUsNyArMjA1LDcgQEAgcHVibGljIHZvaWQgdGVzdFNpbmdsZVN1YnRyZWVfUmVjdXJzaXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWIuZmluaXNoKCk7CiAKIAkJZmluYWwgRGlyQ2FjaGVJdGVyYXRvciBpID0gbmV3IERpckNhY2hlSXRlcmF0b3IoZGMpOwotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShpKTsKIAkJCXR3LnNldFJlY3Vyc2l2ZSh0cnVlKTsKIAkJCWludCBwYXRoSWR4ID0gMDsKQEAgLTI0MCw3ICsyNDAsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VHdvTGV2ZWxTdWJ0cmVlX1JlY3Vyc2l2ZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJYi5hZGQoZW50c1tpXSk7CiAJCWIuZmluaXNoKCk7CiAKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LmFkZFRyZWUobmV3IERpckNhY2hlSXRlcmF0b3IoZGMpKTsKIAkJCXR3LnNldFJlY3Vyc2l2ZSh0cnVlKTsKIAkJCWludCBwYXRoSWR4ID0gMDsKQEAgLTQwMiw3ICs0MDIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VHdvTGV2ZWxTdWJ0cmVlX0ZpbHRlclBhdGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWIuYWRkKGVudHNbaV0pOwogCQliLmZpbmlzaCgpOwogCi0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQlmb3IgKGludCB2aWN0aW1JZHggPSAwOyB2aWN0aW1JZHggPCBwYXRocy5sZW5ndGg7IHZpY3RpbUlkeCsrKSB7CiAJCQkJdHcucmVzZXQoKTsKIAkJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRjKSk7CkBAIC00MzAsNyArNDMwLDcgQEAgcHVibGljIHZvaWQgdGVzdFJlbW92ZWRTdWJ0cmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIERpckNhY2hlIGRjID0gRGlyQ2FjaGUucmVhZChwYXRoLCBGUy5ERVRFQ1RFRCk7CiAJCWFzc2VydEVxdWFscygyLCBkYy5nZXRFbnRyeUNvdW50KCkpOwogCi0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5zZXRSZWN1cnNpdmUodHJ1ZSk7CiAJCQl0dy5hZGRUcmVlKG5ldyBEaXJDYWNoZUl0ZXJhdG9yKGRjKSk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUxhcmdlUGF0aFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUxhcmdlUGF0aFRlc3QuamF2YQppbmRleCBlZjNlNjExLi5kZmMxMzZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVMYXJnZVBhdGhUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlTGFyZ2VQYXRoVGVzdC5qYXZhCkBAIC04MSw3ICs4MSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYXRoXzE2Mzg0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRlc3RMb25nUGF0aCgxNjM4NCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHRlc3RMb25nUGF0aChmaW5hbCBpbnQgbGVuKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwKKwlwcml2YXRlIHZvaWQgdGVzdExvbmdQYXRoKGludCBsZW4pIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbG9uZ1BhdGggPSBtYWtlTG9uZ1BhdGgobGVuKTsKIAkJZmluYWwgU3RyaW5nIHNob3J0UGF0aCA9ICJ+fn4gc2hvcnRlci1wYXRoIjsKQEAgLTExOSw3ICsxMTksNyBAQCBwcml2YXRlIHZvaWQgdGVzdExvbmdQYXRoKGZpbmFsIGludCBsZW4pIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VMb25nUGF0aChmaW5hbCBpbnQgbGVuKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1ha2VMb25nUGF0aChpbnQgbGVuKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKGxlbik7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspCiAJCQlyLmFwcGVuZCgnYScgKyAoaSAlIDI2KSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9NYW5pZmVzdFBhcnNlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL01hbmlmZXN0UGFyc2VyVGVzdC5qYXZhCmluZGV4IGM5NjczYTYuLjY5YTQ4Y2MgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL01hbmlmZXN0UGFyc2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL01hbmlmZXN0UGFyc2VyVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOwogCkBAIC04Miw3ICs4Miw3IEBAIHB1YmxpYyB2b2lkIHRlc3RNYW5pZmVzdFBhcnNlcigpIHRocm93cyBFeGNlcHRpb24gewogCiAJCU1hbmlmZXN0UGFyc2VyIHBhcnNlciA9IG5ldyBNYW5pZmVzdFBhcnNlcigKIAkJCQludWxsLCBudWxsLCAibWFzdGVyIiwgYmFzZVVybCwgbnVsbCwgbnVsbCk7Ci0JCXBhcnNlci5yZWFkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSk7CisJCXBhcnNlci5yZWFkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpKTsKIAkJLy8gVW5maWx0ZXJlZCBwcm9qZWN0cyBzaG91bGQgaGF2ZSB0aGVtIGFsbC4KIAkJcmVzdWx0cy5jbGVhcigpOwogCQlyZXN1bHRzLmFkZCgiZm9vIik7CkBAIC0xMzYsNyArMTM2LDcgQEAgcHVibGljIHZvaWQgdGVzdE1hbmlmZXN0UGFyc2VyV2l0aE1pc3NpbmdGZXRjaE9uUmVtb3RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJYmFzZVVybCwgbnVsbCwgbnVsbCk7CiAJCXRyeSB7CiAJCQlwYXJzZXIucmVhZChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCi0JCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpKTsKKwkJCQkJeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKSk7CiAJCQlmYWlsKCJNYW5pZmVzdFBhcnNlciBkaWQgbm90IHRocm93IGV4Y2VwdGlvbiBmb3IgbWlzc2luZyBmZXRjaCIpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAJCQlhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFNBWEV4Y2VwdGlvbik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFN5bWxpbmtUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZFN5bWxpbmtUZXN0LmphdmEKaW5kZXggMzQxY2M0Zi4uNTQ4YjkwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRTeW1saW5rVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kU3ltbGlua1Rlc3QuamF2YQpAQCAtMTE5LDQ1ICsxMTksNDcgQEAgcHVibGljIHZvaWQgdGVzdExpbmtGaWxlQmFyZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCQkuc2V0VVJJKHJvb3RVcmkpLmNhbGwoKTsKIAkJCS8vIENsb25lIGl0CiAJCQlGaWxlIGRpcmVjdG9yeSA9IGNyZWF0ZVRlbXBEaXJlY3RvcnkoInRlc3RDb3B5RmlsZUJhcmUiKTsKLQkJCVJlcG9zaXRvcnkgbG9jYWxEYiA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXREaXJlY3RvcnkoZGlyZWN0b3J5KQorCQkJdHJ5IChSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKKwkJCQkJLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCiAJCQkJCS5zZXRVUkkocmVtb3RlRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKS5jYWxsKCkKLQkJCQkJLmdldFJlcG9zaXRvcnkoKTsKKwkJCQkJLmdldFJlcG9zaXRvcnkoKSkgewogCi0JCQkvLyBUaGUgTGlua2VkSGVsbG8gc3ltbGluayBzaG91bGQgZXhpc3QuCi0JCQlGaWxlIGxpbmtlZGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiTGlua2VkSGVsbG8iKTsKLQkJCWFzc2VydFRydWUoIlRoZSBMaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBleGlzdCIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5leGlzdHMobGlua2VkaGVsbG8pKTsKLQkJCWFzc2VydFRydWUoIlRoZSBMaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBiZSBhIHN5bWxpbmsiLAotCQkJCQlsb2NhbERiLmdldEZTKCkuaXNTeW1MaW5rKGxpbmtlZGhlbGxvKSk7Ci0JCQlhc3NlcnRFcXVhbHMoImZvby9oZWxsby50eHQiLAotCQkJCQlsb2NhbERiLmdldEZTKCkucmVhZFN5bUxpbmsobGlua2VkaGVsbG8pKTsKKwkJCQkvLyBUaGUgTGlua2VkSGVsbG8gc3ltbGluayBzaG91bGQgZXhpc3QuCisJCQkJRmlsZSBsaW5rZWRoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwKKwkJCQkJCSJMaW5rZWRIZWxsbyIpOworCQkJCWFzc2VydFRydWUoIlRoZSBMaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBleGlzdCIsCisJCQkJCQlsb2NhbERiLmdldEZTKCkuZXhpc3RzKGxpbmtlZGhlbGxvKSk7CisJCQkJYXNzZXJ0VHJ1ZSgiVGhlIExpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGJlIGEgc3ltbGluayIsCisJCQkJCQlsb2NhbERiLmdldEZTKCkuaXNTeW1MaW5rKGxpbmtlZGhlbGxvKSk7CisJCQkJYXNzZXJ0RXF1YWxzKCJmb28vaGVsbG8udHh0IiwKKwkJCQkJCWxvY2FsRGIuZ2V0RlMoKS5yZWFkU3ltTGluayhsaW5rZWRoZWxsbykpOwogCi0JCQkvLyBUaGUgZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGJlIHNraXBwZWQuCi0JCQlGaWxlIGxpbmtlZGZvb2hlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiZm9vL0xpbmtlZEhlbGxvIik7Ci0JCQlhc3NlcnRGYWxzZSgiVGhlIGZvby9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBiZSBza2lwcGVkIiwKLQkJCQkJbG9jYWxEYi5nZXRGUygpLmV4aXN0cyhsaW5rZWRmb29oZWxsbykpOworCQkJCS8vIFRoZSBmb28vTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgYmUgc2tpcHBlZC4KKwkJCQlGaWxlIGxpbmtlZGZvb2hlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAorCQkJCQkJImZvby9MaW5rZWRIZWxsbyIpOworCQkJCWFzc2VydEZhbHNlKCJUaGUgZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGJlIHNraXBwZWQiLAorCQkJCQkJbG9jYWxEYi5nZXRGUygpLmV4aXN0cyhsaW5rZWRmb29oZWxsbykpOwogCi0JCQkvLyBUaGUgc3ViZGlyL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIHVzZSBhIHJlbGF0aXZlIC4uLwotCQkJRmlsZSBsaW5rZWRzdWJkaXJoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwKLQkJCQkJInN1YmRpci9MaW5rZWRIZWxsbyIpOwotCQkJYXNzZXJ0VHJ1ZSgiVGhlIHN1YmRpci9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBleGlzdCIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5leGlzdHMobGlua2Vkc3ViZGlyaGVsbG8pKTsKLQkJCWFzc2VydFRydWUoIlRoZSBzdWJkaXIvTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgYmUgYSBzeW1saW5rIiwKLQkJCQkJbG9jYWxEYi5nZXRGUygpLmlzU3ltTGluayhsaW5rZWRzdWJkaXJoZWxsbykpOwotCQkJYXNzZXJ0RXF1YWxzKCIuLi9mb28vaGVsbG8udHh0IiwKLQkJCQkJbG9jYWxEYi5nZXRGUygpLnJlYWRTeW1MaW5rKGxpbmtlZHN1YmRpcmhlbGxvKSk7CisJCQkJLy8gVGhlIHN1YmRpci9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCB1c2UgYSByZWxhdGl2ZSAuLi8KKwkJCQlGaWxlIGxpbmtlZHN1YmRpcmhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAorCQkJCQkJInN1YmRpci9MaW5rZWRIZWxsbyIpOworCQkJCWFzc2VydFRydWUoIlRoZSBzdWJkaXIvTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgZXhpc3QiLAorCQkJCQkJbG9jYWxEYi5nZXRGUygpLmV4aXN0cyhsaW5rZWRzdWJkaXJoZWxsbykpOworCQkJCWFzc2VydFRydWUoIlRoZSBzdWJkaXIvTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgYmUgYSBzeW1saW5rIiwKKwkJCQkJCWxvY2FsRGIuZ2V0RlMoKS5pc1N5bUxpbmsobGlua2Vkc3ViZGlyaGVsbG8pKTsKKwkJCQlhc3NlcnRFcXVhbHMoIi4uL2Zvby9oZWxsby50eHQiLAorCQkJCQkJbG9jYWxEYi5nZXRGUygpLnJlYWRTeW1MaW5rKGxpbmtlZHN1YmRpcmhlbGxvKSk7CiAKLQkJCS8vIFRoZSBiYXIvZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIHVzZSBhIHNpbmdsZSByZWxhdGl2ZSAuLi8KLQkJCUZpbGUgbGlua2VkYmFyZm9vaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCi0JCQkJCSJiYXIvZm9vL0xpbmtlZEhlbGxvIik7Ci0JCQlhc3NlcnRUcnVlKCJUaGUgYmFyL2Zvby9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBleGlzdCIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5leGlzdHMobGlua2VkYmFyZm9vaGVsbG8pKTsKLQkJCWFzc2VydFRydWUoIlRoZSBiYXIvZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGJlIGEgc3ltbGluayIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5pc1N5bUxpbmsobGlua2VkYmFyZm9vaGVsbG8pKTsKLQkJCWFzc2VydEVxdWFscygiLi4vYmF6L2hlbGxvLnR4dCIsCi0JCQkJCWxvY2FsRGIuZ2V0RlMoKS5yZWFkU3ltTGluayhsaW5rZWRiYXJmb29oZWxsbykpOwotCi0JCQlsb2NhbERiLmNsb3NlKCk7CisJCQkJLy8gVGhlIGJhci9mb28vTGlua2VkSGVsbG8gZmlsZSBzaG91bGQgdXNlIGEgc2luZ2xlIHJlbGF0aXZlIC4uLworCQkJCUZpbGUgbGlua2VkYmFyZm9vaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCisJCQkJCQkiYmFyL2Zvby9MaW5rZWRIZWxsbyIpOworCQkJCWFzc2VydFRydWUoIlRoZSBiYXIvZm9vL0xpbmtlZEhlbGxvIGZpbGUgc2hvdWxkIGV4aXN0IiwKKwkJCQkJCWxvY2FsRGIuZ2V0RlMoKS5leGlzdHMobGlua2VkYmFyZm9vaGVsbG8pKTsKKwkJCQlhc3NlcnRUcnVlKCJUaGUgYmFyL2Zvby9MaW5rZWRIZWxsbyBmaWxlIHNob3VsZCBiZSBhIHN5bWxpbmsiLAorCQkJCQkJbG9jYWxEYi5nZXRGUygpLmlzU3ltTGluayhsaW5rZWRiYXJmb29oZWxsbykpOworCQkJCWFzc2VydEVxdWFscygiLi4vYmF6L2hlbGxvLnR4dCIsCisJCQkJCQlsb2NhbERiLmdldEZTKCkucmVhZFN5bUxpbmsobGlua2VkYmFyZm9vaGVsbG8pKTsKKwkJCX0KIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9naXRyZXBvL1JlcG9Db21tYW5kVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEKaW5kZXggMjI1M2EwNC4uZGYzMWFiMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmRUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKQEAgLTE2MCw3ICsxNjAsNyBAQCBwdWJsaWMgT2JqZWN0SWQgc2hhMShTdHJpbmcgdXJpLCBTdHJpbmcgcmVmbmFtZSkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCQkJUmVmIHJlZiA9IHIuZmluZFJlZihyZWZuYW1lKTsKIAkJCQlpZiAocmVmID09IG51bGwpIHJldHVybiBudWxsOwogCi0JCQkJcmVmID0gci5wZWVsKHJlZik7CisJCQkJcmVmID0gci5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKTsKIAkJCQlPYmplY3RJZCBpZCA9IHJlZi5nZXRPYmplY3RJZCgpOwogCQkJCXJldHVybiBpZDsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTE4NSwxMDggKzE4NSw5MyBAQCBwdWJsaWMgT2JqZWN0SWQgc2hhMShTdHJpbmcgdXJpLCBTdHJpbmcgcmVmbmFtZSkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKKwlwcml2YXRlIFJlcG9zaXRvcnkgY2xvbmVSZXBvc2l0b3J5KFJlcG9zaXRvcnkgcmVwbywgYm9vbGVhbiBiYXJlKQorCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJlcG9zaXRvcnkgciA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKQorCQkJCS5zZXRVUkkocmVwby5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpCisJCQkJLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKS5zZXRCYXJlKGJhcmUpLmNhbGwoKQorCQkJCS5nZXRSZXBvc2l0b3J5KCk7CisJCWlmIChiYXJlKSB7CisJCQlhc3NlcnRUcnVlKHIuaXNCYXJlKCkpOworCQl9IGVsc2UgeworCQkJYXNzZXJ0RmFsc2Uoci5pc0JhcmUoKSk7CisJCX0KKwkJcmV0dXJuIHI7CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBydW5Ud2ljZUlzTk9QKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVJlcG9zaXRvcnkgY2hpbGQgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKLQkJCS5zZXRVUkkoZ3JvdXBBRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKQotCQkJLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKS5zZXRCYXJlKHRydWUpLmNhbGwoKQotCQkJLmdldFJlcG9zaXRvcnkoKTsKKwkJdHJ5IChSZXBvc2l0b3J5IGNoaWxkID0gY2xvbmVSZXBvc2l0b3J5KGdyb3VwQURiLCB0cnVlKTsKKwkJCQlSZXBvc2l0b3J5IGRlc3QgPSBjbG9uZVJlcG9zaXRvcnkoZGIsIHRydWUpKSB7CisJCQlTdHJpbmdCdWlsZGVyIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJeG1sQ29udGVudC5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikKKwkJCQkJLmFwcGVuZCgiPG1hbmlmZXN0PiIpCisJCQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cInJlbW90ZTFcIiBmZXRjaD1cIi4uXCIgLz4iKQorCQkJCQkuYXBwZW5kKCI8ZGVmYXVsdCByZXZpc2lvbj1cIm1hc3RlclwiIHJlbW90ZT1cInJlbW90ZTFcIiAvPiIpCisJCQkJCS5hcHBlbmQoIjxwcm9qZWN0IHBhdGg9XCJiYXNlXCIgbmFtZT1cInBsYXRmb3JtL2Jhc2VcIiAvPiIpCisJCQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7CisJCQlSZXBvQ29tbWFuZCBjbWQgPSBuZXcgUmVwb0NvbW1hbmQoZGVzdCk7CiAKLQkJUmVwb3NpdG9yeSBkZXN0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCi0JCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkKLQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkuc2V0QmFyZSh0cnVlKS5jYWxsKCkKLQkJCS5nZXRSZXBvc2l0b3J5KCk7CisJCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7CisJCQlyZXBvcy5wdXQoInBsYXRmb3JtL2Jhc2UiLCBjaGlsZCk7CiAKLQkJYXNzZXJ0VHJ1ZShkZXN0LmlzQmFyZSgpKTsKLQkJYXNzZXJ0VHJ1ZShjaGlsZC5pc0JhcmUoKSk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gY21kCisJCQkJCS5zZXRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisJCQkJCQkJeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKSkKKwkJCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykuc2V0VVJJKCJwbGF0Zm9ybS8iKQorCQkJCQkuc2V0VGFyZ2V0VVJJKCJwbGF0Zm9ybS9zdXBlcnByb2plY3QiKQorCQkJCQkuc2V0UmVjb3JkUmVtb3RlQnJhbmNoKHRydWUpLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQorCQkJCQkuY2FsbCgpOwogCi0JCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCXhtbENvbnRlbnQuYXBwZW5kKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz5cbiIpCi0JCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKLQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cInJlbW90ZTFcIiBmZXRjaD1cIi4uXCIgLz4iKQotCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJyZW1vdGUxXCIgLz4iKQotCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cImJhc2VcIiBuYW1lPVwicGxhdGZvcm0vYmFzZVwiIC8+IikKLQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7Ci0JCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKLQotCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7Ci0JCXJlcG9zLnB1dCgicGxhdGZvcm0vYmFzZSIsIGNoaWxkKTsKLQotCQlSZXZDb21taXQgY29tbWl0ID0gY21kCi0JCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAotCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpKQotCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykKLQkJCS5zZXRVUkkoInBsYXRmb3JtLyIpCi0JCQkuc2V0VGFyZ2V0VVJJKCJwbGF0Zm9ybS9zdXBlcnByb2plY3QiKQotCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKQotCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQotCQkJLmNhbGwoKTsKLQotCQlTdHJpbmcgZmlyc3RJZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7Ci0JCWNvbW1pdCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KQotCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpCi0JCQkuc2V0VVJJKCJwbGF0Zm9ybS8iKQotCQkJLnNldFRhcmdldFVSSSgicGxhdGZvcm0vc3VwZXJwcm9qZWN0IikKLQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkKLQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKLQkJCS5jYWxsKCk7Ci0JCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7Ci0JCWFzc2VydEVxdWFscyhmaXJzdElkU3RyLCBpZFN0cik7Ci0JCWNoaWxkLmNsb3NlKCk7Ci0JCWRlc3QuY2xvc2UoKTsKKwkJCVN0cmluZyBmaXJzdElkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKKwkJCWNvbW1pdCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KQorCQkJCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorCQkJCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpCisJCQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpLnNldFVSSSgicGxhdGZvcm0vIikKKwkJCQkJLnNldFRhcmdldFVSSSgicGxhdGZvcm0vc3VwZXJwcm9qZWN0IikKKwkJCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKKwkJCQkJLmNhbGwoKTsKKwkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQlhc3NlcnRFcXVhbHMoZmlyc3RJZFN0ciwgaWRTdHIpOworCQl9CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBhbmRyb2lkU2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVwb3NpdG9yeSBjaGlsZCA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKQotCQkJCS5zZXRVUkkoZ3JvdXBBRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKQotCQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkuc2V0QmFyZSh0cnVlKS5jYWxsKCkKLQkJCQkuZ2V0UmVwb3NpdG9yeSgpOworCQl0cnkgKFJlcG9zaXRvcnkgY2hpbGQgPSBjbG9uZVJlcG9zaXRvcnkoZ3JvdXBBRGIsIHRydWUpOworCQkJCVJlcG9zaXRvcnkgZGVzdCA9IGNsb25lUmVwb3NpdG9yeShkYiwgdHJ1ZSkpIHsKKwkJCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQorCQkJCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKKwkJCQkJLmFwcGVuZCgiPHJlbW90ZSBuYW1lPVwicmVtb3RlMVwiIGZldGNoPVwiLi5cIiAvPiIpCisJCQkJCS5hcHBlbmQoIjxkZWZhdWx0IHJldmlzaW9uPVwibWFzdGVyXCIgcmVtb3RlPVwicmVtb3RlMVwiIC8+IikKKwkJCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cImJhc2VcIiBuYW1lPVwicGxhdGZvcm0vYmFzZVwiIC8+IikKKwkJCQkJLmFwcGVuZCgiPC9tYW5pZmVzdD4iKTsKKwkJCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKIAotCQlSZXBvc2l0b3J5IGRlc3QgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKLQkJCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkKLQkJCQkuc2V0RGlyZWN0b3J5KGNyZWF0ZVVuaXF1ZVRlc3RHaXREaXIodHJ1ZSkpLnNldEJhcmUodHJ1ZSkuY2FsbCgpCi0JCQkJLmdldFJlcG9zaXRvcnkoKTsKKwkJCUluZGV4ZWRSZXBvcyByZXBvcyA9IG5ldyBJbmRleGVkUmVwb3MoKTsKKwkJCXJlcG9zLnB1dCgicGxhdGZvcm0vYmFzZSIsIGNoaWxkKTsKIAotCQlhc3NlcnRUcnVlKGRlc3QuaXNCYXJlKCkpOwotCQlhc3NlcnRUcnVlKGNoaWxkLmlzQmFyZSgpKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBjbWQKKwkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKwkJCQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpKQorCQkJCQkuc2V0UmVtb3RlUmVhZGVyKHJlcG9zKS5zZXRVUkkoInBsYXRmb3JtLyIpCisJCQkJCS5zZXRUYXJnZXRVUkkoInBsYXRmb3JtL3N1cGVycHJvamVjdCIpCisJCQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkuc2V0UmVjb3JkU3VibW9kdWxlTGFiZWxzKHRydWUpCisJCQkJCS5jYWxsKCk7CiAKLQkJU3RyaW5nQnVpbGRlciB4bWxDb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJeG1sQ29udGVudC5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikKLQkJCS5hcHBlbmQoIjxtYW5pZmVzdD4iKQotCQkJLmFwcGVuZCgiPHJlbW90ZSBuYW1lPVwicmVtb3RlMVwiIGZldGNoPVwiLi5cIiAvPiIpCi0JCQkuYXBwZW5kKCI8ZGVmYXVsdCByZXZpc2lvbj1cIm1hc3RlclwiIHJlbW90ZT1cInJlbW90ZTFcIiAvPiIpCi0JCQkuYXBwZW5kKCI8cHJvamVjdCBwYXRoPVwiYmFzZVwiIG5hbWU9XCJwbGF0Zm9ybS9iYXNlXCIgLz4iKQotCQkJLmFwcGVuZCgiPC9tYW5pZmVzdD4iKTsKLQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOworCQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKKwkJCU9iamVjdElkIG1vZElkID0gZGVzdC5yZXNvbHZlKGlkU3RyKTsKIAotCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7Ci0JCXJlcG9zLnB1dCgicGxhdGZvcm0vYmFzZSIsIGNoaWxkKTsKLQotCQlSZXZDb21taXQgY29tbWl0ID0gY21kCi0JCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpKQotCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykKLQkJCS5zZXRVUkkoInBsYXRmb3JtLyIpCi0JCQkuc2V0VGFyZ2V0VVJJKCJwbGF0Zm9ybS9zdXBlcnByb2plY3QiKQotCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKQotCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQotCQkJLmNhbGwoKTsKLQotCQlTdHJpbmcgaWRTdHIgPSBjb21taXQuZ2V0SWQoKS5uYW1lKCkgKyAiOiIgKyAiLmdpdG1vZHVsZXMiOwotCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7Ci0KLQkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gZGVzdC5uZXdPYmplY3RSZWFkZXIoKSkgewotCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCUNvbmZpZyBiYXNlID0gbmV3IENvbmZpZygpOwotCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOwotCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJiYXNlIiwgInVybCIpOwotCQkJYXNzZXJ0RXF1YWxzKHN1YlVybCwgIi4uL2Jhc2UiKTsKKwkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCQlieXRlW10gYnl0ZXMgPSByZWFkZXIub3Blbihtb2RJZCkKKwkJCQkJCS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7CisJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7CisJCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOworCQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAiYmFzZSIsICJ1cmwiKTsKKwkJCQlhc3NlcnRFcXVhbHMoc3ViVXJsLCAiLi4vYmFzZSIpOworCQkJfQogCQl9Ci0KLQkJY2hpbGQuY2xvc2UoKTsKLQkJZGVzdC5jbG9zZSgpOwogCX0KIAogCUBUZXN0CkBAIC0yOTksMjAwICsyODQsMTc0IEBAIHB1YmxpYyB2b2lkIHJlY29yZFVucmVhY2hhYmxlUmVtb3RlcygpIHRocm93cyBFeGNlcHRpb24gewogCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cImJhc2VcIiBuYW1lPVwicGxhdGZvcm0vYmFzZVwiIC8+IikKIAkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7CiAKLQkJUmVwb3NpdG9yeSBkZXN0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCi0JCQkJLnNldFVSSShkYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpCi0JCQkJLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKS5zZXRCYXJlKHRydWUpLmNhbGwoKQotCQkJCS5nZXRSZXBvc2l0b3J5KCk7CisJCXRyeSAoUmVwb3NpdG9yeSBkZXN0ID0gY2xvbmVSZXBvc2l0b3J5KGRiLCB0cnVlKSkgeworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KQorCQkJCQkuc2V0SW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorCQkJCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpCisJCQkJCS5zZXRSZW1vdGVSZWFkZXIobmV3IEluZGV4ZWRSZXBvcygpKS5zZXRVUkkoInBsYXRmb3JtLyIpCisJCQkJCS5zZXRUYXJnZXRVUkkoInBsYXRmb3JtL3N1cGVycHJvamVjdCIpCisJCQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkuc2V0SWdub3JlUmVtb3RlRmFpbHVyZXModHJ1ZSkKKwkJCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKS5jYWxsKCk7CiAKLQkJYXNzZXJ0VHJ1ZShkZXN0LmlzQmFyZSgpKTsKKwkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7CiAKLQkJUmV2Q29tbWl0IGNvbW1pdCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KQotCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKLQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCS5zZXRSZW1vdGVSZWFkZXIobmV3IEluZGV4ZWRSZXBvcygpKQotCQkJLnNldFVSSSgicGxhdGZvcm0vIikKLQkJCS5zZXRUYXJnZXRVUkkoInBsYXRmb3JtL3N1cGVycHJvamVjdCIpCi0JCQkuc2V0UmVjb3JkUmVtb3RlQnJhbmNoKHRydWUpCi0JCQkuc2V0SWdub3JlUmVtb3RlRmFpbHVyZXModHJ1ZSkKLQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKLQkJCS5jYWxsKCk7Ci0KLQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKLQkJT2JqZWN0SWQgbW9kSWQgPSBkZXN0LnJlc29sdmUoaWRTdHIpOwotCi0JCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCWJ5dGVbXSBieXRlcyA9IHJlYWRlci5vcGVuKG1vZElkKS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCQlDb25maWcgYmFzZSA9IG5ldyBDb25maWcoKTsKLQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKLQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAiYmFzZSIsICJ1cmwiKTsKLQkJCWFzc2VydEVxdWFscyhzdWJVcmwsICJodHRwczovL2hvc3QuY29tL3BsYXRmb3JtL2Jhc2UiKTsKKwkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCQlieXRlW10gYnl0ZXMgPSByZWFkZXIub3Blbihtb2RJZCkKKwkJCQkJCS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7CisJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7CisJCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOworCQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAiYmFzZSIsICJ1cmwiKTsKKwkJCQlhc3NlcnRFcXVhbHMoc3ViVXJsLCAiaHR0cHM6Ly9ob3N0LmNvbS9wbGF0Zm9ybS9iYXNlIik7CisJCQl9CiAJCX0KLQotCQlkZXN0LmNsb3NlKCk7CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBnZXJyaXRTZXR1cCgpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXBvc2l0b3J5IGNoaWxkID0KLQkJCUdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXRVUkkoZ3JvdXBBRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKQotCQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkKLQkJCQkuc2V0QmFyZSh0cnVlKS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOworCQl0cnkgKFJlcG9zaXRvcnkgY2hpbGQgPSBjbG9uZVJlcG9zaXRvcnkoZ3JvdXBBRGIsIHRydWUpOworCQkJCVJlcG9zaXRvcnkgZGVzdCA9IGNsb25lUmVwb3NpdG9yeShkYiwgdHJ1ZSkpIHsKKwkJCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisJCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQorCQkJCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKKwkJCQkJLmFwcGVuZCgiPHJlbW90ZSBuYW1lPVwicmVtb3RlMVwiIGZldGNoPVwiLlwiIC8+IikKKwkJCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJyZW1vdGUxXCIgLz4iKQorCQkJCQkuYXBwZW5kKCI8cHJvamVjdCBwYXRoPVwicGx1Z2lucy9jb29rYm9va1wiIG5hbWU9XCJwbHVnaW5zL2Nvb2tib29rXCIgLz4iKQorCQkJCQkuYXBwZW5kKCI8L21hbmlmZXN0PiIpOworCQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOwogCi0JCVJlcG9zaXRvcnkgZGVzdCA9IEdpdC5jbG9uZVJlcG9zaXRvcnkoKQotCQkJLnNldFVSSShkYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLnNldERpcmVjdG9yeShjcmVhdGVVbmlxdWVUZXN0R2l0RGlyKHRydWUpKQotCQkJLnNldEJhcmUodHJ1ZSkuY2FsbCgpLmdldFJlcG9zaXRvcnkoKTsKKwkJCUluZGV4ZWRSZXBvcyByZXBvcyA9IG5ldyBJbmRleGVkUmVwb3MoKTsKKwkJCXJlcG9zLnB1dCgicGx1Z2lucy9jb29rYm9vayIsIGNoaWxkKTsKIAotCQlhc3NlcnRUcnVlKGRlc3QuaXNCYXJlKCkpOwotCQlhc3NlcnRUcnVlKGNoaWxkLmlzQmFyZSgpKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBjbWQKKwkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKwkJCQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpKQorCQkJCQkuc2V0UmVtb3RlUmVhZGVyKHJlcG9zKS5zZXRVUkkoIiIpLnNldFRhcmdldFVSSSgiZ2Vycml0IikKKwkJCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKKwkJCQkJLmNhbGwoKTsKIAotCQlTdHJpbmdCdWlsZGVyIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQotCQkJLmFwcGVuZCgiPG1hbmlmZXN0PiIpCi0JCQkuYXBwZW5kKCI8cmVtb3RlIG5hbWU9XCJyZW1vdGUxXCIgZmV0Y2g9XCIuXCIgLz4iKQotCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJyZW1vdGUxXCIgLz4iKQotCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cInBsdWdpbnMvY29va2Jvb2tcIiBuYW1lPVwicGx1Z2lucy9jb29rYm9va1wiIC8+IikKLQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7Ci0JCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKKwkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7CiAKLQkJSW5kZXhlZFJlcG9zIHJlcG9zID0gbmV3IEluZGV4ZWRSZXBvcygpOwotCQlyZXBvcy5wdXQoInBsdWdpbnMvY29va2Jvb2siLCBjaGlsZCk7Ci0KLQkJUmV2Q29tbWl0IGNvbW1pdCA9IGNtZAotCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpCi0JCQkuc2V0VVJJKCIiKQotCQkJLnNldFRhcmdldFVSSSgiZ2Vycml0IikKLQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkKLQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKLQkJCS5jYWxsKCk7Ci0KLQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKLQkJT2JqZWN0SWQgbW9kSWQgPSBkZXN0LnJlc29sdmUoaWRTdHIpOwotCi0JCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCWJ5dGVbXSBieXRlcyA9IHJlYWRlci5vcGVuKG1vZElkKS5nZXRDYWNoZWRCeXRlcyhJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCQlDb25maWcgYmFzZSA9IG5ldyBDb25maWcoKTsKLQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKLQkJCVN0cmluZyBzdWJVcmwgPSBjZmcuZ2V0U3RyaW5nKCJzdWJtb2R1bGUiLCAicGx1Z2lucy9jb29rYm9vayIsICJ1cmwiKTsKLQkJCWFzc2VydEVxdWFscyhzdWJVcmwsICIuLi9wbHVnaW5zL2Nvb2tib29rIik7CisJCQl0cnkgKE9iamVjdFJlYWRlciByZWFkZXIgPSBkZXN0Lm5ld09iamVjdFJlYWRlcigpKSB7CisJCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpCisJCQkJCQkuZ2V0Q2FjaGVkQnl0ZXMoSW50ZWdlci5NQVhfVkFMVUUpOworCQkJCUNvbmZpZyBiYXNlID0gbmV3IENvbmZpZygpOworCQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKKwkJCQlTdHJpbmcgc3ViVXJsID0gY2ZnLmdldFN0cmluZygic3VibW9kdWxlIiwgInBsdWdpbnMvY29va2Jvb2siLAorCQkJCQkJInVybCIpOworCQkJCWFzc2VydEVxdWFscyhzdWJVcmwsICIuLi9wbHVnaW5zL2Nvb2tib29rIik7CisJCQl9CiAJCX0KLQotCQljaGlsZC5jbG9zZSgpOwotCQlkZXN0LmNsb3NlKCk7CiAJfQogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCBhYnNvbHV0ZVJlbW90ZVVSTCgpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXBvc2l0b3J5IGNoaWxkID0KLQkJCUdpdC5jbG9uZVJlcG9zaXRvcnkoKS5zZXRVUkkoZ3JvdXBBRGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKQotCQkJCS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkKLQkJCQkuc2V0QmFyZSh0cnVlKS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOwotCQlSZXBvc2l0b3J5IGRlc3QgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkKLQkJCS5zZXRVUkkoZGIuZ2V0RGlyZWN0b3J5KCkudG9VUkkoKS50b1N0cmluZygpKS5zZXREaXJlY3RvcnkoY3JlYXRlVW5pcXVlVGVzdEdpdERpcih0cnVlKSkKLQkJCS5zZXRCYXJlKHRydWUpLmNhbGwoKS5nZXRSZXBvc2l0b3J5KCk7Ci0JCVN0cmluZyBhYnMgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tIjsKLQkJU3RyaW5nIHJlcG9VcmwgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyI7Ci0JCWJvb2xlYW4gZmV0Y2hTbGFzaCA9IGZhbHNlOwotCQlib29sZWFuIGJhc2VTbGFzaCA9IGZhbHNlOwotCQlkbyB7CisJCXRyeSAoUmVwb3NpdG9yeSBjaGlsZCA9IGNsb25lUmVwb3NpdG9yeShncm91cEFEYiwgdHJ1ZSk7CisJCQkJUmVwb3NpdG9yeSBkZXN0ID0gY2xvbmVSZXBvc2l0b3J5KGRiLCB0cnVlKSkgeworCQkJU3RyaW5nIGFicyA9ICJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20iOworCQkJU3RyaW5nIHJlcG9VcmwgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyI7CisJCQlib29sZWFuIGZldGNoU2xhc2ggPSBmYWxzZTsKKwkJCWJvb2xlYW4gYmFzZVNsYXNoID0gZmFsc2U7CiAJCQlkbyB7Ci0JCQkJU3RyaW5nIGZldGNoVXJsID0gZmV0Y2hTbGFzaCA/IGFicyArICIvIiA6IGFiczsKLQkJCQlTdHJpbmcgYmFzZVVybCA9IGJhc2VTbGFzaCA/IGFicyArICIvIiA6IGFiczsKKwkJCQlkbyB7CisJCQkJCVN0cmluZyBmZXRjaFVybCA9IGZldGNoU2xhc2ggPyBhYnMgKyAiLyIgOiBhYnM7CisJCQkJCVN0cmluZyBiYXNlVXJsID0gYmFzZVNsYXNoID8gYWJzICsgIi8iIDogYWJzOwogCi0JCQkJU3RyaW5nQnVpbGRlciB4bWxDb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJCQl4bWxDb250ZW50LmFwcGVuZCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQotCQkJCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKLQkJCQkJLmFwcGVuZCgiPHJlbW90ZSBuYW1lPVwib3JpZ2luXCIgZmV0Y2g9XCIiICsgZmV0Y2hVcmwgKyAiXCIgLz4iKQotCQkJCQkuYXBwZW5kKCI8ZGVmYXVsdCByZXZpc2lvbj1cIm1hc3RlclwiIHJlbW90ZT1cIm9yaWdpblwiIC8+IikKLQkJCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cInNyY1wiIG5hbWU9XCJjaHJvbWl1bS9zcmNcIiAvPiIpCi0JCQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7Ci0JCQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOworCQkJCQlTdHJpbmdCdWlsZGVyIHhtbENvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCQkJCQl4bWxDb250ZW50LmFwcGVuZCgKKwkJCQkJCQkiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+XG4iKQorCQkJCQkJCS5hcHBlbmQoIjxtYW5pZmVzdD4iKQorCQkJCQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cIm9yaWdpblwiIGZldGNoPVwiIgorCQkJCQkJCQkJKyBmZXRjaFVybCArICJcIiAvPiIpCisJCQkJCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJvcmlnaW5cIiAvPiIpCisJCQkJCQkJLmFwcGVuZCgiPHByb2plY3QgcGF0aD1cInNyY1wiIG5hbWU9XCJjaHJvbWl1bS9zcmNcIiAvPiIpCisJCQkJCQkJLmFwcGVuZCgiPC9tYW5pZmVzdD4iKTsKKwkJCQkJUmVwb0NvbW1hbmQgY21kID0gbmV3IFJlcG9Db21tYW5kKGRlc3QpOwogCi0JCQkJSW5kZXhlZFJlcG9zIHJlcG9zID0gbmV3IEluZGV4ZWRSZXBvcygpOwotCQkJCXJlcG9zLnB1dChyZXBvVXJsLCBjaGlsZCk7CisJCQkJCUluZGV4ZWRSZXBvcyByZXBvcyA9IG5ldyBJbmRleGVkUmVwb3MoKTsKKwkJCQkJcmVwb3MucHV0KHJlcG9VcmwsIGNoaWxkKTsKIAotCQkJCVJldkNvbW1pdCBjb21taXQgPSBjbWQKLQkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSkKLQkJCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykKLQkJCQkJLnNldFVSSShiYXNlVXJsKQotCQkJCQkuc2V0VGFyZ2V0VVJJKCJnZXJyaXQiKQotCQkJCQkuc2V0UmVjb3JkUmVtb3RlQnJhbmNoKHRydWUpCi0JCQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkKLQkJCQkJLmNhbGwoKTsKKwkJCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGNtZAorCQkJCQkJCS5zZXRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oCisJCQkJCQkJCQl4bWxDb250ZW50LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpKQorCQkJCQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpLnNldFVSSShiYXNlVXJsKQorCQkJCQkJCS5zZXRUYXJnZXRVUkkoImdlcnJpdCIpLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKQorCQkJCQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkuY2FsbCgpOwogCi0JCQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKLQkJCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7CisJCQkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQkJCU9iamVjdElkIG1vZElkID0gZGVzdC5yZXNvbHZlKGlkU3RyKTsKIAotCQkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7Ci0JCQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKLQkJCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJzcmMiLCAidXJsIik7Ci0JCQkJCWFzc2VydEVxdWFscygiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tL2Nocm9taXVtL3NyYyIsIHN1YlVybCk7Ci0JCQkJfQotCQkJCWZldGNoU2xhc2ggPSAhZmV0Y2hTbGFzaDsKLQkJCX0gd2hpbGUgKGZldGNoU2xhc2gpOwotCQkJYmFzZVNsYXNoID0gIWJhc2VTbGFzaDsKLQkJfSB3aGlsZSAoYmFzZVNsYXNoKTsKLQkJY2hpbGQuY2xvc2UoKTsKLQkJZGVzdC5jbG9zZSgpOworCQkJCQl0cnkgKE9iamVjdFJlYWRlciByZWFkZXIgPSBkZXN0Lm5ld09iamVjdFJlYWRlcigpKSB7CisJCQkJCQlieXRlW10gYnl0ZXMgPSByZWFkZXIub3Blbihtb2RJZCkKKwkJCQkJCQkJLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKKwkJCQkJCUNvbmZpZyBiYXNlID0gbmV3IENvbmZpZygpOworCQkJCQkJQmxvYkJhc2VkQ29uZmlnIGNmZyA9IG5ldyBCbG9iQmFzZWRDb25maWcoYmFzZSwgYnl0ZXMpOworCQkJCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJzcmMiLAorCQkJCQkJCQkidXJsIik7CisJCQkJCQlhc3NlcnRFcXVhbHMoCisJCQkJCQkJCSJodHRwczovL2Nocm9taXVtLmdvb2dsZXNvdXJjZS5jb20vY2hyb21pdW0vc3JjIiwKKwkJCQkJCQkJc3ViVXJsKTsKKwkJCQkJfQorCQkJCQlmZXRjaFNsYXNoID0gIWZldGNoU2xhc2g7CisJCQkJfSB3aGlsZSAoZmV0Y2hTbGFzaCk7CisJCQkJYmFzZVNsYXNoID0gIWJhc2VTbGFzaDsKKwkJCX0gd2hpbGUgKGJhc2VTbGFzaCk7CisJCX0KIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIGFic29sdXRlUmVtb3RlVVJMQWJzb2x1dGVUYXJnZXRVUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVwb3NpdG9yeSBjaGlsZCA9Ci0JCQlHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0VVJJKGdyb3VwQURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkKLQkJCQkuc2V0RGlyZWN0b3J5KGNyZWF0ZVVuaXF1ZVRlc3RHaXREaXIodHJ1ZSkpCi0JCQkJLnNldEJhcmUodHJ1ZSkuY2FsbCgpLmdldFJlcG9zaXRvcnkoKTsKLQkJUmVwb3NpdG9yeSBkZXN0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpCi0JCQkuc2V0VVJJKGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuc2V0RGlyZWN0b3J5KGNyZWF0ZVVuaXF1ZVRlc3RHaXREaXIodHJ1ZSkpCi0JCQkuc2V0QmFyZSh0cnVlKS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOwotCQlTdHJpbmcgYWJzID0gImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbSI7Ci0JCVN0cmluZyByZXBvVXJsID0gImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiOwotCQlib29sZWFuIGZldGNoU2xhc2ggPSBmYWxzZTsKLQkJYm9vbGVhbiBiYXNlU2xhc2ggPSBmYWxzZTsKLQkJZG8geworCQl0cnkgKFJlcG9zaXRvcnkgY2hpbGQgPSBjbG9uZVJlcG9zaXRvcnkoZ3JvdXBBRGIsIHRydWUpOworCQkJCVJlcG9zaXRvcnkgZGVzdCA9IGNsb25lUmVwb3NpdG9yeShkYiwgdHJ1ZSkpIHsKKwkJCVN0cmluZyBhYnMgPSAiaHR0cHM6Ly9jaHJvbWl1bS5nb29nbGVzb3VyY2UuY29tIjsKKwkJCVN0cmluZyByZXBvVXJsID0gImh0dHBzOi8vY2hyb21pdW0uZ29vZ2xlc291cmNlLmNvbS9jaHJvbWl1bS9zcmMiOworCQkJYm9vbGVhbiBmZXRjaFNsYXNoID0gZmFsc2U7CisJCQlib29sZWFuIGJhc2VTbGFzaCA9IGZhbHNlOwogCQkJZG8gewotCQkJCVN0cmluZyBmZXRjaFVybCA9IGZldGNoU2xhc2ggPyBhYnMgKyAiLyIgOiBhYnM7Ci0JCQkJU3RyaW5nIGJhc2VVcmwgPSBiYXNlU2xhc2ggPyBhYnMgKyAiLyIgOiBhYnM7CisJCQkJZG8geworCQkJCQlTdHJpbmcgZmV0Y2hVcmwgPSBmZXRjaFNsYXNoID8gYWJzICsgIi8iIDogYWJzOworCQkJCQlTdHJpbmcgYmFzZVVybCA9IGJhc2VTbGFzaCA/IGFicyArICIvIiA6IGFiczsKIAotCQkJCVN0cmluZ0J1aWxkZXIgeG1sQ29udGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCQkJeG1sQ29udGVudC5hcHBlbmQoIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikKLQkJCQkJLmFwcGVuZCgiPG1hbmlmZXN0PiIpCi0JCQkJCS5hcHBlbmQoIjxyZW1vdGUgbmFtZT1cIm9yaWdpblwiIGZldGNoPVwiIiArIGZldGNoVXJsICsgIlwiIC8+IikKLQkJCQkJLmFwcGVuZCgiPGRlZmF1bHQgcmV2aXNpb249XCJtYXN0ZXJcIiByZW1vdGU9XCJvcmlnaW5cIiAvPiIpCi0JCQkJCS5hcHBlbmQoIjxwcm9qZWN0IHBhdGg9XCJzcmNcIiBuYW1lPVwiY2hyb21pdW0vc3JjXCIgLz4iKQotCQkJCQkuYXBwZW5kKCI8L21hbmlmZXN0PiIpOwotCQkJCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKKwkJCQkJU3RyaW5nQnVpbGRlciB4bWxDb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKwkJCQkJeG1sQ29udGVudC5hcHBlbmQoCisJCQkJCQkJIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIikKKwkJCQkJCQkuYXBwZW5kKCI8bWFuaWZlc3Q+IikKKwkJCQkJCQkuYXBwZW5kKCI8cmVtb3RlIG5hbWU9XCJvcmlnaW5cIiBmZXRjaD1cIiIKKwkJCQkJCQkJCSsgZmV0Y2hVcmwgKyAiXCIgLz4iKQorCQkJCQkJCS5hcHBlbmQoIjxkZWZhdWx0IHJldmlzaW9uPVwibWFzdGVyXCIgcmVtb3RlPVwib3JpZ2luXCIgLz4iKQorCQkJCQkJCS5hcHBlbmQoIjxwcm9qZWN0IHBhdGg9XCJzcmNcIiBuYW1lPVwiY2hyb21pdW0vc3JjXCIgLz4iKQorCQkJCQkJCS5hcHBlbmQoIjwvbWFuaWZlc3Q+Iik7CisJCQkJCVJlcG9Db21tYW5kIGNtZCA9IG5ldyBSZXBvQ29tbWFuZChkZXN0KTsKIAotCQkJCUluZGV4ZWRSZXBvcyByZXBvcyA9IG5ldyBJbmRleGVkUmVwb3MoKTsKLQkJCQlyZXBvcy5wdXQocmVwb1VybCwgY2hpbGQpOworCQkJCQlJbmRleGVkUmVwb3MgcmVwb3MgPSBuZXcgSW5kZXhlZFJlcG9zKCk7CisJCQkJCXJlcG9zLnB1dChyZXBvVXJsLCBjaGlsZCk7CiAKLQkJCQlSZXZDb21taXQgY29tbWl0ID0gY21kCi0JCQkJCS5zZXRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sQ29udGVudC50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSkpCi0JCQkJCS5zZXRSZW1vdGVSZWFkZXIocmVwb3MpCi0JCQkJCS5zZXRVUkkoYmFzZVVybCkKLQkJCQkJLnNldFRhcmdldFVSSShhYnMgKyAiL3N1cGVycHJvamVjdCIpCi0JCQkJCS5zZXRSZWNvcmRSZW1vdGVCcmFuY2godHJ1ZSkKLQkJCQkJLnNldFJlY29yZFN1Ym1vZHVsZUxhYmVscyh0cnVlKQotCQkJCQkuY2FsbCgpOworCQkJCQlSZXZDb21taXQgY29tbWl0ID0gY21kCisJCQkJCQkJLnNldElucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKwkJCQkJCQkJCXhtbENvbnRlbnQudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpCisJCQkJCQkJLnNldFJlbW90ZVJlYWRlcihyZXBvcykuc2V0VVJJKGJhc2VVcmwpCisJCQkJCQkJLnNldFRhcmdldFVSSShhYnMgKyAiL3N1cGVycHJvamVjdCIpCisJCQkJCQkJLnNldFJlY29yZFJlbW90ZUJyYW5jaCh0cnVlKQorCQkJCQkJCS5zZXRSZWNvcmRTdWJtb2R1bGVMYWJlbHModHJ1ZSkuY2FsbCgpOwogCi0JCQkJU3RyaW5nIGlkU3RyID0gY29tbWl0LmdldElkKCkubmFtZSgpICsgIjoiICsgIi5naXRtb2R1bGVzIjsKLQkJCQlPYmplY3RJZCBtb2RJZCA9IGRlc3QucmVzb2x2ZShpZFN0cik7CisJCQkJCVN0cmluZyBpZFN0ciA9IGNvbW1pdC5nZXRJZCgpLm5hbWUoKSArICI6IiArICIuZ2l0bW9kdWxlcyI7CisJCQkJCU9iamVjdElkIG1vZElkID0gZGVzdC5yZXNvbHZlKGlkU3RyKTsKIAotCQkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKLQkJCQkJYnl0ZVtdIGJ5dGVzID0gcmVhZGVyLm9wZW4obW9kSWQpLmdldENhY2hlZEJ5dGVzKEludGVnZXIuTUFYX1ZBTFVFKTsKLQkJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7Ci0JCQkJCUJsb2JCYXNlZENvbmZpZyBjZmcgPSBuZXcgQmxvYkJhc2VkQ29uZmlnKGJhc2UsIGJ5dGVzKTsKLQkJCQkJU3RyaW5nIHN1YlVybCA9IGNmZy5nZXRTdHJpbmcoInN1Ym1vZHVsZSIsICJzcmMiLCAidXJsIik7Ci0JCQkJCWFzc2VydEVxdWFscygiLi4vY2hyb21pdW0vc3JjIiwgc3ViVXJsKTsKLQkJCQl9Ci0JCQkJZmV0Y2hTbGFzaCA9ICFmZXRjaFNsYXNoOwotCQkJfSB3aGlsZSAoZmV0Y2hTbGFzaCk7Ci0JCQliYXNlU2xhc2ggPSAhYmFzZVNsYXNoOwotCQl9IHdoaWxlIChiYXNlU2xhc2gpOwotCQljaGlsZC5jbG9zZSgpOwotCQlkZXN0LmNsb3NlKCk7CisJCQkJCXRyeSAoT2JqZWN0UmVhZGVyIHJlYWRlciA9IGRlc3QubmV3T2JqZWN0UmVhZGVyKCkpIHsKKwkJCQkJCWJ5dGVbXSBieXRlcyA9IHJlYWRlci5vcGVuKG1vZElkKQorCQkJCQkJCQkuZ2V0Q2FjaGVkQnl0ZXMoSW50ZWdlci5NQVhfVkFMVUUpOworCQkJCQkJQ29uZmlnIGJhc2UgPSBuZXcgQ29uZmlnKCk7CisJCQkJCQlCbG9iQmFzZWRDb25maWcgY2ZnID0gbmV3IEJsb2JCYXNlZENvbmZpZyhiYXNlLCBieXRlcyk7CisJCQkJCQlTdHJpbmcgc3ViVXJsID0gY2ZnLmdldFN0cmluZygic3VibW9kdWxlIiwgInNyYyIsCisJCQkJCQkJCSJ1cmwiKTsKKwkJCQkJCWFzc2VydEVxdWFscygiLi4vY2hyb21pdW0vc3JjIiwgc3ViVXJsKTsKKwkJCQkJfQorCQkJCQlmZXRjaFNsYXNoID0gIWZldGNoU2xhc2g7CisJCQkJfSB3aGlsZSAoZmV0Y2hTbGFzaCk7CisJCQkJYmFzZVNsYXNoID0gIWJhc2VTbGFzaDsKKwkJCX0gd2hpbGUgKGJhc2VTbGFzaCk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtNTEzLDExICs0NzIsMTIgQEAgcHVibGljIHZvaWQgdGVzdEFkZFJlcG9NYW5pZmVzdCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJLmNhbGwoKTsKIAkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJmb28vaGVsbG8udHh0Iik7CiAJCWFzc2VydFRydWUoInN1Ym1vZHVsZSBzaG91bGQgYmUgY2hlY2tlZCBvdXQiLCBoZWxsby5leGlzdHMoKSk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihoZWxsbykpOwotCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOwotCQlyZWFkZXIuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAotCQkJCSJtYXN0ZXIgd29ybGQiLCBjb250ZW50KTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IEZpbGVSZWFkZXIoaGVsbG8pKSkgeworCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKKwkJCQkJIm1hc3RlciB3b3JsZCIsIGNvbnRlbnQpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTYwMywxOSArNTYzLDIxIEBAIHB1YmxpYyB2b2lkIHRlc3RSZXBvTWFuaWZlc3RDb3B5RmlsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgZXhpc3QKIAkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgImZvby9oZWxsby50eHQiKTsKIAkJYXNzZXJ0VHJ1ZSgiVGhlIG9yaWdpbmFsIGZpbGUgc2hvdWxkIGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIG9yaWdpbmFsIGZpbGUgc2hvdWxkIGhhdmUgZXhwZWN0ZWQgY29udGVudCIsCi0JCQkJIm1hc3RlciB3b3JsZCIsIGNvbnRlbnQpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJUaGUgb3JpZ2luYWwgZmlsZSBzaG91bGQgaGF2ZSBleHBlY3RlZCBjb250ZW50IiwKKwkJCQkJIm1hc3RlciB3b3JsZCIsIGNvbnRlbnQpOworCQl9CiAJCS8vIFRoZSBkZXN0IGZpbGUgc2hvdWxkIGFsc28gZXhpc3QKIAkJaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJIZWxsbyIpOwogCQlhc3NlcnRUcnVlKCJUaGUgZGVzdGluYXRpb24gZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsby5leGlzdHMoKSk7Ci0JCXJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihoZWxsbykpOwotCQljb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoIlRoZSBkZXN0aW5hdGlvbiBmaWxlIHNob3VsZCBoYXZlIGV4cGVjdGVkIGNvbnRlbnQiLAotCQkJCSJtYXN0ZXIgd29ybGQiLCBjb250ZW50KTsKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCisJCQkJbmV3IEZpbGVSZWFkZXIoaGVsbG8pKSkgeworCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCWFzc2VydEVxdWFscygiVGhlIGRlc3RpbmF0aW9uIGZpbGUgc2hvdWxkIGhhdmUgZXhwZWN0ZWQgY29udGVudCIsCisJCQkJCSJtYXN0ZXIgd29ybGQiLCBjb250ZW50KTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC02MzgsMjQgKzYwMCwyNyBAQCBwdWJsaWMgdm9pZCB0ZXN0QmFyZVJlcG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkuc2V0VVJJKHJvb3RVcmkpLmNhbGwoKTsKIAkJLy8gQ2xvbmUgaXQKIAkJRmlsZSBkaXJlY3RvcnkgPSBjcmVhdGVUZW1wRGlyZWN0b3J5KCJ0ZXN0QmFyZVJlcG8iKTsKLQkJUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCisJCXRyeSAoUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCiAJCQkJLnNldFVSSShyZW1vdGVEYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLmNhbGwoKQotCQkJCS5nZXRSZXBvc2l0b3J5KCk7Ci0JCS8vIFRoZSAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBleGlzdAotCQlGaWxlIGdpdG1vZHVsZXMgPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICIuZ2l0bW9kdWxlcyIpOwotCQlhc3NlcnRUcnVlKCJUaGUgLmdpdG1vZHVsZXMgZmlsZSBzaG91bGQgZXhpc3QiLCBnaXRtb2R1bGVzLmV4aXN0cygpKTsKLQkJLy8gVGhlIGZpcnN0IGxpbmUgb2YgLmdpdG1vZHVsZXMgZmlsZSBzaG91bGQgYmUgZXhwZWN0ZWQKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGdpdG1vZHVsZXMpKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIGZpcnN0IGxpbmUgb2YgLmdpdG1vZHVsZXMgZmlsZSBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAotCQkJCSJbc3VibW9kdWxlIFwiZm9vXCJdIiwgY29udGVudCk7Ci0JCS8vIFRoZSBnaXRsaW5rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyByZW1vdGUgaGVhZCBzaGExCi0JCVN0cmluZyBnaXRsaW5rID0gbG9jYWxEYi5yZXNvbHZlKENvbnN0YW50cy5IRUFEICsgIjpmb28iKS5uYW1lKCk7Ci0JCWxvY2FsRGIuY2xvc2UoKTsKLQkJU3RyaW5nIHJlbW90ZSA9IGRlZmF1bHREYi5yZXNvbHZlKENvbnN0YW50cy5IRUFEKS5uYW1lKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIGdpdGxpbmsgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHJlbW90ZSBoZWFkIiwgcmVtb3RlLAotCQkJCWdpdGxpbmspOworCQkJCS5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCS8vIFRoZSAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBleGlzdAorCQkJRmlsZSBnaXRtb2R1bGVzID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiLmdpdG1vZHVsZXMiKTsKKwkJCWFzc2VydFRydWUoIlRoZSAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBleGlzdCIsCisJCQkJCWdpdG1vZHVsZXMuZXhpc3RzKCkpOworCQkJLy8gVGhlIGZpcnN0IGxpbmUgb2YgLmdpdG1vZHVsZXMgZmlsZSBzaG91bGQgYmUgZXhwZWN0ZWQKKwkJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCQluZXcgRmlsZVJlYWRlcihnaXRtb2R1bGVzKSkpIHsKKwkJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJCWFzc2VydEVxdWFscygKKwkJCQkJCSJUaGUgZmlyc3QgbGluZSBvZiAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCisJCQkJCQkiW3N1Ym1vZHVsZSBcImZvb1wiXSIsIGNvbnRlbnQpOworCQkJfQorCQkJLy8gVGhlIGdpdGxpbmsgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHJlbW90ZSBoZWFkIHNoYTEKKwkJCVN0cmluZyBnaXRsaW5rID0gbG9jYWxEYi5yZXNvbHZlKENvbnN0YW50cy5IRUFEICsgIjpmb28iKS5uYW1lKCk7CisJCQlTdHJpbmcgcmVtb3RlID0gZGVmYXVsdERiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpLm5hbWUoKTsKKwkJCWFzc2VydEVxdWFscygiVGhlIGdpdGxpbmsgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHJlbW90ZSBoZWFkIiwKKwkJCQkJcmVtb3RlLCBnaXRsaW5rKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC02NzcsMTEgKzY0MiwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0UmV2aXNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCS5zZXRVUkkocm9vdFVyaSkKIAkJCS5jYWxsKCk7CiAJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnR4dCIpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKLQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBGaWxlUmVhZGVyKGhlbGxvKSkpIHsKKwkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCisJCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC03MDMsMTEgKzY2OSwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0UmV2aXNpb25CcmFuY2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCS5zZXRVUkkocm9vdFVyaSkKIAkJCS5jYWxsKCk7CiAJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnR4dCIpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKLQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBGaWxlUmVhZGVyKGhlbGxvKSkpIHsKKwkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCisJCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC03MjksMTEgKzY5NiwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0UmV2aXNpb25UYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCS5zZXRVUkkocm9vdFVyaSkKIAkJCS5jYWxsKCk7CiAJCUZpbGUgaGVsbG8gPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpLCAiZm9vL2hlbGxvLnR4dCIpOwotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygic3VibW9kdWxlIGNvbnRlbnQgc2hvdWxkIGJlIGFzIGV4cGVjdGVkIiwKLQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBGaWxlUmVhZGVyKGhlbGxvKSkpIHsKKwkJCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7CisJCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCisJCQkJCSJicmFuY2ggd29ybGQiLCBjb250ZW50KTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC03NTcsMTQgKzcyNSwxNCBAQCBwdWJsaWMgdm9pZCB0ZXN0UmV2aXNpb25CYXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJLnNldFVSSShyb290VXJpKS5jYWxsKCk7CiAJCS8vIENsb25lIGl0CiAJCUZpbGUgZGlyZWN0b3J5ID0gY3JlYXRlVGVtcERpcmVjdG9yeSgidGVzdFJldmlzaW9uQmFyZSIpOwotCQlSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKKwkJdHJ5IChSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKIAkJCQkuc2V0VVJJKHJlbW90ZURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuY2FsbCgpCi0JCQkJLmdldFJlcG9zaXRvcnkoKTsKLQkJLy8gVGhlIGdpdGxpbmsgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIG9sZENvbW1pdElkCi0JCVN0cmluZyBnaXRsaW5rID0gbG9jYWxEYi5yZXNvbHZlKENvbnN0YW50cy5IRUFEICsgIjpmb28iKS5uYW1lKCk7Ci0JCWxvY2FsRGIuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJUaGUgZ2l0bGluayBpcyBzYW1lIGFzIHJlbW90ZSBoZWFkIiwgb2xkQ29tbWl0SWQubmFtZSgpLAotCQkJCWdpdGxpbmspOworCQkJCS5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCS8vIFRoZSBnaXRsaW5rIHNob3VsZCBiZSB0aGUgc2FtZSBhcyBvbGRDb21taXRJZAorCQkJU3RyaW5nIGdpdGxpbmsgPSBsb2NhbERiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQgKyAiOmZvbyIpLm5hbWUoKTsKKwkJCWFzc2VydEVxdWFscygiVGhlIGdpdGxpbmsgaXMgc2FtZSBhcyByZW1vdGUgaGVhZCIsCisJCQkJCW9sZENvbW1pdElkLm5hbWUoKSwgZ2l0bGluayk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtNzkwLDIyICs3NTgsMjQgQEAgcHVibGljIHZvaWQgdGVzdENvcHlGaWxlQmFyZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCS5zZXRVUkkocm9vdFVyaSkuY2FsbCgpOwogCQkvLyBDbG9uZSBpdAogCQlGaWxlIGRpcmVjdG9yeSA9IGNyZWF0ZVRlbXBEaXJlY3RvcnkoInRlc3RDb3B5RmlsZUJhcmUiKTsKLQkJUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCisJCXRyeSAoUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCiAJCQkJLnNldFVSSShyZW1vdGVEYi5nZXREaXJlY3RvcnkoKS50b1VSSSgpLnRvU3RyaW5nKCkpLmNhbGwoKQotCQkJCS5nZXRSZXBvc2l0b3J5KCk7Ci0JCS8vIFRoZSBIZWxsbyBmaWxlIHNob3VsZCBleGlzdAotCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiSGVsbG8iKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIEhlbGxvIGZpbGUgc2hvdWxkIGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOwotCQkvLyBUaGUgZm9vL0hlbGxvIGZpbGUgc2hvdWxkIGJlIHNraXBwZWQuCi0JCUZpbGUgZm9vaGVsbG8gPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksICJmb28vSGVsbG8iKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBmb28vSGVsbG8gZmlsZSBzaG91bGQgYmUgc2tpcHBlZCIsIGZvb2hlbGxvLmV4aXN0cygpKTsKLQkJbG9jYWxEYi5jbG9zZSgpOwotCQkvLyBUaGUgY29udGVudCBvZiBIZWxsbyBmaWxlIHNob3VsZCBiZSBleHBlY3RlZAotCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaGVsbG8pKTsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydEVxdWFscygiVGhlIEhlbGxvIGZpbGUgc2hvdWxkIGhhdmUgZXhwZWN0ZWQgY29udGVudCIsCi0JCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQkJCS5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCS8vIFRoZSBIZWxsbyBmaWxlIHNob3VsZCBleGlzdAorCQkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkhlbGxvIik7CisJCQlhc3NlcnRUcnVlKCJUaGUgSGVsbG8gZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsby5leGlzdHMoKSk7CisJCQkvLyBUaGUgZm9vL0hlbGxvIGZpbGUgc2hvdWxkIGJlIHNraXBwZWQuCisJCQlGaWxlIGZvb2hlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiZm9vL0hlbGxvIik7CisJCQlhc3NlcnRGYWxzZSgiVGhlIGZvby9IZWxsbyBmaWxlIHNob3VsZCBiZSBza2lwcGVkIiwKKwkJCQkJZm9vaGVsbG8uZXhpc3RzKCkpOworCQkJLy8gVGhlIGNvbnRlbnQgb2YgSGVsbG8gZmlsZSBzaG91bGQgYmUgZXhwZWN0ZWQKKwkJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCQlhc3NlcnRFcXVhbHMoIlRoZSBIZWxsbyBmaWxlIHNob3VsZCBoYXZlIGV4cGVjdGVkIGNvbnRlbnQiLAorCQkJCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQkJfQorCQl9CiAJfQogCiAJQFRlc3QKQEAgLTg0MSwzNiArODExLDM4IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlTWFuaWZlc3RCYXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJLnNldFVSSShyb290VXJpKS5jYWxsKCk7CiAJCS8vIENsb25lIGl0CiAJCUZpbGUgZGlyZWN0b3J5ID0gY3JlYXRlVGVtcERpcmVjdG9yeSgidGVzdFJlcGxhY2VNYW5pZmVzdEJhcmUiKTsKLQkJUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCisJCUZpbGUgZG90bW9kdWxlczsKKwkJdHJ5IChSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKIAkJCQkuc2V0VVJJKHJlbW90ZURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuY2FsbCgpCi0JCQkJLmdldFJlcG9zaXRvcnkoKTsKLQkJLy8gVGhlIEhlbGxvIGZpbGUgc2hvdWxkIG5vdCBleGlzdAotCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiSGVsbG8iKTsKLQkJYXNzZXJ0RmFsc2UoIlRoZSBIZWxsbyBmaWxlIHNob3VsZG4ndCBleGlzdCIsIGhlbGxvLmV4aXN0cygpKTsKLQkJLy8gVGhlIEhlbGxvLnR4dCBmaWxlIHNob3VsZCBleGlzdAotCQlGaWxlIGhlbGxvdHh0ID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLCAiSGVsbG8udHh0Iik7Ci0JCWFzc2VydFRydWUoIlRoZSBIZWxsby50eHQgZmlsZSBzaG91bGQgZXhpc3QiLCBoZWxsb3R4dC5leGlzdHMoKSk7CisJCQkJLmdldFJlcG9zaXRvcnkoKSkgeworCQkJLy8gVGhlIEhlbGxvIGZpbGUgc2hvdWxkIG5vdCBleGlzdAorCQkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkhlbGxvIik7CisJCQlhc3NlcnRGYWxzZSgiVGhlIEhlbGxvIGZpbGUgc2hvdWxkbid0IGV4aXN0IiwgaGVsbG8uZXhpc3RzKCkpOworCQkJLy8gVGhlIEhlbGxvLnR4dCBmaWxlIHNob3VsZCBleGlzdAorCQkJRmlsZSBoZWxsb3R4dCA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgIkhlbGxvLnR4dCIpOworCQkJYXNzZXJ0VHJ1ZSgiVGhlIEhlbGxvLnR4dCBmaWxlIHNob3VsZCBleGlzdCIsIGhlbGxvdHh0LmV4aXN0cygpKTsKKwkJCWRvdG1vZHVsZXMgPSBuZXcgRmlsZShsb2NhbERiLmdldFdvcmtUcmVlKCksCisJCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOworCQl9CiAJCS8vIFRoZSAuZ2l0bW9kdWxlcyBmaWxlIHNob3VsZCBoYXZlICdzdWJtb2R1bGUgImJhciInIGFuZCBzaG91bGRuJ3QKIAkJLy8gaGF2ZQogCQkvLyAnc3VibW9kdWxlICJmb28iJyBsaW5lcy4KLQkJRmlsZSBkb3Rtb2R1bGVzID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAotCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOwotCQlsb2NhbERiLmNsb3NlKCk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihkb3Rtb2R1bGVzKSk7Ci0JCWJvb2xlYW4gZm9vID0gZmFsc2U7Ci0JCWJvb2xlYW4gYmFyID0gZmFsc2U7Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQlTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJaWYgKGxpbmUgPT0gbnVsbCkKLQkJCQlicmVhazsKLQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJmb29cIiIpKQotCQkJCWZvbyA9IHRydWU7Ci0JCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiYmFyXCIiKSkKLQkJCQliYXIgPSB0cnVlOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihkb3Rtb2R1bGVzKSkpIHsKKwkJCWJvb2xlYW4gZm9vID0gZmFsc2U7CisJCQlib29sZWFuIGJhciA9IGZhbHNlOworCQkJd2hpbGUgKHRydWUpIHsKKwkJCQlTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJCWlmIChsaW5lID09IG51bGwpCisJCQkJCWJyZWFrOworCQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJmb29cIiIpKQorCQkJCQlmb28gPSB0cnVlOworCQkJCWlmIChsaW5lLmNvbnRhaW5zKCJzdWJtb2R1bGUgXCJiYXJcIiIpKQorCQkJCQliYXIgPSB0cnVlOworCQkJfQorCQkJYXNzZXJ0VHJ1ZSgiVGhlIGJhciBzdWJtb2R1bGUgc2hvdWxkIGV4aXN0IiwgYmFyKTsKKwkJCWFzc2VydEZhbHNlKCJUaGUgZm9vIHN1Ym1vZHVsZSBzaG91bGRuJ3QgZXhpc3QiLCBmb28pOwogCQl9Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRUcnVlKCJUaGUgYmFyIHN1Ym1vZHVsZSBzaG91bGQgZXhpc3QiLCBiYXIpOwotCQlhc3NlcnRGYWxzZSgiVGhlIGZvbyBzdWJtb2R1bGUgc2hvdWxkbid0IGV4aXN0IiwgZm9vKTsKIAl9CiAKIAlAVGVzdApAQCAtODk2LDM0ICs4NjgsMzcgQEAgcHVibGljIHZvaWQgdGVzdFJlbW92ZU92ZXJsYXBwaW5nQmFyZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCS5zZXRVUkkocm9vdFVyaSkuY2FsbCgpOwogCQkvLyBDbG9uZSBpdAogCQlGaWxlIGRpcmVjdG9yeSA9IGNyZWF0ZVRlbXBEaXJlY3RvcnkoInRlc3RSZW1vdmVPdmVybGFwcGluZ0JhcmUiKTsKLQkJUmVwb3NpdG9yeSBsb2NhbERiID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldERpcmVjdG9yeShkaXJlY3RvcnkpCisJCUZpbGUgZG90bW9kdWxlczsKKwkJdHJ5IChSZXBvc2l0b3J5IGxvY2FsRGIgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSkKIAkJCQkuc2V0VVJJKHJlbW90ZURiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKSkuY2FsbCgpCi0JCQkJLmdldFJlcG9zaXRvcnkoKTsKKwkJCQkuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQlkb3Rtb2R1bGVzID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAorCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOworCQl9CisKIAkJLy8gVGhlIC5naXRtb2R1bGVzIGZpbGUgc2hvdWxkIGhhdmUgJ3N1Ym1vZHVsZSAiZm9vIicgYW5kIHNob3VsZG4ndAogCQkvLyBoYXZlCiAJCS8vICdzdWJtb2R1bGUgImZvby9iYXIiJyBsaW5lcy4KLQkJRmlsZSBkb3Rtb2R1bGVzID0gbmV3IEZpbGUobG9jYWxEYi5nZXRXb3JrVHJlZSgpLAotCQkJCUNvbnN0YW50cy5ET1RfR0lUX01PRFVMRVMpOwotCQlsb2NhbERiLmNsb3NlKCk7Ci0JCUJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihkb3Rtb2R1bGVzKSk7Ci0JCWJvb2xlYW4gZm9vID0gZmFsc2U7Ci0JCWJvb2xlYW4gZm9vYmFyID0gZmFsc2U7Ci0JCWJvb2xlYW4gYSA9IGZhbHNlOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLQkJCWlmIChsaW5lID09IG51bGwpCi0JCQkJYnJlYWs7Ci0JCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiZm9vXCIiKSkKLQkJCQlmb28gPSB0cnVlOwotCQkJaWYgKGxpbmUuY29udGFpbnMoInN1Ym1vZHVsZSBcImZvby9iYXJcIiIpKQotCQkJCWZvb2JhciA9IHRydWU7Ci0JCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiYVwiIikpCi0JCQkJYSA9IHRydWU7CisJCXRyeSAoQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBGaWxlUmVhZGVyKGRvdG1vZHVsZXMpKSkgeworCQkJYm9vbGVhbiBmb28gPSBmYWxzZTsKKwkJCWJvb2xlYW4gZm9vYmFyID0gZmFsc2U7CisJCQlib29sZWFuIGEgPSBmYWxzZTsKKwkJCXdoaWxlICh0cnVlKSB7CisJCQkJU3RyaW5nIGxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKKwkJCQlpZiAobGluZSA9PSBudWxsKQorCQkJCQlicmVhazsKKwkJCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiZm9vXCIiKSkKKwkJCQkJZm9vID0gdHJ1ZTsKKwkJCQlpZiAobGluZS5jb250YWlucygic3VibW9kdWxlIFwiZm9vL2JhclwiIikpCisJCQkJCWZvb2JhciA9IHRydWU7CisJCQkJaWYgKGxpbmUuY29udGFpbnMoInN1Ym1vZHVsZSBcImFcIiIpKQorCQkJCQlhID0gdHJ1ZTsKKwkJCX0KKwkJCWFzc2VydFRydWUoIlRoZSBmb28gc3VibW9kdWxlIHNob3VsZCBleGlzdCIsIGZvbyk7CisJCQlhc3NlcnRGYWxzZSgiVGhlIGZvby9iYXIgc3VibW9kdWxlIHNob3VsZG4ndCBleGlzdCIsIGZvb2Jhcik7CisJCQlhc3NlcnRUcnVlKCJUaGUgYSBzdWJtb2R1bGUgc2hvdWxkIGV4aXN0IiwgYSk7CiAJCX0KLQkJcmVhZGVyLmNsb3NlKCk7Ci0JCWFzc2VydFRydWUoIlRoZSBmb28gc3VibW9kdWxlIHNob3VsZCBleGlzdCIsIGZvbyk7Ci0JCWFzc2VydEZhbHNlKCJUaGUgZm9vL2JhciBzdWJtb2R1bGUgc2hvdWxkbid0IGV4aXN0IiwgZm9vYmFyKTsKLQkJYXNzZXJ0VHJ1ZSgiVGhlIGEgc3VibW9kdWxlIHNob3VsZCBleGlzdCIsIGEpOwogCX0KIAogCUBUZXN0CkBAIC05NTksMTEgKzkzNCwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0SW5jbHVkZVRhZygpIHRocm93cyBFeGNlcHRpb24gewogCQkJLmNhbGwoKTsKIAkJRmlsZSBoZWxsbyA9IG5ldyBGaWxlKGxvY2FsRGIuZ2V0V29ya1RyZWUoKSwgImZvby9oZWxsby50eHQiKTsKIAkJYXNzZXJ0VHJ1ZSgic3VibW9kdWxlIHNob3VsZCBiZSBjaGVja2VkIG91dCIsIGhlbGxvLmV4aXN0cygpKTsKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGhlbGxvKSk7Ci0JCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCi0JCQkJIm1hc3RlciB3b3JsZCIsIGNvbnRlbnQpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAorCQkJCQkibWFzdGVyIHdvcmxkIiwgY29udGVudCk7CisJCX0KIAl9CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVtb3RlQWxpYXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTExNjUsMTEgKzExNDEsMTIgQEAgcHVibGljIHZvaWQgdGVzdFJlbW90ZVJldmlzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkuc2V0VVJJKHJvb3RVcmkpCiAJCQkuY2FsbCgpOwogCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImZvby9oZWxsby50eHQiKTsKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGhlbGxvKSk7Ci0JCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCi0JCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAorCQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtMTE5MSwxMSArMTE2OCwxMiBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFJlbW90ZVJldmlzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkuc2V0VVJJKHJvb3RVcmkpCiAJCQkuY2FsbCgpOwogCQlGaWxlIGhlbGxvID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgImZvby9oZWxsby50eHQiKTsKLQkJQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGhlbGxvKSk7Ci0JCVN0cmluZyBjb250ZW50ID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCXJlYWRlci5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHMoInN1Ym1vZHVsZSBjb250ZW50IHNob3VsZCBiZSBhcyBleHBlY3RlZCIsCi0JCQkJImJyYW5jaCB3b3JsZCIsIGNvbnRlbnQpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQluZXcgRmlsZVJlYWRlcihoZWxsbykpKSB7CisJCQlTdHJpbmcgY29udGVudCA9IHJlYWRlci5yZWFkTGluZSgpOworCQkJYXNzZXJ0RXF1YWxzKCJzdWJtb2R1bGUgY29udGVudCBzaG91bGQgYmUgYXMgZXhwZWN0ZWQiLAorCQkJCQkiYnJhbmNoIHdvcmxkIiwgY29udGVudCk7CisJCX0KIAl9CiAKIAlwcml2YXRlIHZvaWQgcmVzb2x2ZVJlbGF0aXZlVXJpcygpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvQ0dpdElnbm9yZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvQ0dpdElnbm9yZVRlc3QuamF2YQppbmRleCAzYjExNjE2Li4wYzZlZDBjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0NHaXRJZ25vcmVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9DR2l0SWdub3JlVGVzdC5qYXZhCkBAIC0xNDEsNyArMTQxLDkgQEAgcHJpdmF0ZSB2b2lkIGpnaXRJZ25vcmVkQW5kVW50cmFja2VkKExpbmtlZEhhc2hTZXQ8U3RyaW5nPiBpZ25vcmVkLAogCQkvLyBEbyBhIHRyZWUgd2FsayB0aGF0IGRvZXMgZGVzY2VuZCBpbnRvIGlnbm9yZWQgZGlyZWN0b3JpZXMgYW5kIHJldHVybgogCQkvLyBhIGxpc3Qgb2YgYWxsIGlnbm9yZWQgZmlsZXMKIAkJdHJ5IChUcmVlV2FsayB3YWxrID0gbmV3IFRyZWVXYWxrKGRiKSkgewotCQkJd2Fsay5hZGRUcmVlKG5ldyBGaWxlVHJlZUl0ZXJhdG9yKGRiKSk7CisJCQlGaWxlVHJlZUl0ZXJhdG9yIGl0ZXIgPSBuZXcgRmlsZVRyZWVJdGVyYXRvcihkYik7CisJCQlpdGVyLnNldFdhbGtJZ25vcmVkRGlyZWN0b3JpZXModHJ1ZSk7CisJCQl3YWxrLmFkZFRyZWUoaXRlcik7CiAJCQl3YWxrLnNldFJlY3Vyc2l2ZSh0cnVlKTsKIAkJCXdoaWxlICh3YWxrLm5leHQoKSkgewogCQkJCWlmICh3YWxrLmdldFRyZWUoV29ya2luZ1RyZWVJdGVyYXRvci5jbGFzcykuaXNFbnRyeUlnbm9yZWQoKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9JZ25vcmVOb2RlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9JZ25vcmVOb2RlVGVzdC5qYXZhCmluZGV4IGNjYzY0ZmIuLjc4ZDlhODIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvSWdub3JlTm9kZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0lnbm9yZU5vZGVUZXN0LmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmlnbm9yZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwpAQCAtNTYsNyArNTYsNiBAQAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAotaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLklnbm9yZU5vZGUuTWF0Y2hSZXN1bHQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5SZXBvc2l0b3J5VGVzdENhc2U7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuRmlsZU1vZGU7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yOwpAQCAtNTQ2LDE5ICs1NDUsNiBAQCBwdWJsaWMgdm9pZCB0ZXN0SW5lZmZlY3RpdmVOZWdhdGlvbkRpZmZlcmVudExldmVsczUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQllbmRXYWxrKCk7CiAJfQogCi0JQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKLQlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlnbm9yZU5vZGUoKSB7Ci0JCS8vIFJ1bGVzIGFyZSBuZXZlciBlbXB0eTogV29ya2luZ1RyZWVJdGVyYXRvciBvcHRpbWl6ZXMgZW1wdHkgZmlsZXMgYXdheQotCQkvLyBTbyB3ZSBoYXZlIHRvIHRlc3QgaXQgbWFudWFsbHkgaW4gY2FzZSB0aGlyZCBwYXJ0eSBjbGllbnRzIHVzZQotCQkvLyBJZ25vcmVOb2RlIGRpcmVjdGx5LgotCQlJZ25vcmVOb2RlIG5vZGUgPSBuZXcgSWdub3JlTm9kZSgpOwotCQlhc3NlcnRFcXVhbHMoTWF0Y2hSZXN1bHQuQ0hFQ0tfUEFSRU5ULCBub2RlLmlzSWdub3JlZCgiIiwgZmFsc2UpKTsKLQkJYXNzZXJ0RXF1YWxzKE1hdGNoUmVzdWx0LkNIRUNLX1BBUkVOVCwgbm9kZS5pc0lnbm9yZWQoIiIsIGZhbHNlLCBmYWxzZSkpOwotCQlhc3NlcnRFcXVhbHMoTWF0Y2hSZXN1bHQuQ0hFQ0tfUEFSRU5UX05FR0FURV9GSVJTVF9NQVRDSCwKLQkJCQlub2RlLmlzSWdub3JlZCgiIiwgZmFsc2UsIHRydWUpKTsKLQl9Ci0KIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RFbXB0eUlnbm9yZVJ1bGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJSWdub3JlTm9kZSBub2RlID0gbmV3IElnbm9yZU5vZGUoKTsKQEAgLTc0Niw3ICs3MzIsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCXByaXZhdGUgdm9pZCBiZWdpbldhbGsoKSB7CiAJCXdhbGsgPSBuZXcgVHJlZVdhbGsoZGIpOwotCQl3YWxrLmFkZFRyZWUobmV3IEZpbGVUcmVlSXRlcmF0b3IoZGIpKTsKKwkJRmlsZVRyZWVJdGVyYXRvciBpdGVyID0gbmV3IEZpbGVUcmVlSXRlcmF0b3IoZGIpOworCQlpdGVyLnNldFdhbGtJZ25vcmVkRGlyZWN0b3JpZXModHJ1ZSk7CisJCXdhbGsuYWRkVHJlZShpdGVyKTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgZW5kV2FsaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC03NzksNiArNzY3LDYgQEAgcHJpdmF0ZSBJbnB1dFN0cmVhbSB3cml0ZVRvU3RyaW5nKFN0cmluZy4uLiBydWxlcykgewogCQlmb3IgKFN0cmluZyBsaW5lIDogcnVsZXMpIHsKIAkJCWRhdGEuYXBwZW5kKGxpbmUgKyAiXG4iKTsKIAkJfQotCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQlyZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2luZGV4ZGlmZi9JbmRleERpZmZXaXRoU3ltbGlua1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbmRleGRpZmYvSW5kZXhEaWZmV2l0aFN5bWxpbmtUZXN0LmphdmEKaW5kZXggZDVkMzg1Ny4uMjZjMTFjNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2luZGV4ZGlmZi9JbmRleERpZmZXaXRoU3ltbGlua1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW5kZXhkaWZmL0luZGV4RGlmZldpdGhTeW1saW5rVGVzdC5qYXZhCkBAIC00MSw3ICs0MSw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbmRleGRpZmY7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKQEAgLTEyOCw3ICsxMjgsNyBAQCBwcml2YXRlIEZpbGUgcmVzdG9yZUdpdFJlcG8oSW5wdXRTdHJlYW0gaW4sIEZpbGUgdGVzdERpciwgU3RyaW5nIG5hbWUpCiAJCUZpbGUgcmVzdG9yZVNjcmlwdCA9IG5ldyBGaWxlKHRlc3REaXIsIG5hbWUgKyAiLnNoIik7CiAJCXRyeSAoT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbSgKIAkJCQluZXcgRmlsZU91dHB1dFN0cmVhbShyZXN0b3JlU2NyaXB0KSk7Ci0JCQkJV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBVVEZfOCkpIHsKKwkJCQlXcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIENIQVJTRVQpKSB7CiAJCQl3cml0ZXIud3JpdGUoImVjaG8gYHdoaWNoIGdpdGAgMT4mMlxuIik7CiAJCQl3cml0ZXIud3JpdGUoImVjaG8gYGdpdCAtLXZlcnNpb25gIDE+JjJcbiIpOwogCQkJd3JpdGVyLndyaXRlKCJnaXQgaW5pdCAiICsgbmFtZSArICIgJiYgXFxcbiIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Db25jdXJyZW50UmVwYWNrVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Db25jdXJyZW50UmVwYWNrVGVzdC5qYXZhCmluZGV4IDQ4MTNkMjguLjY0M2RhYTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ29uY3VycmVudFJlcGFja1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NvbmN1cnJlbnRSZXBhY2tUZXN0LmphdmEKQEAgLTIxMCwxNyArMjEwLDE3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgd2hhY2tDYWNoZSgpIHsKIAkJY29uZmlnLmluc3RhbGwoKTsKIAl9CiAKLQlwcml2YXRlIFJldk9iamVjdCBwYXJzZShmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlwcml2YXRlIFJldk9iamVjdCBwYXJzZShBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKGRiKSkgewogCQkJcmV0dXJuIHJ3LnBhcnNlQW55KGlkKTsKIAkJfQogCX0KIAotCXByaXZhdGUgRmlsZVtdIHBhY2soZmluYWwgUmVwb3NpdG9yeSBzcmMsIGZpbmFsIFJldk9iamVjdC4uLiBsaXN0KQorCXByaXZhdGUgRmlsZVtdIHBhY2soUmVwb3NpdG9yeSBzcmMsIFJldk9iamVjdC4uLiBsaXN0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChQYWNrV3JpdGVyIHB3ID0gbmV3IFBhY2tXcml0ZXIoc3JjKSkgewotCQkJZm9yIChmaW5hbCBSZXZPYmplY3QgbyA6IGxpc3QpIHsKKwkJCWZvciAoUmV2T2JqZWN0IG8gOiBsaXN0KSB7CiAJCQkJcHcuYWRkT2JqZWN0KG8pOwogCQkJfQogCkBAIC0yMzMsNyArMjMzLDcgQEAgcHJpdmF0ZSBSZXZPYmplY3QgcGFyc2UoZmluYWwgQW55T2JqZWN0SWQgaWQpCiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlKGZpbmFsIEZpbGVbXSBmaWxlcywgZmluYWwgUGFja1dyaXRlciBwdykKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlKEZpbGVbXSBmaWxlcywgUGFja1dyaXRlciBwdykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgYmVnaW4gPSBmaWxlc1swXS5nZXRQYXJlbnRGaWxlKCkubGFzdE1vZGlmaWVkKCk7CiAJCU51bGxQcm9ncmVzc01vbml0b3IgbSA9IE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0U7CkBAIC0yNTEsMTYgKzI1MSwxNiBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlKGZpbmFsIEZpbGVbXSBmaWxlcywgZmluYWwgUGFja1dyaXRlciBwdykKIAkJdG91Y2goYmVnaW4sIGZpbGVzWzBdLmdldFBhcmVudEZpbGUoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWxldGUoZmluYWwgRmlsZVtdIGxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWxldGUoRmlsZVtdIGxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgYmVnaW4gPSBsaXN0WzBdLmdldFBhcmVudEZpbGUoKS5sYXN0TW9kaWZpZWQoKTsKLQkJZm9yIChmaW5hbCBGaWxlIGYgOiBsaXN0KSB7CisJCWZvciAoRmlsZSBmIDogbGlzdCkgewogCQkJRmlsZVV0aWxzLmRlbGV0ZShmKTsKIAkJCWFzc2VydEZhbHNlKGYgKyAiIHdhcyByZW1vdmVkIiwgZi5leGlzdHMoKSk7CiAJCX0KIAkJdG91Y2goYmVnaW4sIGxpc3RbMF0uZ2V0UGFyZW50RmlsZSgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHRvdWNoKGZpbmFsIGxvbmcgYmVnaW4sIGZpbmFsIEZpbGUgZGlyKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCB0b3VjaChsb25nIGJlZ2luLCBGaWxlIGRpcikgewogCQl3aGlsZSAoYmVnaW4gPj0gZGlyLmxhc3RNb2RpZmllZCgpKSB7CiAJCQl0cnkgewogCQkJCVRocmVhZC5zbGVlcCgyNSk7CkBAIC0yNzEsMTIgKzI3MSwxMiBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHRvdWNoKGZpbmFsIGxvbmcgYmVnaW4sIGZpbmFsIEZpbGUgZGlyKSB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIEZpbGUgZnVsbFBhY2tGaWxlTmFtZShmaW5hbCBPYmplY3RJZCBuYW1lLCBmaW5hbCBTdHJpbmcgc3VmZml4KSB7CisJcHJpdmF0ZSBGaWxlIGZ1bGxQYWNrRmlsZU5hbWUoT2JqZWN0SWQgbmFtZSwgU3RyaW5nIHN1ZmZpeCkgewogCQlmaW5hbCBGaWxlIHBhY2tkaXIgPSBkYi5nZXRPYmplY3REYXRhYmFzZSgpLmdldFBhY2tEaXJlY3RvcnkoKTsKIAkJcmV0dXJuIG5ldyBGaWxlKHBhY2tkaXIsICJwYWNrLSIgKyBuYW1lLm5hbWUoKSArIHN1ZmZpeCk7CiAJfQogCi0JcHJpdmF0ZSBSZXZPYmplY3Qgd3JpdGVCbG9iKGZpbmFsIFJlcG9zaXRvcnkgcmVwbywgZmluYWwgU3RyaW5nIGRhdGEpCisJcHJpdmF0ZSBSZXZPYmplY3Qgd3JpdGVCbG9iKFJlcG9zaXRvcnkgcmVwbywgU3RyaW5nIGRhdGEpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gYnl0ZXMgPSBDb25zdGFudHMuZW5jb2RlKGRhdGEpOwogCQlmaW5hbCBPYmplY3RJZCBpZDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tGaWxlVGVzdC5qYXZhCmluZGV4IDkxYmQ1MjMuLjA0ZmNjZjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrRmlsZVRlc3QuamF2YQpAQCAtMTQ2LDE1ICsxNDYsMTUgQEAgcHVibGljIHZvaWQgdGVzdFdob2xlX1NtYWxsT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydEZhbHNlKCJpcyBub3QgbGFyZ2UiLCBvbC5pc0xhcmdlKCkpOwogCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEsIG9sLmdldENhY2hlZEJ5dGVzKCkpKTsKIAotCQlPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOwotCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOwotCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0JCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhMiwgZGF0YSkpOwotCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKLQkJaW4uY2xvc2UoKTsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCkpIHsKKwkJCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOworCQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7CisJCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7CisJCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CisJCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7CisJCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEyLCBkYXRhKSk7CisJCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC0xODAsMTUgKzE4MCwxNSBAQCBwdWJsaWMgdm9pZCB0ZXN0V2hvbGVfTGFyZ2VPYmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkJLmdldE1lc3NhZ2UoKSk7CiAJCX0KIAotCQlPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOwotCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOwotCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0JCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhMiwgZGF0YSkpOwotCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKLQkJaW4uY2xvc2UoKTsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCkpIHsKKwkJCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOworCQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7CisJCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7CisJCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CisJCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7CisJCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEyLCBkYXRhKSk7CisJCQlhc3NlcnRFcXVhbHMoInN0cmVhbSBhdCBFT0YiLCAtMSwgaW4ucmVhZCgpKTsKKwkJfQogCX0KIAogCUBUZXN0CkBAIC0yMzksMTUgKzIzOSwxNSBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVsdGFfU21hbGxPYmplY3RDaGFpbigpIHRocm93cyBFeGNlcHRpb24gewogCQkJYXNzZXJ0Tm90TnVsbChvbC5nZXRDYWNoZWRCeXRlcygpKTsKIAkJCWFzc2VydEFycmF5RXF1YWxzKGRhdGEzLCBvbC5nZXRDYWNoZWRCeXRlcygpKTsKIAotCQkJT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpOwotCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7Ci0JCQlhc3NlcnRFcXVhbHMoQ29uc3RhbnRzLk9CSl9CTE9CLCBpbi5nZXRUeXBlKCkpOwotCQkJYXNzZXJ0RXF1YWxzKGRhdGEzLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKLQkJCWJ5dGVbXSBhY3QgPSBuZXcgYnl0ZVtkYXRhMy5sZW5ndGhdOwotCQkJSU8ucmVhZEZ1bGx5KGluLCBhY3QsIDAsIGRhdGEzLmxlbmd0aCk7Ci0JCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGFjdCwgZGF0YTMpKTsKLQkJCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOwotCQkJaW4uY2xvc2UoKTsKKwkJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpKSB7CisJCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7CisJCQkJYXNzZXJ0RXF1YWxzKENvbnN0YW50cy5PQkpfQkxPQiwgaW4uZ2V0VHlwZSgpKTsKKwkJCQlhc3NlcnRFcXVhbHMoZGF0YTMubGVuZ3RoLCBpbi5nZXRTaXplKCkpOworCQkJCWJ5dGVbXSBhY3QgPSBuZXcgYnl0ZVtkYXRhMy5sZW5ndGhdOworCQkJCUlPLnJlYWRGdWxseShpbiwgYWN0LCAwLCBkYXRhMy5sZW5ndGgpOworCQkJCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoYWN0LCBkYXRhMykpOworCQkJCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOworCQkJfQogCQl9CiAJfQogCkBAIC0yODIsMjIgKzI4MiwxNiBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVsdGFfRmFpbHNPdmVyMkdpQigpIHRocm93cyBFeGNlcHRpb24gewogCQkJRmlsZSBwYWNrTmFtZSA9IG5ldyBGaWxlKGRpciwgaWRBLm5hbWUoKSArICIucGFjayIpOwogCQkJRmlsZSBpZHhOYW1lID0gbmV3IEZpbGUoZGlyLCBpZEEubmFtZSgpICsgIi5pZHgiKTsKIAotCQkJRmlsZU91dHB1dFN0cmVhbSBmID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGFja05hbWUpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGFja05hbWUpKSB7CiAJCQkJZi53cml0ZShwYWNrLnRvQnl0ZUFycmF5KCkpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmLmNsb3NlKCk7CiAJCQl9CiAKLQkJCWYgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShpZHhOYW1lKTsKLQkJCXRyeSB7CisJCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZiA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGlkeE5hbWUpKSB7CiAJCQkJTGlzdDxQYWNrZWRPYmplY3RJbmZvPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCQkJbGlzdC5hZGQoYSk7CiAJCQkJbGlzdC5hZGQoYik7CiAJCQkJQ29sbGVjdGlvbnMuc29ydChsaXN0KTsKIAkJCQluZXcgUGFja0luZGV4V3JpdGVyVjEoZikud3JpdGUobGlzdCwgZm9vdGVyKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZi5jbG9zZSgpOwogCQkJfQogCiAJCQlQYWNrRmlsZSBwYWNrRmlsZSA9IG5ldyBQYWNrRmlsZShwYWNrTmFtZSwgUGFja0V4dC5JTkRFWC5nZXRCaXQoKSk7CkBAIC0zMjEsMTYgKzMxNSwxNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhYmxlU3RyZWFtRmlsZVRocmVzaG9sZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRUcnVlKCJoYXMgYmxvYiIsIHdjLmhhcyhpZCkpOwogCiAJCU9iamVjdExvYWRlciBvbCA9IHdjLm9wZW4oaWQpOwotCQlPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCWFzc2VydFRydWUoaW4gaW5zdGFuY2VvZiBPYmplY3RTdHJlYW0uU21hbGxTdHJlYW0pOwotCQlhc3NlcnRFcXVhbHMoMzAwLCBpbi5hdmFpbGFibGUoKSk7Ci0JCWluLmNsb3NlKCk7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpKSB7CisJCQlhc3NlcnRUcnVlKGluIGluc3RhbmNlb2YgT2JqZWN0U3RyZWFtLlNtYWxsU3RyZWFtKTsKKwkJCWFzc2VydEVxdWFscygzMDAsIGluLmF2YWlsYWJsZSgpKTsKKwkJfQogCiAJCXdjLnNldFN0cmVhbUZpbGVUaHJlc2hvbGQoMjk5KTsKIAkJb2wgPSB3Yy5vcGVuKGlkKTsKLQkJaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCWFzc2VydFRydWUoaW4gaW5zdGFuY2VvZiBPYmplY3RTdHJlYW0uRmlsdGVyKTsKLQkJYXNzZXJ0RXF1YWxzKDEsIGluLmF2YWlsYWJsZSgpKTsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCkpIHsKKwkJCWFzc2VydFRydWUoaW4gaW5zdGFuY2VvZiBPYmplY3RTdHJlYW0uRmlsdGVyKTsKKwkJCWFzc2VydEVxdWFscygxLCBpbi5hdmFpbGFibGUoKSk7CisJCX0KIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBieXRlW10gY2xvbmUoaW50IGZpcnN0LCBieXRlW10gYmFzZSkgewpAQCAtMzcyLDcgKzM2Nyw3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgb2JqZWN0SGVhZGVyKFRlbXBvcmFyeUJ1ZmZlci5IZWFwIHBhY2ssIGludCB0eXBlLCBpbnQgc3opCiAJCXBhY2sud3JpdGUoYnVmLCAwLCBuKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRlZmxhdGUoVGVtcG9yYXJ5QnVmZmVyLkhlYXAgcGFjaywgZmluYWwgYnl0ZVtdIGNvbnRlbnQpCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBkZWZsYXRlKFRlbXBvcmFyeUJ1ZmZlci5IZWFwIHBhY2ssIGJ5dGVbXSBjb250ZW50KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgRGVmbGF0ZXIgZGVmbGF0ZXIgPSBuZXcgRGVmbGF0ZXIoKTsKIAkJZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEyOF07CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tXcml0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tXcml0ZXJUZXN0LmphdmEKaW5kZXggMzc5NDMyZC4uMDRiZWQwOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrV3JpdGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1dyaXRlclRlc3QuamF2YQpAQCAtMzY4LDcgKzM2OCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVBhY2szKCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJCQlPYmplY3RJZC5mcm9tU3RyaW5nKCI5MDJkNTQ3NmZhMjQ5YjdhYmM5ZDg0YzYxMTU3N2E4MTM4MWYwMzI3IiksCiAJCQkJT2JqZWN0SWQuZnJvbVN0cmluZygiNmZmODdjNDY2NDk4MWU0Mzk3NjI1NzkxYzhlYTNiYmI1ZjIyNzlhMyIpICwKIAkJCQlPYmplY3RJZC5mcm9tU3RyaW5nKCI1YjZlN2M2NmMyNzZlNzYxMGQ0YTczYzcwZWMxYTFmN2MxMDAzMjU5IikgfTsKLQkJdHJ5IChmaW5hbCBSZXZXYWxrIHBhcnNlciA9IG5ldyBSZXZXYWxrKGRiKSkgeworCQl0cnkgKFJldldhbGsgcGFyc2VyID0gbmV3IFJldldhbGsoZGIpKSB7CiAJCQlmaW5hbCBSZXZPYmplY3QgZm9yY2VkT3JkZXJSZXZzW10gPSBuZXcgUmV2T2JqZWN0W2ZvcmNlZE9yZGVyLmxlbmd0aF07CiAJCQlmb3IgKGludCBpID0gMDsgaSA8IGZvcmNlZE9yZGVyLmxlbmd0aDsgaSsrKQogCQkJCWZvcmNlZE9yZGVyUmV2c1tpXSA9IHBhcnNlci5wYXJzZUFueShmb3JjZWRPcmRlcltpXSk7CkBAIC01MTUsMTEgKzUxNSw4IEBAIHB1YmxpYyB2b2lkIHRlc3RXcml0ZUluZGV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAkJLy8gVmFsaWRhdGUgdGhhdCBhbiBpbmRleCB3cml0dGVuIGJ5IFBhY2tXcml0ZXIgaXMgdGhlIHNhbWUuCiAJCWZpbmFsIEZpbGUgaWR4MkZpbGUgPSBuZXcgRmlsZShpbmRleEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiLjIiKTsKLQkJZmluYWwgRmlsZU91dHB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGlkeDJGaWxlKTsKLQkJdHJ5IHsKKwkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGlzID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oaWR4MkZpbGUpKSB7CiAJCQl3cml0ZXIud3JpdGVJbmRleChpcyk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpcy5jbG9zZSgpOwogCQl9CiAJCWZpbmFsIFBhY2tJbmRleCBpZHgyID0gUGFja0luZGV4Lm9wZW4oaWR4MkZpbGUpOwogCQlhc3NlcnRUcnVlKGlkeDIgaW5zdGFuY2VvZiBQYWNrSW5kZXhWMik7CkBAIC03MTUsMTQgKzcxMiwxNCBAQCBwcml2YXRlIHN0YXRpYyBQYWNrSW5kZXggd3JpdGVQYWNrKEZpbGVSZXBvc2l0b3J5IHJlcG8sIFJldldhbGsgd2FsaywKIAkJCVN0cmluZyBpZCA9IHB3LmNvbXB1dGVOYW1lKCkuZ2V0TmFtZSgpOwogCQkJRmlsZSBwYWNrZGlyID0gcmVwby5nZXRPYmplY3REYXRhYmFzZSgpLmdldFBhY2tEaXJlY3RvcnkoKTsKIAkJCUZpbGUgcGFja0ZpbGUgPSBuZXcgRmlsZShwYWNrZGlyLCAicGFjay0iICsgaWQgKyAiLnBhY2siKTsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gcGFja09TID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGFja0ZpbGUpOwotCQkJcHcud3JpdGVQYWNrKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsCi0JCQkJCU51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsIHBhY2tPUyk7Ci0JCQlwYWNrT1MuY2xvc2UoKTsKKwkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBwYWNrT1MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYWNrRmlsZSkpIHsKKwkJCQlwdy53cml0ZVBhY2soTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSwKKwkJCQkJCU51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsIHBhY2tPUyk7CisJCQl9CiAJCQlGaWxlIGlkeEZpbGUgPSBuZXcgRmlsZShwYWNrZGlyLCAicGFjay0iICsgaWQgKyAiLmlkeCIpOwotCQkJRmlsZU91dHB1dFN0cmVhbSBpZHhPUyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGlkeEZpbGUpOwotCQkJcHcud3JpdGVJbmRleChpZHhPUyk7Ci0JCQlpZHhPUy5jbG9zZSgpOworCQkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGlkeE9TID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oaWR4RmlsZSkpIHsKKwkJCQlwdy53cml0ZUluZGV4KGlkeE9TKTsKKwkJCX0KIAkJCXJldHVybiBQYWNrSW5kZXgub3BlbihpZHhGaWxlKTsKIAkJfQogCX0KQEAgLTgzOCw3ICs4MzUsNyBAQCBwcml2YXRlIHZvaWQgY3JlYXRlVmVyaWZ5T3BlblBhY2soZmluYWwgU2V0PE9iamVjdElkPiBpbnRlcmVzdGluZ3MsCiAJCXZlcmlmeU9wZW5QYWNrKHRoaW4pOwogCX0KIAotCXByaXZhdGUgdm9pZCBjcmVhdGVWZXJpZnlPcGVuUGFjayhmaW5hbCBMaXN0PFJldk9iamVjdD4gb2JqZWN0U291cmNlKQorCXByaXZhdGUgdm9pZCBjcmVhdGVWZXJpZnlPcGVuUGFjayhMaXN0PFJldk9iamVjdD4gb2JqZWN0U291cmNlKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJTnVsbFByb2dyZXNzTW9uaXRvciBtID0gTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRTsKIAkJd3JpdGVyID0gbmV3IFBhY2tXcml0ZXIoY29uZmlnLCBkYi5uZXdPYmplY3RSZWFkZXIoKSk7CkBAIC04NDksNyArODQ2LDcgQEAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVZlcmlmeU9wZW5QYWNrKGZpbmFsIExpc3Q8UmV2T2JqZWN0PiBvYmplY3RTb3VyY2UpCiAJCXZlcmlmeU9wZW5QYWNrKGZhbHNlKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdmVyaWZ5T3BlblBhY2soZmluYWwgYm9vbGVhbiB0aGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCB2ZXJpZnlPcGVuUGFjayhib29sZWFuIHRoaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSBwYWNrRGF0YSA9IG9zLnRvQnl0ZUFycmF5KCk7CiAKIAkJaWYgKHRoaW4pIHsKQEAgLTg3MSwxMyArODY4LDEzIEBAIHByaXZhdGUgdm9pZCB2ZXJpZnlPcGVuUGFjayhmaW5hbCBib29sZWFuIHRoaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWFzc2VydE5vdE51bGwoImhhdmUgUGFja0ZpbGUgYWZ0ZXIgcGFyc2luZyIsIHBhY2spOwogCX0KIAotCXByaXZhdGUgUGFja1BhcnNlciBpbmRleChmaW5hbCBieXRlW10gcGFja0RhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBQYWNrUGFyc2VyIGluZGV4KGJ5dGVbXSBwYWNrRGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGluc2VydGVyID09IG51bGwpCiAJCQlpbnNlcnRlciA9IGRzdC5uZXdPYmplY3RJbnNlcnRlcigpOwogCQlyZXR1cm4gaW5zZXJ0ZXIubmV3UGFja1BhcnNlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocGFja0RhdGEpKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdmVyaWZ5T2JqZWN0c09yZGVyKGZpbmFsIE9iamVjdElkIG9iamVjdHNPcmRlcltdKSB7CisJcHJpdmF0ZSB2b2lkIHZlcmlmeU9iamVjdHNPcmRlcihPYmplY3RJZCBvYmplY3RzT3JkZXJbXSkgewogCQlmaW5hbCBMaXN0PFBhY2tJbmRleC5NdXRhYmxlRW50cnk+IGVudHJpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogCQlmb3IgKE11dGFibGVFbnRyeSBtZSA6IHBhY2spIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlUZXN0LmphdmEKaW5kZXggZmVmY2NmMy4uNWEyYmQ5YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlUZXN0LmphdmEKQEAgLTEyNzEsNyArMTI3MSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RSZWZzQ2hhbmdlZFN0YWNrT3ZlcmZsb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQkJQE92ZXJyaWRlCiAJCQkJCXB1YmxpYyB2b2lkIG9uUmVmc0NoYW5nZWQoUmVmc0NoYW5nZWRFdmVudCBldmVudCkgewogCQkJCQkJdHJ5IHsKLQkJCQkJCQlyZWZEYi5nZXRSZWZzKCJyZWYiKTsKKwkJCQkJCQlyZWZEYi5nZXRSZWZzQnlQcmVmaXgoInJlZiIpOwogCQkJCQkJCWNoYW5nZUNvdW50LmluY3JlbWVudEFuZEdldCgpOwogCQkJCQkJfSBjYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIHNvZSkgewogCQkJCQkJCWVycm9yLnNldChzb2UpOwpAQCAtMTI4MCw4ICsxMjgwLDggQEAgcHVibGljIHZvaWQgb25SZWZzQ2hhbmdlZChSZWZzQ2hhbmdlZEV2ZW50IGV2ZW50KSB7CiAJCQkJCQl9CiAJCQkJCX0KIAkJCQl9KTsKLQkJcmVmRGIuZ2V0UmVmcygicmVmIik7Ci0JCXJlZkRiLmdldFJlZnMoInJlZiIpOworCQlyZWZEYi5nZXRSZWZzQnlQcmVmaXgoInJlZiIpOworCQlyZWZEYi5nZXRSZWZzQnlQcmVmaXgoInJlZiIpOwogCQlhc3NlcnROdWxsKGVycm9yLmdldCgpKTsKIAkJYXNzZXJ0TnVsbChleGNlcHRpb24uZ2V0KCkpOwogCQlhc3NlcnRFcXVhbHMoMSwgY2hhbmdlQ291bnQuZ2V0KCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZVcGRhdGVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZlVwZGF0ZVRlc3QuamF2YQppbmRleCBkOGQ0NWE4Li5lMWFkZWVkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZlVwZGF0ZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZlVwZGF0ZVRlc3QuamF2YQpAQCAtNDUsOCArNDUsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkxPQ0tfU1VGRklYOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKQEAgLTYyLDYgKzYyLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwpAQCAtOTQsMTMgKzk1LDEzIEBAIHByaXZhdGUgdm9pZCB3cml0ZVN5bXJlZihTdHJpbmcgc3JjLCBTdHJpbmcgZHN0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZWZVcGRhdGUgdXBkYXRlUmVmKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgUmVmVXBkYXRlIHVwZGF0ZVJlZihTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgUmVmVXBkYXRlIHJlZiA9IGRiLnVwZGF0ZVJlZihuYW1lKTsKIAkJcmVmLnNldE5ld09iamVjdElkKGRiLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpKTsKIAkJcmV0dXJuIHJlZjsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZGVsZXRlKGZpbmFsIFJlZlVwZGF0ZSByZWYsIGZpbmFsIFJlc3VsdCBleHBlY3RlZCkKKwlwcml2YXRlIHZvaWQgZGVsZXRlKFJlZlVwZGF0ZSByZWYsIFJlc3VsdCBleHBlY3RlZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWRlbGV0ZShyZWYsIGV4cGVjdGVkLCB0cnVlLCB0cnVlKTsKIAl9CkBAIC0xMTAsMTEgKzExMSwyMSBAQCBwcml2YXRlIHZvaWQgZGVsZXRlKGZpbmFsIFJlZlVwZGF0ZSByZWYsIGZpbmFsIFJlc3VsdCBleHBlY3RlZCwKIAkJZGVsZXRlKGRiLCByZWYsIGV4cGVjdGVkLCBleGlzdHMsIHJlbW92ZWQpOwogCX0KIAotCXByaXZhdGUgdm9pZCBkZWxldGUoUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBSZWZVcGRhdGUgcmVmLCBmaW5hbCBSZXN1bHQgZXhwZWN0ZWQsCi0JCQlmaW5hbCBib29sZWFuIGV4aXN0cywgZmluYWwgYm9vbGVhbiByZW1vdmVkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlhc3NlcnRFcXVhbHMoZXhpc3RzLCByZXBvLmdldEFsbFJlZnMoKS5jb250YWluc0tleShyZWYuZ2V0TmFtZSgpKSk7CisJcHJpdmF0ZSB2b2lkIGRlbGV0ZShSZXBvc2l0b3J5IHJlcG8sIGZpbmFsIFJlZlVwZGF0ZSByZWYsCisJCQlmaW5hbCBSZXN1bHQgZXhwZWN0ZWQsIGZpbmFsIGJvb2xlYW4gZXhpc3RzLCBmaW5hbCBib29sZWFuIHJlbW92ZWQpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlhc3NlcnRFcXVhbHMoZXhpc3RzLCBnZXRSZWYocmVwbywgcmVmLmdldE5hbWUoKSkuaXNQcmVzZW50KCkpOwogCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlZi5kZWxldGUoKSk7Ci0JCWFzc2VydEVxdWFscyghcmVtb3ZlZCwgcmVwby5nZXRBbGxSZWZzKCkuY29udGFpbnNLZXkocmVmLmdldE5hbWUoKSkpOworCQlhc3NlcnRFcXVhbHMoIXJlbW92ZWQsIGdldFJlZihyZXBvLCByZWYuZ2V0TmFtZSgpKS5pc1ByZXNlbnQoKSk7CisJfQorCisJcHJpdmF0ZSBPcHRpb25hbDxSZWY+IGdldFJlZihSZXBvc2l0b3J5IHJlcG8sIFN0cmluZyBuYW1lKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdldFJlZihyZXBvLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpLCBuYW1lKTsKKwl9CisKKwlwcml2YXRlIE9wdGlvbmFsPFJlZj4gZ2V0UmVmKExpc3Q8UmVmPiByZWZzLCBTdHJpbmcgbmFtZSkgeworCQlyZXR1cm4gcmVmcy5zdHJlYW0oKS5maWx0ZXIociAtPiByLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpLmZpbmRBbnkoKTsKIAl9CiAKIAlAVGVzdApAQCAtMTI1LDggKzEzNiw3IEBAIHB1YmxpYyB2b2lkIHRlc3ROb0NhY2hlT2JqZWN0SWRTdWJjbGFzcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJ1LnNldE5ld09iamVjdElkKG5ld2lkKTsKIAkJUmVzdWx0IHVwZGF0ZSA9IHJ1LnVwZGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoUmVzdWx0Lk5FVywgdXBkYXRlKTsKLQkJZmluYWwgUmVmIHIgPSBkYi5nZXRBbGxSZWZzKCkuZ2V0KG5ld1JlZik7Ci0JCWFzc2VydE5vdE51bGwocik7CisJCWZpbmFsIFJlZiByID0gZ2V0UmVmKGRiLCBuZXdSZWYpLmdldCgpOwogCQlhc3NlcnRFcXVhbHMobmV3UmVmLCByLmdldE5hbWUoKSk7CiAJCWFzc2VydE5vdE51bGwoci5nZXRPYmplY3RJZCgpKTsKIAkJYXNzZXJ0Tm90U2FtZShuZXdpZCwgci5nZXRPYmplY3RJZCgpKTsKQEAgLTI1Myw3ICsyNjMsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlSGVhZEluQmFyZVJlcG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJCU9iamVjdElkIGJsb2JJZDsKIAkJdHJ5IChPYmplY3RJbnNlcnRlciBpbnMgPSBiYXJlUmVwby5uZXdPYmplY3RJbnNlcnRlcigpKSB7Ci0JCQlibG9iSWQgPSBpbnMuaW5zZXJ0KENvbnN0YW50cy5PQkpfQkxPQiwgImNvbnRlbnRzIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJYmxvYklkID0gaW5zLmluc2VydChDb25zdGFudHMuT0JKX0JMT0IsICJjb250ZW50cyIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQkJaW5zLmZsdXNoKCk7CiAJCX0KIApAQCAtMzc4LDEwICszODgsMTAgQEAgcHVibGljIHZvaWQgdGVzdERlbGV0ZVdpdGhvdXRIZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlZktleVNhbWVBc05hbWUoKSB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCiAJCU1hcDxTdHJpbmcsIFJlZj4gYWxsUmVmcyA9IGRiLmdldEFsbFJlZnMoKTsKIAkJZm9yIChFbnRyeTxTdHJpbmcsIFJlZj4gZSA6IGFsbFJlZnMuZW50cnlTZXQoKSkgewogCQkJYXNzZXJ0RXF1YWxzKGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKS5nZXROYW1lKCkpOwotCiAJCX0KIAl9CiAKQEAgLTUyMCw4ICs1MzAsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0VXBkYXRlUmVmTm9DaGFuZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqLwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlZnNDYWNoZUFmdGVyVXBkYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIERvIG5vdCB1c2UgdGhlIGRlZmFsdCByZXBvIGZvciB0aGlzIGNhc2UuCi0JCU1hcDxTdHJpbmcsIFJlZj4gYWxsUmVmcyA9IGRiLmdldEFsbFJlZnMoKTsKKwkJLy8gRG8gbm90IHVzZSB0aGUgZGVmYXVsdCByZXBvIGZvciB0aGlzIGNhc2UuCisJCUxpc3Q8UmVmPiBhbGxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CiAJCU9iamVjdElkIG9sZFZhbHVlID0gZGIucmVzb2x2ZSgiSEVBRCIpOwogCQlPYmplY3RJZCBuZXdWYWx1ZSA9IGRiLnJlc29sdmUoIkhFQUReIik7CiAJCS8vIGZpcnN0IG1ha2UgSEVBRCByZWZlciB0byBsb29zZSByZWYKQEAgLTUzNyw5ICs1NDcsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0UmVmc0NhY2hlQWZ0ZXJVcGRhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdXBkYXRlID0gdXBkYXRlUmVmLnVwZGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoUmVzdWx0LkZBU1RfRk9SV0FSRCwgdXBkYXRlKTsKIAotCQlhbGxSZWZzID0gZGIuZ2V0QWxsUmVmcygpOwotCQlSZWYgbWFzdGVyID0gYWxsUmVmcy5nZXQoInJlZnMvaGVhZHMvbWFzdGVyIik7Ci0JCVJlZiBoZWFkID0gYWxsUmVmcy5nZXQoIkhFQUQiKTsKKwkJYWxsUmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOworCQlSZWYgbWFzdGVyID0gZ2V0UmVmKGFsbFJlZnMsICJyZWZzL2hlYWRzL21hc3RlciIpLmdldCgpOworCQlSZWYgaGVhZCA9IGdldFJlZihhbGxSZWZzLCAiSEVBRCIpLmdldCgpOwogCQlhc3NlcnRFcXVhbHMoInJlZnMvaGVhZHMvbWFzdGVyIiwgbWFzdGVyLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiSEVBRCIsIGhlYWQuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0VHJ1ZSgiaXMgc3ltYm9saWMgcmVmZXJlbmNlIiwgaGVhZC5pc1N5bWJvbGljKCkpOwpAQCAtNTU3LDggKzU2Nyw4IEBAIHB1YmxpYyB2b2lkIHRlc3RSZWZzQ2FjaGVBZnRlclVwZGF0ZSgpIHRocm93cyBFeGNlcHRpb24gewogCSAqLwogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFJlZnNDYWNoZUFmdGVyVXBkYXRlTG9vc2VPbmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIERvIG5vdCB1c2UgdGhlIGRlZmFsdCByZXBvIGZvciB0aGlzIGNhc2UuCi0JCU1hcDxTdHJpbmcsIFJlZj4gYWxsUmVmcyA9IGRiLmdldEFsbFJlZnMoKTsKKwkJLy8gRG8gbm90IHVzZSB0aGUgZGVmYXVsdCByZXBvIGZvciB0aGlzIGNhc2UuCisJCUxpc3Q8UmVmPiBhbGxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CiAJCU9iamVjdElkIG9sZFZhbHVlID0gZGIucmVzb2x2ZSgiSEVBRCIpOwogCQl3cml0ZVN5bXJlZihDb25zdGFudHMuSEVBRCwgInJlZnMvaGVhZHMvbmV3cmVmIik7CiAJCVJlZlVwZGF0ZSB1cGRhdGVSZWYgPSBkYi51cGRhdGVSZWYoQ29uc3RhbnRzLkhFQUQpOwpAQCAtNTY3LDkgKzU3Nyw5IEBAIHB1YmxpYyB2b2lkIHRlc3RSZWZzQ2FjaGVBZnRlclVwZGF0ZUxvb3NlT25seSgpIHRocm93cyBFeGNlcHRpb24gewogCQlSZXN1bHQgdXBkYXRlID0gdXBkYXRlUmVmLnVwZGF0ZSgpOwogCQlhc3NlcnRFcXVhbHMoUmVzdWx0Lk5FVywgdXBkYXRlKTsKIAotCQlhbGxSZWZzID0gZGIuZ2V0QWxsUmVmcygpOwotCQlSZWYgaGVhZCA9IGFsbFJlZnMuZ2V0KCJIRUFEIik7Ci0JCVJlZiBuZXdyZWYgPSBhbGxSZWZzLmdldCgicmVmcy9oZWFkcy9uZXdyZWYiKTsKKwkJYWxsUmVmcyA9IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOworCQlSZWYgaGVhZCA9IGdldFJlZihhbGxSZWZzLCAiSEVBRCIpLmdldCgpOworCQlSZWYgbmV3cmVmID0gZ2V0UmVmKGFsbFJlZnMsICJyZWZzL2hlYWRzL25ld3JlZiIpLmdldCgpOwogCQlhc3NlcnRFcXVhbHMoInJlZnMvaGVhZHMvbmV3cmVmIiwgbmV3cmVmLmdldE5hbWUoKSk7CiAJCWFzc2VydEVxdWFscygiSEVBRCIsIGhlYWQuZ2V0TmFtZSgpKTsKIAkJYXNzZXJ0VHJ1ZSgiaXMgc3ltYm9saWMgcmVmZXJlbmNlIiwgaGVhZC5pc1N5bWJvbGljKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9UMDAwM19CYXNpY1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVDAwMDNfQmFzaWNUZXN0LmphdmEKaW5kZXggZDc1MDVhZi4uZTExM2RiMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9UMDAwM19CYXNpY1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1QwMDAzX0Jhc2ljVGVzdC5qYXZhCkBAIC00Nyw3ICs0Nyw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xOwotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwpAQCAtMTM3LDEwICsxMzcsMTAgQEAgcHVibGljIHZvaWQgdGVzdDAwMF9vcGVuUmVwb0JhZEFyZ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdDAwMF9vcGVucmVwb19kZWZhdWx0X2dpdERpclNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgcmVwbzFQYXJlbnQgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJyMSIpOwotCQlSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeShuZXcgRmlsZShyZXBvMVBhcmVudCwKLQkJCQlDb25zdGFudHMuRE9UX0dJVCkpOwotCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7Ci0JCXJlcG8xaW5pdGlhbC5jbG9zZSgpOworCQl0cnkgKFJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KAorCQkJCW5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCkpKSB7CisJCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7CisJCX0KIAogCQlGaWxlIHRoZURpciA9IG5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCk7CiAJCUZpbGVSZXBvc2l0b3J5IHIgPSAoRmlsZVJlcG9zaXRvcnkpIG5ldyBGaWxlUmVwb3NpdG9yeUJ1aWxkZXIoKQpAQCAtMTYyLDEwICsxNjIsMTAgQEAgcHVibGljIHZvaWQgdGVzdDAwMF9vcGVucmVwb19kZWZhdWx0X2dpdERpclNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdDAwMF9vcGVucmVwb19kZWZhdWx0X2dpdERpckFuZFdvcmtUcmVlU2V0KCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgcmVwbzFQYXJlbnQgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJyMSIpOwotCQlSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeShuZXcgRmlsZShyZXBvMVBhcmVudCwKLQkJCQlDb25zdGFudHMuRE9UX0dJVCkpOwotCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7Ci0JCXJlcG8xaW5pdGlhbC5jbG9zZSgpOworCQl0cnkgKFJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KAorCQkJCW5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCkpKSB7CisJCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7CisJCX0KIAogCQlGaWxlIHRoZURpciA9IG5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCk7CiAJCUZpbGVSZXBvc2l0b3J5IHIgPSAoRmlsZVJlcG9zaXRvcnkpIG5ldyBGaWxlUmVwb3NpdG9yeUJ1aWxkZXIoKQpAQCAtMTg3LDEwICsxODcsMTAgQEAgcHVibGljIHZvaWQgdGVzdDAwMF9vcGVucmVwb19kZWZhdWx0X2dpdERpckFuZFdvcmtUcmVlU2V0KCkKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3QwMDBfb3BlbnJlcG9fZGVmYXVsdF93b3JrRGlyU2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZSByZXBvMVBhcmVudCA9IG5ldyBGaWxlKHRyYXNoLmdldFBhcmVudEZpbGUoKSwgInIxIik7Ci0JCVJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KG5ldyBGaWxlKHJlcG8xUGFyZW50LAotCQkJCUNvbnN0YW50cy5ET1RfR0lUKSk7Ci0JCXJlcG8xaW5pdGlhbC5jcmVhdGUoKTsKLQkJcmVwbzFpbml0aWFsLmNsb3NlKCk7CisJCXRyeSAoUmVwb3NpdG9yeSByZXBvMWluaXRpYWwgPSBuZXcgRmlsZVJlcG9zaXRvcnkoCisJCQkJbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKSkpIHsKKwkJCXJlcG8xaW5pdGlhbC5jcmVhdGUoKTsKKwkJfQogCiAJCUZpbGUgdGhlRGlyID0gbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKTsKIAkJRmlsZVJlcG9zaXRvcnkgciA9IChGaWxlUmVwb3NpdG9yeSkgbmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpCkBAIC0yMTMsMTMgKzIxMywxMyBAQCBwdWJsaWMgdm9pZCB0ZXN0MDAwX29wZW5yZXBvX2RlZmF1bHRfYWJzb2x1dGVfd29ya2RpcmNvbmZpZygpCiAJCUZpbGUgcmVwbzFQYXJlbnQgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJyMSIpOwogCQlGaWxlIHdvcmtkaXIgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJydyIpOwogCQlGaWxlVXRpbHMubWtkaXIod29ya2Rpcik7Ci0JCUZpbGVSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeShuZXcgRmlsZShyZXBvMVBhcmVudCwKLQkJCQlDb25zdGFudHMuRE9UX0dJVCkpOwotCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7Ci0JCWZpbmFsIEZpbGVCYXNlZENvbmZpZyBjZmcgPSByZXBvMWluaXRpYWwuZ2V0Q29uZmlnKCk7Ci0JCWNmZy5zZXRTdHJpbmcoImNvcmUiLCBudWxsLCAid29ya3RyZWUiLCB3b3JrZGlyLmdldEFic29sdXRlUGF0aCgpKTsKLQkJY2ZnLnNhdmUoKTsKLQkJcmVwbzFpbml0aWFsLmNsb3NlKCk7CisJCXRyeSAoRmlsZVJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KAorCQkJCW5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCkpKSB7CisJCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7CisJCQlmaW5hbCBGaWxlQmFzZWRDb25maWcgY2ZnID0gcmVwbzFpbml0aWFsLmdldENvbmZpZygpOworCQkJY2ZnLnNldFN0cmluZygiY29yZSIsIG51bGwsICJ3b3JrdHJlZSIsIHdvcmtkaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCQkJY2ZnLnNhdmUoKTsKKwkJfQogCiAJCUZpbGUgdGhlRGlyID0gbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKTsKIAkJRmlsZVJlcG9zaXRvcnkgciA9IChGaWxlUmVwb3NpdG9yeSkgbmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpCkBAIC0yNDIsMTMgKzI0MiwxMyBAQCBwdWJsaWMgdm9pZCB0ZXN0MDAwX29wZW5yZXBvX2RlZmF1bHRfcmVsYXRpdmVfd29ya2RpcmNvbmZpZygpCiAJCUZpbGUgcmVwbzFQYXJlbnQgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJyMSIpOwogCQlGaWxlIHdvcmtkaXIgPSBuZXcgRmlsZSh0cmFzaC5nZXRQYXJlbnRGaWxlKCksICJydyIpOwogCQlGaWxlVXRpbHMubWtkaXIod29ya2Rpcik7Ci0JCUZpbGVSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeShuZXcgRmlsZShyZXBvMVBhcmVudCwKLQkJCQlDb25zdGFudHMuRE9UX0dJVCkpOwotCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7Ci0JCWZpbmFsIEZpbGVCYXNlZENvbmZpZyBjZmcgPSByZXBvMWluaXRpYWwuZ2V0Q29uZmlnKCk7Ci0JCWNmZy5zZXRTdHJpbmcoImNvcmUiLCBudWxsLCAid29ya3RyZWUiLCAiLi4vLi4vcnciKTsKLQkJY2ZnLnNhdmUoKTsKLQkJcmVwbzFpbml0aWFsLmNsb3NlKCk7CisJCXRyeSAoRmlsZVJlcG9zaXRvcnkgcmVwbzFpbml0aWFsID0gbmV3IEZpbGVSZXBvc2l0b3J5KAorCQkJCW5ldyBGaWxlKHJlcG8xUGFyZW50LCBDb25zdGFudHMuRE9UX0dJVCkpKSB7CisJCQlyZXBvMWluaXRpYWwuY3JlYXRlKCk7CisJCQlmaW5hbCBGaWxlQmFzZWRDb25maWcgY2ZnID0gcmVwbzFpbml0aWFsLmdldENvbmZpZygpOworCQkJY2ZnLnNldFN0cmluZygiY29yZSIsIG51bGwsICJ3b3JrdHJlZSIsICIuLi8uLi9ydyIpOworCQkJY2ZnLnNhdmUoKTsKKwkJfQogCiAJCUZpbGUgdGhlRGlyID0gbmV3IEZpbGUocmVwbzFQYXJlbnQsIENvbnN0YW50cy5ET1RfR0lUKTsKIAkJRmlsZVJlcG9zaXRvcnkgciA9IChGaWxlUmVwb3NpdG9yeSkgbmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpCkBAIC0yNzMsMjYgKzI3MywyNCBAQCBwdWJsaWMgdm9pZCB0ZXN0MDAwX29wZW5yZXBvX2FsdGVybmF0ZV9pbmRleF9maWxlX2FuZF9vYmpkaXJzKCkKIAkJRmlsZSBpbmRleEZpbGUgPSBuZXcgRmlsZSh0cmFzaCwgImlkeCIpOwogCQlGaWxlIG9iakRpciA9IG5ldyBGaWxlKHRyYXNoLCAiLi4vb2JqIik7CiAJCUZpbGUgYWx0T2JqRGlyID0gZGIuZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXREaXJlY3RvcnkoKTsKLQkJUmVwb3NpdG9yeSByZXBvMWluaXRpYWwgPSBuZXcgRmlsZVJlcG9zaXRvcnkobmV3IEZpbGUocmVwbzFQYXJlbnQsCi0JCQkJQ29uc3RhbnRzLkRPVF9HSVQpKTsKLQkJcmVwbzFpbml0aWFsLmNyZWF0ZSgpOwotCQlyZXBvMWluaXRpYWwuY2xvc2UoKTsKKwkJdHJ5IChSZXBvc2l0b3J5IHJlcG8xaW5pdGlhbCA9IG5ldyBGaWxlUmVwb3NpdG9yeSgKKwkJCQluZXcgRmlsZShyZXBvMVBhcmVudCwgQ29uc3RhbnRzLkRPVF9HSVQpKSkgeworCQkJcmVwbzFpbml0aWFsLmNyZWF0ZSgpOworCQl9CiAKIAkJRmlsZSB0aGVEaXIgPSBuZXcgRmlsZShyZXBvMVBhcmVudCwgQ29uc3RhbnRzLkRPVF9HSVQpOwotCQlGaWxlUmVwb3NpdG9yeSByID0gKEZpbGVSZXBvc2l0b3J5KSBuZXcgRmlsZVJlcG9zaXRvcnlCdWlsZGVyKCkgLy8KKwkJdHJ5IChGaWxlUmVwb3NpdG9yeSByID0gKEZpbGVSZXBvc2l0b3J5KSBuZXcgRmlsZVJlcG9zaXRvcnlCdWlsZGVyKCkgLy8KIAkJCQkuc2V0R2l0RGlyKHRoZURpcikuc2V0T2JqZWN0RGlyZWN0b3J5KG9iakRpcikgLy8KIAkJCQkuYWRkQWx0ZXJuYXRlT2JqZWN0RGlyZWN0b3J5KGFsdE9iakRpcikgLy8KIAkJCQkuc2V0SW5kZXhGaWxlKGluZGV4RmlsZSkgLy8KLQkJCQkuYnVpbGQoKTsKLQkJYXNzZXJ0RXF1YWxzUGF0aCh0aGVEaXIsIHIuZ2V0RGlyZWN0b3J5KCkpOwotCQlhc3NlcnRFcXVhbHNQYXRoKHRoZURpci5nZXRQYXJlbnRGaWxlKCksIHIuZ2V0V29ya1RyZWUoKSk7Ci0JCWFzc2VydEVxdWFsc1BhdGgoaW5kZXhGaWxlLCByLmdldEluZGV4RmlsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzUGF0aChvYmpEaXIsIHIuZ2V0T2JqZWN0RGF0YWJhc2UoKS5nZXREaXJlY3RvcnkoKSk7Ci0JCWFzc2VydE5vdE51bGwoci5vcGVuKE9iamVjdElkCi0JCQkJLmZyb21TdHJpbmcoIjZkYjljMmViZjc1NTkwZWVmOTczMDgxNzM2NzMwYTllYTE2OWEwYzQiKSkpOwotCQkvLyBNdXN0IGNsb3NlIG9yIHRoZSBkZWZhdWx0IHJlcG8gcGFjayBmaWxlcyBjcmVhdGVkIGJ5IHRoaXMgdGVzdCBnZXRzCi0JCS8vIGxvY2tlZCB2aWEgdGhlIGFsdGVybmF0ZSBvYmplY3QgZGlyZWN0b3JpZXMgb24gV2luZG93cy4KLQkJci5jbG9zZSgpOworCQkJCS5idWlsZCgpKSB7CisJCQlhc3NlcnRFcXVhbHNQYXRoKHRoZURpciwgci5nZXREaXJlY3RvcnkoKSk7CisJCQlhc3NlcnRFcXVhbHNQYXRoKHRoZURpci5nZXRQYXJlbnRGaWxlKCksIHIuZ2V0V29ya1RyZWUoKSk7CisJCQlhc3NlcnRFcXVhbHNQYXRoKGluZGV4RmlsZSwgci5nZXRJbmRleEZpbGUoKSk7CisJCQlhc3NlcnRFcXVhbHNQYXRoKG9iakRpciwgci5nZXRPYmplY3REYXRhYmFzZSgpLmdldERpcmVjdG9yeSgpKTsKKwkJCWFzc2VydE5vdE51bGwoci5vcGVuKE9iamVjdElkCisJCQkJCS5mcm9tU3RyaW5nKCI2ZGI5YzJlYmY3NTU5MGVlZjk3MzA4MTczNjczMGE5ZWExNjlhMGM0IikpKTsKKwkJfQogCX0KIAogCXByb3RlY3RlZCB2b2lkIGFzc2VydEVxdWFsc1BhdGgoRmlsZSBleHBlY3RlZCwgRmlsZSBhY3R1YWwpCkBAIC0zMDcsNyArMzA1LDcgQEAgcHVibGljIHZvaWQgdGVzdDAwMl9Xcml0ZUVtcHR5VHJlZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8vIG9iamVjdCAoYXMgaXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHBhY2spLgogCQkvLwogCQlmaW5hbCBSZXBvc2l0b3J5IG5ld2RiID0gY3JlYXRlQmFyZVJlcG9zaXRvcnkoKTsKLQkJdHJ5IChmaW5hbCBPYmplY3RJbnNlcnRlciBvaSA9IG5ld2RiLm5ld09iamVjdEluc2VydGVyKCkpIHsKKwkJdHJ5IChPYmplY3RJbnNlcnRlciBvaSA9IG5ld2RiLm5ld09iamVjdEluc2VydGVyKCkpIHsKIAkJCWZpbmFsIE9iamVjdElkIHRyZWVJZCA9IG9pLmluc2VydChuZXcgVHJlZUZvcm1hdHRlcigpKTsKIAkJCWFzc2VydEVxdWFscygiNGI4MjVkYzY0MmNiNmViOWEwNjBlNTRiZjhkNjkyODhmYmVlNDkwNCIsCiAJCQkJCXRyZWVJZC5uYW1lKCkpOwpAQCAtMzc1LDcgKzM3Myw3IEBAIHB1YmxpYyB2b2lkIHRlc3QwMDZfUmVhZFVnbHlDb25maWcoKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3QwMDdfT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgRmlsZVJlcG9zaXRvcnkgZGIyID0gbmV3IEZpbGVSZXBvc2l0b3J5KGRiLmdldERpcmVjdG9yeSgpKSkgeworCQl0cnkgKEZpbGVSZXBvc2l0b3J5IGRiMiA9IG5ldyBGaWxlUmVwb3NpdG9yeShkYi5nZXREaXJlY3RvcnkoKSkpIHsKIAkJCWFzc2VydEVxdWFscyhkYi5nZXREaXJlY3RvcnkoKSwgZGIyLmdldERpcmVjdG9yeSgpKTsKIAkJCWFzc2VydEVxdWFscyhkYi5nZXRPYmplY3REYXRhYmFzZSgpLmdldERpcmVjdG9yeSgpLCBkYjIKIAkJCQkJLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0RGlyZWN0b3J5KCkpOwpAQCAtNDE3LDE0ICs0MTUsMTEgQEAgcHVibGljIHZvaWQgdGVzdDAwOV9DcmVhdGVDb21taXRPbGRGb3JtYXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkvLyBWZXJpZnkgdGhlIGNvbW1pdCB3ZSBqdXN0IHdyb3RlIGlzIGluIHRoZSBjb3JyZWN0IGZvcm1hdC4KIAkJT2JqZWN0RGF0YWJhc2Ugb2RiID0gZGIuZ2V0T2JqZWN0RGF0YWJhc2UoKTsKIAkJYXNzZXJ0VHJ1ZSgiaXMgT2JqZWN0RGlyZWN0b3J5Iiwgb2RiIGluc3RhbmNlb2YgT2JqZWN0RGlyZWN0b3J5KTsKLQkJZmluYWwgWElucHV0U3RyZWFtIHhpcyA9IG5ldyBYSW5wdXRTdHJlYW0obmV3IEZpbGVJbnB1dFN0cmVhbSgKLQkJCQkoKE9iamVjdERpcmVjdG9yeSkgb2RiKS5maWxlRm9yKGNtdGlkKSkpOwotCQl0cnkgeworCQl0cnkgKFhJbnB1dFN0cmVhbSB4aXMgPSBuZXcgWElucHV0U3RyZWFtKAorCQkJCW5ldyBGaWxlSW5wdXRTdHJlYW0oKChPYmplY3REaXJlY3RvcnkpIG9kYikuZmlsZUZvcihjbXRpZCkpKSkgewogCQkJYXNzZXJ0RXF1YWxzKDB4NzgsIHhpcy5yZWFkVUludDgoKSk7CiAJCQlhc3NlcnRFcXVhbHMoMHg5YywgeGlzLnJlYWRVSW50OCgpKTsKIAkJCWFzc2VydEVxdWFscygwLCAweDc4OWMgJSAzMSk7Ci0JCX0gZmluYWxseSB7Ci0JCQl4aXMuY2xvc2UoKTsKIAkJfQogCiAJCS8vIFZlcmlmeSB3ZSBjYW4gcmVhZCBpdC4KQEAgLTUyMiw3ICs1MTcsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0MDIzX2NyZWF0ZUNvbW1pdE5vbkFudWxsaWkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCTQyOTQ5NjcyOTUwMDBMLCA2MCkpOwogCQljb21taXQuc2V0Q29tbWl0dGVyKG5ldyBQZXJzb25JZGVudCgiSm9lIEhhY2tlciIsICJqb2UyQGV4YW1wbGUuY29tIiwKIAkJCQk0Mjk0OTY3Mjk1MDAwTCwgNjApKTsKLQkJY29tbWl0LnNldEVuY29kaW5nKFVURl84KTsKKwkJY29tbWl0LnNldEVuY29kaW5nKENIQVJTRVQpOwogCQljb21taXQuc2V0TWVzc2FnZSgiXHUwMGRjYmVyZ2Vla3MiKTsKIAkJT2JqZWN0SWQgY2lkID0gaW5zZXJ0Q29tbWl0KGNvbW1pdCk7CiAJCWFzc2VydEVxdWFscygiNDY4MDkwODExMjc3ODcxOGYzN2U2ODZjYmViY2M5MTI3MzBiMzE1NCIsIGNpZC5uYW1lKCkpOwpAQCAtNTYyLDcgKzU1Nyw3IEBAIHB1YmxpYyB2b2lkIHRlc3QwMjVfY29tcHV0ZVNoYTFOb1N0b3JlKCkgewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdDAyNl9DcmVhdGVDb21taXRNdWx0aXBsZXBhcmVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBPYmplY3RJZCB0cmVlSWQ7Ci0JCXRyeSAoZmluYWwgT2JqZWN0SW5zZXJ0ZXIgb2kgPSBkYi5uZXdPYmplY3RJbnNlcnRlcigpKSB7CisJCXRyeSAoT2JqZWN0SW5zZXJ0ZXIgb2kgPSBkYi5uZXdPYmplY3RJbnNlcnRlcigpKSB7CiAJCQlmaW5hbCBPYmplY3RJZCBibG9iSWQgPSBvaS5pbnNlcnQoQ29uc3RhbnRzLk9CSl9CTE9CLAogCQkJCQkiYW5kIHRoaXMgaXMgdGhlIGRhdGEgaW4gbWVcbiIuZ2V0Qnl0ZXMoQ29uc3RhbnRzLkNIQVJTRVQKIAkJCQkJCQkubmFtZSgpKSk7CkBAIC03NTIsNyArNzQ3LDcgQEAgcHJpdmF0ZSBPYmplY3RJZCBpbnNlcnRUcmVlKFRyZWVGb3JtYXR0ZXIgdHJlZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgT2JqZWN0SWQgaW5zZXJ0Q29tbWl0KGZpbmFsIENvbW1pdEJ1aWxkZXIgYnVpbGRlcikKKwlwcml2YXRlIE9iamVjdElkIGluc2VydENvbW1pdChDb21taXRCdWlsZGVyIGJ1aWxkZXIpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewogCQl0cnkgKE9iamVjdEluc2VydGVyIG9pID0gZGIubmV3T2JqZWN0SW5zZXJ0ZXIoKSkgewogCQkJT2JqZWN0SWQgaWQgPSBvaS5pbnNlcnQoYnVpbGRlcik7CkBAIC03NjksNyArNzY0LDcgQEAgcHJpdmF0ZSBSZXZDb21taXQgcGFyc2VDb21taXQoQW55T2JqZWN0SWQgaWQpCiAJCX0KIAl9CiAKLQlwcml2YXRlIE9iamVjdElkIGluc2VydFRhZyhmaW5hbCBUYWdCdWlsZGVyIHRhZykgdGhyb3dzIElPRXhjZXB0aW9uLAorCXByaXZhdGUgT2JqZWN0SWQgaW5zZXJ0VGFnKFRhZ0J1aWxkZXIgdGFnKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKIAkJdHJ5IChPYmplY3RJbnNlcnRlciBvaSA9IGRiLm5ld09iamVjdEluc2VydGVyKCkpIHsKIAkJCU9iamVjdElkIGlkID0gb2kuaW5zZXJ0KHRhZyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1VucGFja2VkT2JqZWN0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9VbnBhY2tlZE9iamVjdFRlc3QuamF2YQppbmRleCBjNWFiNzY2Li45OGZmMDRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1VucGFja2VkT2JqZWN0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVW5wYWNrZWRPYmplY3RUZXN0LmphdmEKQEAgLTEzMCwxNSArMTMwLDE1IEBAIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZEZvcm1hdF9TbWFsbE9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRGYWxzZSgiaXMgbm90IGxhcmdlIiwgb2wuaXNMYXJnZSgpKTsKIAkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhLCBvbC5nZXRDYWNoZWRCeXRlcygpKSk7CiAKLQkJT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpOwotCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKLQkJYXNzZXJ0RXF1YWxzKHR5cGUsIGluLmdldFR5cGUoKSk7Ci0JCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKLQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOwotCQlJTy5yZWFkRnVsbHkoaW4sIGRhdGEyLCAwLCBkYXRhLmxlbmd0aCk7Ci0JCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YTIsIGRhdGEpKTsKLQkJYXNzZXJ0RXF1YWxzKCJzdHJlYW0gYXQgRU9GIiwgLTEsIGluLnJlYWQoKSk7Ci0JCWluLmNsb3NlKCk7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpKSB7CisJCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKKwkJCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOworCQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOworCQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOworCQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhMiwgZGF0YSkpOworCQkJYXNzZXJ0RXF1YWxzKCJzdHJlYW0gYXQgRU9GIiwgLTEsIGluLnJlYWQoKSk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtMTUwLDExICsxNTAsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0U3RhbmRhcmRGb3JtYXRfTGFyZ2VPYmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQlPYmplY3RMb2FkZXIgb2w7CiAJCXsKLQkJCUZpbGVJbnB1dFN0cmVhbSBmcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aChpZCkpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSkpIHsKIAkJCQlvbCA9IFVucGFja2VkT2JqZWN0Lm9wZW4oZnMsIHBhdGgoaWQpLCBpZCwgd2MpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmcy5jbG9zZSgpOwogCQkJfQogCQl9CiAKQEAgLTE3MSwxNSArMTY4LDE1IEBAIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZEZvcm1hdF9MYXJnZU9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCQkuZ2V0TWVzc2FnZSgpKTsKIAkJfQogCi0JCU9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7Ci0JCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7Ci0JCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKLQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEyLCBkYXRhKSk7Ci0JCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOwotCQlpbi5jbG9zZSgpOworCQl0cnkgKE9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKSkgeworCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7CisJCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKKwkJCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKKwkJCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKwkJCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKKwkJCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YTIsIGRhdGEpKTsKKwkJCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTMxNiwyMyArMzEzLDEzIEBAIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZEZvcm1hdF9MYXJnZU9iamVjdF9Db3JydXB0WkxpYlN0cmVhbSgpCiAJCXdyaXRlKGlkLCBneik7CiAKIAkJT2JqZWN0TG9hZGVyIG9sOwotCQl7Ci0JCQlGaWxlSW5wdXRTdHJlYW0gZnMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgoaWQpKTsKLQkJCXRyeSB7Ci0JCQkJb2wgPSBVbnBhY2tlZE9iamVjdC5vcGVuKGZzLCBwYXRoKGlkKSwgaWQsIHdjKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJZnMuY2xvc2UoKTsKLQkJCX0KKwkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gZnMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgoaWQpKSkgeworCQkJb2wgPSBVbnBhY2tlZE9iamVjdC5vcGVuKGZzLCBwYXRoKGlkKSwgaWQsIHdjKTsKIAkJfQogCi0JCXRyeSB7Ci0JCQlieXRlW10gdG1wID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCQl0cnkgewotCQkJCUlPLnJlYWRGdWxseShpbiwgdG1wLCAwLCB0bXAubGVuZ3RoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW4uY2xvc2UoKTsKLQkJCX0KKwkJYnl0ZVtdIHRtcCA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKwkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKSkgeworCQkJSU8ucmVhZEZ1bGx5KGluLCB0bXAsIDAsIHRtcC5sZW5ndGgpOwogCQkJZmFpbCgiRGlkIG5vdCB0aHJvdyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIik7CiAJCX0gY2F0Y2ggKENvcnJ1cHRPYmplY3RFeGNlcHRpb24gY29lKSB7CiAJCQlhc3NlcnRFcXVhbHMoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkub2JqZWN0SXNDb3JydXB0LApAQCAtMzU0LDE2ICszNDEsMTIgQEAgcHVibGljIHZvaWQgdGVzdFN0YW5kYXJkRm9ybWF0X0xhcmdlT2JqZWN0X1RydW5jYXRlZFpMaWJTdHJlYW0oKQogCQl3cml0ZShpZCwgdHIpOwogCiAJCU9iamVjdExvYWRlciBvbDsKLQkJewotCQkJRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSk7Ci0JCQl0cnkgewotCQkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZzLmNsb3NlKCk7Ci0JCQl9CisJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSkpIHsKKwkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7CiAJCX0KIAogCQlieXRlW10gdG1wID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGF0IHRoZSBjbG9zZSgpIG1ldGhvZCB0aHJvd3MKIAkJSW5wdXRTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7CiAJCUlPLnJlYWRGdWxseShpbiwgdG1wLCAwLCB0bXAubGVuZ3RoKTsKIAkJdHJ5IHsKQEAgLTM4OSwxNiArMzcyLDEyIEBAIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZEZvcm1hdF9MYXJnZU9iamVjdF9UcmFpbGluZ0dhcmJhZ2UoKQogCQl3cml0ZShpZCwgdHIpOwogCiAJCU9iamVjdExvYWRlciBvbDsKLQkJewotCQkJRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSk7Ci0JCQl0cnkgewotCQkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZzLmNsb3NlKCk7Ci0JCQl9CisJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGZzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKGlkKSkpIHsKKwkJCW9sID0gVW5wYWNrZWRPYmplY3Qub3BlbihmcywgcGF0aChpZCksIGlkLCB3Yyk7CiAJCX0KIAogCQlieXRlW10gdG1wID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGF0IHRoZSBjbG9zZSgpIG1ldGhvZCB0aHJvd3MKIAkJSW5wdXRTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7CiAJCUlPLnJlYWRGdWxseShpbiwgdG1wLCAwLCB0bXAubGVuZ3RoKTsKIAkJdHJ5IHsKQEAgLTQyNiwxNCArNDA1LDE1IEBAIHB1YmxpYyB2b2lkIHRlc3RQYWNrRm9ybWF0X1NtYWxsT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydEZhbHNlKCJpcyBub3QgbGFyZ2UiLCBvbC5pc0xhcmdlKCkpOwogCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEsIG9sLmdldENhY2hlZEJ5dGVzKCkpKTsKIAotCQlPYmplY3RTdHJlYW0gaW4gPSBvbC5vcGVuU3RyZWFtKCk7Ci0JCWFzc2VydE5vdE51bGwoImhhdmUgc3RyZWFtIiwgaW4pOwotCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOwotCQlieXRlW10gZGF0YTIgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07Ci0JCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKLQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwgQXJyYXlzLmVxdWFscyhkYXRhLCBvbC5nZXRDYWNoZWRCeXRlcygpKSk7Ci0JCWluLmNsb3NlKCk7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb2wub3BlblN0cmVhbSgpKSB7CisJCQlhc3NlcnROb3ROdWxsKCJoYXZlIHN0cmVhbSIsIGluKTsKKwkJCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOworCQkJYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBpbi5nZXRTaXplKCkpOworCQkJYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGhdOworCQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOworCQkJYXNzZXJ0VHJ1ZSgic2FtZSBjb250ZW50IiwKKwkJCQkJQXJyYXlzLmVxdWFscyhkYXRhLCBvbC5nZXRDYWNoZWRCeXRlcygpKSk7CisJCX0KIAl9CiAKIAlAVGVzdApAQCAtNDQ0LDEzICs0MjQsOCBAQCBwdWJsaWMgdm9pZCB0ZXN0UGFja0Zvcm1hdF9MYXJnZU9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewogCQl3cml0ZShpZCwgY29tcHJlc3NQYWNrRm9ybWF0KHR5cGUsIGRhdGEpKTsKIAogCQlPYmplY3RMb2FkZXIgb2w7Ci0JCXsKLQkJCUZpbGVJbnB1dFN0cmVhbSBmcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aChpZCkpOwotCQkJdHJ5IHsKLQkJCQlvbCA9IFVucGFja2VkT2JqZWN0Lm9wZW4oZnMsIHBhdGgoaWQpLCBpZCwgd2MpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmcy5jbG9zZSgpOwotCQkJfQorCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBmcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aChpZCkpKSB7CisJCQlvbCA9IFVucGFja2VkT2JqZWN0Lm9wZW4oZnMsIHBhdGgoaWQpLCBpZCwgd2MpOwogCQl9CiAKIAkJYXNzZXJ0Tm90TnVsbCgiY3JlYXRlZCBsb2FkZXIiLCBvbCk7CkBAIC00NjYsMTUgKzQ0MSwxNSBAQCBwdWJsaWMgdm9pZCB0ZXN0UGFja0Zvcm1hdF9MYXJnZU9iamVjdCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCQkuZ2V0TWVzc2FnZSgpKTsKIAkJfQogCi0JCU9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKTsKLQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7Ci0JCWFzc2VydEVxdWFscyh0eXBlLCBpbi5nZXRUeXBlKCkpOwotCQlhc3NlcnRFcXVhbHMoZGF0YS5sZW5ndGgsIGluLmdldFNpemUoKSk7Ci0JCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKLQkJSU8ucmVhZEZ1bGx5KGluLCBkYXRhMiwgMCwgZGF0YS5sZW5ndGgpOwotCQlhc3NlcnRUcnVlKCJzYW1lIGNvbnRlbnQiLCBBcnJheXMuZXF1YWxzKGRhdGEyLCBkYXRhKSk7Ci0JCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOwotCQlpbi5jbG9zZSgpOworCQl0cnkgKE9iamVjdFN0cmVhbSBpbiA9IG9sLm9wZW5TdHJlYW0oKSkgeworCQkJYXNzZXJ0Tm90TnVsbCgiaGF2ZSBzdHJlYW0iLCBpbik7CisJCQlhc3NlcnRFcXVhbHModHlwZSwgaW4uZ2V0VHlwZSgpKTsKKwkJCWFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW4uZ2V0U2l6ZSgpKTsKKwkJCWJ5dGVbXSBkYXRhMiA9IG5ldyBieXRlW2RhdGEubGVuZ3RoXTsKKwkJCUlPLnJlYWRGdWxseShpbiwgZGF0YTIsIDAsIGRhdGEubGVuZ3RoKTsKKwkJCWFzc2VydFRydWUoInNhbWUgY29udGVudCIsIEFycmF5cy5lcXVhbHMoZGF0YTIsIGRhdGEpKTsKKwkJCWFzc2VydEVxdWFscygic3RyZWFtIGF0IEVPRiIsIC0xLCBpbi5yZWFkKCkpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTU3MywxMSArNTQ4LDggQEAgcHJpdmF0ZSBGaWxlIHBhdGgoT2JqZWN0SWQgaWQpIHsKIAlwcml2YXRlIHZvaWQgd3JpdGUoT2JqZWN0SWQgaWQsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIHBhdGggPSBwYXRoKGlkKTsKIAkJRmlsZVV0aWxzLm1rZGlycyhwYXRoLmdldFBhcmVudEZpbGUoKSk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ocGF0aCk7Ci0JCXRyeSB7CisJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShwYXRoKSkgewogCQkJb3V0LndyaXRlKGRhdGEpOwotCQl9IGZpbmFsbHkgewotCQkJb3V0LmNsb3NlKCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVHZXRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlR2V0VGVzdC5qYXZhCmluZGV4IGNjMzQ4MzguLjgyYWQyOGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVHZXRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZUdldFRlc3QuamF2YQpAQCAtNzQsMTEgKzc0LDEwIEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXN1cGVyLnNldFVwKCk7CiAKIAkJdG9Mb2FkID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0JCWZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKKwkJdHJ5IChCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoCiAJCQkJbmV3IEZpbGVJbnB1dFN0cmVhbShKR2l0VGVzdFV0aWwKIAkJCQkJCS5nZXRUZXN0UmVzb3VyY2VGaWxlKCJhbGxfcGFja2VkX29iamVjdHMudHh0IikpLAotCQkJCUNvbnN0YW50cy5DSEFSU0VUKSk7Ci0JCXRyeSB7CisJCQkJQ29uc3RhbnRzLkNIQVJTRVQpKSkgewogCQkJU3RyaW5nIGxpbmU7CiAJCQl3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CiAJCQkJZmluYWwgU3RyaW5nW10gcGFydHMgPSBsaW5lLnNwbGl0KCIgezEsfSIpOwpAQCAtOTAsOCArODksNiBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCS8vIHBhcnRzWzRdIGlzIHRoZSBvZmZzZXQgaW4gdGhlIHBhY2sKIAkJCQl0b0xvYWQuYWRkKG8pOwogCQkJfQotCQl9IGZpbmFsbHkgewotCQkJYnIuY2xvc2UoKTsKIAkJfQogCQlhc3NlcnRFcXVhbHMoOTYsIHRvTG9hZC5zaXplKCkpOwogCX0KQEAgLTEyNyw3ICsxMjQsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGVfVG9vU21hbGxMaW1pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNoZWNrTGltaXRzKGNmZyk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0xpbWl0cyhmaW5hbCBXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrTGltaXRzKFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgewogCQlmaW5hbCBXaW5kb3dDYWNoZSBjYWNoZSA9IFdpbmRvd0NhY2hlLmdldEluc3RhbmNlKCk7CiAJCWFzc2VydFRydWUoY2FjaGUuZ2V0T3BlbkZpbGVzKCkgPD0gY2ZnLmdldFBhY2tlZEdpdE9wZW5GaWxlcygpKTsKIAkJYXNzZXJ0VHJ1ZShjYWNoZS5nZXRPcGVuQnl0ZXMoKSA8PSBjZmcuZ2V0UGFja2VkR2l0TGltaXQoKSk7CkBAIC0xMzYsNyArMTMzLDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0xpbWl0cyhmaW5hbCBXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKIAl9CiAKIAlwcml2YXRlIHZvaWQgZG9DYWNoZVRlc3RzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChmaW5hbCBUZXN0T2JqZWN0IG8gOiB0b0xvYWQpIHsKKwkJZm9yIChUZXN0T2JqZWN0IG8gOiB0b0xvYWQpIHsKIAkJCWZpbmFsIE9iamVjdExvYWRlciBvciA9IGRiLm9wZW4oby5pZCwgby50eXBlKTsKIAkJCWFzc2VydE5vdE51bGwob3IpOwogCQkJYXNzZXJ0RXF1YWxzKG8udHlwZSwgb3IuZ2V0VHlwZSgpKTsKQEAgLTE0OCw3ICsxNDUsNyBAQCBwcml2YXRlIGNsYXNzIFRlc3RPYmplY3QgewogCiAJCWludCB0eXBlOwogCi0JCXZvaWQgc2V0VHlwZShmaW5hbCBTdHJpbmcgdHlwZVN0cikgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24geworCQl2b2lkIHNldFR5cGUoU3RyaW5nIHR5cGVTdHIpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJCWZpbmFsIGJ5dGVbXSB0eXBlUmF3ID0gQ29uc3RhbnRzLmVuY29kZSh0eXBlU3RyICsgIiAiKTsKIAkJCWZpbmFsIE11dGFibGVJbnRlZ2VyIHB0ciA9IG5ldyBNdXRhYmxlSW50ZWdlcigpOwogCQkJdHlwZSA9IENvbnN0YW50cy5kZWNvZGVUeXBlU3RyaW5nKGlkLCB0eXBlUmF3LCAoYnl0ZSkgJyAnLCBwdHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9YSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvWElucHV0U3RyZWFtLmphdmEKaW5kZXggNDZmOWVlMy4uOTEwOTk5YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9YSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1hJbnB1dFN0cmVhbS5qYXZhCkBAIC01Myw3ICs1Myw3IEBACiBjbGFzcyBYSW5wdXRTdHJlYW0gZXh0ZW5kcyBCdWZmZXJlZElucHV0U3RyZWFtIHsKIAlwcml2YXRlIGZpbmFsIGJ5dGVbXSBpbnRidWYgPSBuZXcgYnl0ZVs4XTsKIAotCVhJbnB1dFN0cmVhbShmaW5hbCBJbnB1dFN0cmVhbSBzKSB7CisJWElucHV0U3RyZWFtKElucHV0U3RyZWFtIHMpIHsKIAkJc3VwZXIocyk7CiAJfQogCkBAIC02Myw3ICs2Myw3IEBAIGNsYXNzIFhJbnB1dFN0cmVhbSBleHRlbmRzIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gewogCQlyZXR1cm4gYjsKIAl9CiAKLQlzeW5jaHJvbml6ZWQgdm9pZCByZWFkRnVsbHkoZmluYWwgYnl0ZVtdIGIsIGludCBvLCBpbnQgbGVuKQorCXN5bmNocm9uaXplZCB2b2lkIHJlYWRGdWxseShieXRlW10gYiwgaW50IG8sIGludCBsZW4pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpbnQgcjsKIAkJd2hpbGUgKGxlbiA+IDAgJiYgKHIgPSByZWFkKGIsIG8sIGxlbikpID4gMCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlRGF0YWJhc2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWVEYXRhYmFzZVRlc3QuamF2YQppbmRleCAxNjg0YWZhLi5hZTUyYWQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWVEYXRhYmFzZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWVEYXRhYmFzZVRlc3QuamF2YQpAQCAtNjMxLDcgKzYzMSw3IEBAIHByaXZhdGUgc3RhdGljIFJlY2VpdmVDb21tYW5kIGNvbW1hbmQoQW55T2JqZWN0SWQgYSwgQW55T2JqZWN0SWQgYiwKIAkJCQluYW1lKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc3ltcmVmKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZHN0KQorCXByaXZhdGUgdm9pZCBzeW1yZWYoU3RyaW5nIG5hbWUsIFN0cmluZyBkc3QpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQljb21taXQobmV3IEZ1bmN0aW9uKCkgewogCQkJQE92ZXJyaWRlCkBAIC02NDgsNyArNjQ4LDcgQEAgcHVibGljIGJvb2xlYW4gYXBwbHkoT2JqZWN0UmVhZGVyIHJlYWRlciwgUmVmVHJlZSB0cmVlKQogCQl9KTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdXBkYXRlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3RJZCBpZCkKKwlwcml2YXRlIHZvaWQgdXBkYXRlKFN0cmluZyBuYW1lLCBPYmplY3RJZCBpZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNvbW1pdChuZXcgRnVuY3Rpb24oKSB7CiAJCQlAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9qdW5pdC9UZXN0UmVwb3NpdG9yeVRlc3QuamF2YQppbmRleCBiNzAyN2YzLi45NjU4OTllIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvanVuaXQvVGVzdFJlcG9zaXRvcnlUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2p1bml0L1Rlc3RSZXBvc2l0b3J5VGVzdC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5qdW5pdDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CkBAIC00MTgsNiArNDE4LDYgQEAgcHJpdmF0ZSBTdHJpbmcgYmxvYkFzU3RyaW5nKEFueU9iamVjdElkIHRyZWVpc2gsIFN0cmluZyBwYXRoKQogCQlSZXZPYmplY3Qgb2JqID0gdHIuZ2V0KHJ3LnBhcnNlVHJlZSh0cmVlaXNoKSwgcGF0aCk7CiAJCWFzc2VydFNhbWUoUmV2QmxvYi5jbGFzcywgb2JqLmdldENsYXNzKCkpOwogCQlPYmplY3RMb2FkZXIgbG9hZGVyID0gcncuZ2V0T2JqZWN0UmVhZGVyKCkub3BlbihvYmopOwotCQlyZXR1cm4gbmV3IFN0cmluZyhsb2FkZXIuZ2V0Q2FjaGVkQnl0ZXMoKSwgVVRGXzgpOworCQlyZXR1cm4gbmV3IFN0cmluZyhsb2FkZXIuZ2V0Q2FjaGVkQnl0ZXMoKSwgQ0hBUlNFVCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CcmFuY2hDb25maWdUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZ1Rlc3QuamF2YQppbmRleCA4N2JiMDgyLi4xZWNkZjIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZ1Rlc3QuamF2YQpAQCAtMTYwLDcgKzE2MCw3IEBAIHB1YmxpYyB2b2lkIGlzUmViYXNlKCkgewogCQlhc3NlcnRUcnVlKG5ldyBCcmFuY2hDb25maWcoYywgInRydWUiKS5pc1JlYmFzZSgpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBDb25maWcgcGFyc2UoZmluYWwgU3RyaW5nIGNvbnRlbnQpIHsKKwlwcml2YXRlIHN0YXRpYyBDb25maWcgcGFyc2UoU3RyaW5nIGNvbnRlbnQpIHsKIAkJZmluYWwgQ29uZmlnIGMgPSBuZXcgQ29uZmlnKG51bGwpOwogCQl0cnkgewogCQkJYy5mcm9tVGV4dChjb250ZW50KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdUZXN0LmphdmEKaW5kZXggNzg2MjAwNS4uYzRjNGRhOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdUZXN0LmphdmEKQEAgLTkxNCwxMiArOTE0LDEyIEBAIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UmVhZExvbmcobG9uZyBleHAsIFN0cmluZyBhY3QpCiAJCWFzc2VydEVxdWFscyhleHAsIGMuZ2V0TG9uZygicyIsIG51bGwsICJhIiwgMEwpKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBDb25maWcgcGFyc2UoZmluYWwgU3RyaW5nIGNvbnRlbnQpCisJcHJpdmF0ZSBzdGF0aWMgQ29uZmlnIHBhcnNlKFN0cmluZyBjb250ZW50KQogCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlyZXR1cm4gcGFyc2UoY29udGVudCwgbnVsbCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgQ29uZmlnIHBhcnNlKGZpbmFsIFN0cmluZyBjb250ZW50LCBDb25maWcgYmFzZUNvbmZpZykKKwlwcml2YXRlIHN0YXRpYyBDb25maWcgcGFyc2UoU3RyaW5nIGNvbnRlbnQsIENvbmZpZyBiYXNlQ29uZmlnKQogCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlmaW5hbCBDb25maWcgYyA9IG5ldyBDb25maWcoYmFzZUNvbmZpZyk7CiAJCWMuZnJvbVRleHQoY29udGVudCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0RpckNhY2hlQ2hlY2tvdXRUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0RpckNhY2hlQ2hlY2tvdXRUZXN0LmphdmEKaW5kZXggMDQxMjI0Mi4uZWI4NzgyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EaXJDYWNoZUNoZWNrb3V0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvRGlyQ2FjaGVDaGVja291dFRlc3QuamF2YQpAQCAtNzgsOCArNzgsMTAgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LlRlc3RSZXBvc2l0b3J5OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnkuQnJhbmNoQnVpbGRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2Q29tbWl0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuQWJzdHJhY3RUcmVlSXRlcmF0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGs7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5Xb3JraW5nVHJlZUl0ZXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GUzsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzOwogaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CkBAIC0xOTA0LDYgKzE5MDYsMTE3IEBAIHB1YmxpYyB2b2lkIHRlc3RMb25nRmlsZW5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0VXBkYXRlZChsb25nRmlsZU5hbWUpOwogCX0KIAorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdElnbm9yZWREaXJlY3RvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRpZ25vcmUiLCAic3JjL2lnbm9yZWQiKTsKKwkJd3JpdGVUcmFzaEZpbGUoInNyYy9pZ25vcmVkL3N1Yi9mb28udHh0IiwgIjEiKTsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBjb21taXQgPSBnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkaW5nIC5naXRpZ25vcmUiKQorCQkJCQkuY2FsbCgpOworCQkJd3JpdGVUcmFzaEZpbGUoImZvby50eHQiLCAiMiIpOworCQkJd3JpdGVUcmFzaEZpbGUoInp6ei50eHQiLCAiMyIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCJmb28udHh0IikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZCBmaWxlIikuY2FsbCgpOworCQkJYXNzZXJ0RXF1YWxzKCJTaG91bGQgbm90IGhhdmUgZW50ZXJlZCBpZ25vcmVkIGRpcmVjdG9yeSIsIDEsCisJCQkJCXJlc2V0SGFyZEFuZENvdW50KGNvbW1pdCkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0SWdub3JlZERpcmVjdG9yeVdpdGhUcmFja2VkQ29udGVudCgpIHRocm93cyBFeGNlcHRpb24geworCQl3cml0ZVRyYXNoRmlsZSgic3JjL2lnbm9yZWQvc3ViL2Zvby50eHQiLCAiMSIpOworCQl0cnkgKEdpdCBnaXQgPSBuZXcgR2l0KGRiKSkgeworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQkJZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyBmb28udHh0IikuY2FsbCgpOworCQkJd3JpdGVUcmFzaEZpbGUoIi5naXRpZ25vcmUiLCAic3JjL2lnbm9yZWQiKTsKKwkJCXdyaXRlVHJhc2hGaWxlKCJzcmMvaWdub3JlZC9zdWIvZm9vLnR4dCIsICIyIik7CisJCQl3cml0ZVRyYXNoRmlsZSgic3JjL2lnbm9yZWQvb3RoZXIvYmFyLnR4dCIsICIzIik7CisJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oIi4iKS5jYWxsKCk7CisJCQlSZXZDb21taXQgY29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGluZyAuZ2l0aWdub3JlIikKKwkJCQkJLmNhbGwoKTsKKwkJCXdyaXRlVHJhc2hGaWxlKCJmb28udHh0IiwgIjIiKTsKKwkJCXdyaXRlVHJhc2hGaWxlKCJ6enoudHh0IiwgIjMiKTsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZm9vLnR4dCIpLmNhbGwoKTsKKwkJCWdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJhZGQgZmlsZSIpLmNhbGwoKTsKKwkJCUZpbGUgZmlsZSA9IHdyaXRlVHJhc2hGaWxlKCJzcmMvaWdub3JlZC9zdWIvZm9vLnR4dCIsICIzIik7CisJCQlhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIGVudGVyZWQgaWdub3JlZCBkaXJlY3RvcnkiLCAzLAorCQkJCQlyZXNldEhhcmRBbmRDb3VudChjb21taXQpKTsKKwkJCWNoZWNrRmlsZShmaWxlLCAiMiIpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0UmVzZXRXaXRoQ2hhbmdlSW5HaXRpZ25vcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJd3JpdGVUcmFzaEZpbGUoIi5naXRpZ25vcmUiLCAic3JjL2lnbm9yZWQiKTsKKwkJd3JpdGVUcmFzaEZpbGUoInNyYy9pZ25vcmVkL3N1Yi9mb28udHh0IiwgIjEiKTsKKwkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChkYikpIHsKKwkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiLiIpLmNhbGwoKTsKKwkJCVJldkNvbW1pdCBpbml0aWFsID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImluaXRpYWwiKS5jYWxsKCk7CisJCQl3cml0ZVRyYXNoRmlsZSgic3JjL25ld2lnbm9yZWQvZm9vLnR4dCIsICIyIik7CisJCQl3cml0ZVRyYXNoRmlsZSgic3JjLy5naXRpZ25vcmUiLCAibmV3aWdub3JlZCIpOworCQkJZ2l0LmFkZCgpLmFkZEZpbGVwYXR0ZXJuKCIuIikuY2FsbCgpOworCQkJUmV2Q29tbWl0IGNvbW1pdCA9IGdpdC5jb21taXQoKS5zZXRNZXNzYWdlKCJuZXdpZ25vcmVkIikuY2FsbCgpOworCQkJYXNzZXJ0RXF1YWxzKCJTaG91bGQgbm90IGhhdmUgZW50ZXJlZCBzcmMvbmV3aWdub3JlZCBkaXJlY3RvcnkiLCAxLAorCQkJCQlyZXNldEhhcmRBbmRDb3VudChpbml0aWFsKSk7CisJCQlhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIGVudGVyZWQgc3JjL25ld2lnbm9yZWQgZGlyZWN0b3J5IiwgMiwKKwkJCQkJcmVzZXRIYXJkQW5kQ291bnQoY29tbWl0KSk7CisJCQlkZWxldGVUcmFzaEZpbGUoInNyYy8uZ2l0aWdub3JlIik7CisJCQlnaXQucm0oKS5hZGRGaWxlcGF0dGVybigic3JjLy5naXRpZ25vcmUiKS5jYWxsKCk7CisJCQlSZXZDb21taXQgdG9wID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoIlVuaWdub3JlIG5ld2lnbm9yZSIpCisJCQkJCS5jYWxsKCk7CisJCQlhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIGVudGVyZWQgc3JjL25ld2lnbm9yZWQgZGlyZWN0b3J5IiwgMiwKKwkJCQkJcmVzZXRIYXJkQW5kQ291bnQoaW5pdGlhbCkpOworCQkJYXNzZXJ0RXF1YWxzKCJTaG91bGQgaGF2ZSBlbnRlcmVkIHNyYy9uZXdpZ25vcmVkIGRpcmVjdG9yeSIsIDIsCisJCQkJCXJlc2V0SGFyZEFuZENvdW50KGNvbW1pdCkpOworCQkJYXNzZXJ0RXF1YWxzKCJTaG91bGQgbm90IGhhdmUgZW50ZXJlZCBzcmMvbmV3aWdub3JlZCBkaXJlY3RvcnkiLCAxLAorCQkJCQlyZXNldEhhcmRBbmRDb3VudCh0b3ApKTsKKworCQl9CisJfQorCisJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdEZpbGVUcmVlSXRlcmF0b3IgZXh0ZW5kcyBGaWxlVHJlZUl0ZXJhdG9yIHsKKworCQkvLyBGb3IgYXNzZXJ0aW9ucyBvbmx5CisJCXByaXZhdGUgZmluYWwgaW50W10gY291bnQ7CisKKwkJcHVibGljIFRlc3RGaWxlVHJlZUl0ZXJhdG9yKFJlcG9zaXRvcnkgcmVwbywgaW50W10gY291bnQpIHsKKwkJCXN1cGVyKHJlcG8pOworCQkJdGhpcy5jb3VudCA9IGNvdW50OworCQl9CisKKwkJcHJvdGVjdGVkIFRlc3RGaWxlVHJlZUl0ZXJhdG9yKGZpbmFsIFdvcmtpbmdUcmVlSXRlcmF0b3IgcCwKKwkJCQlmaW5hbCBGaWxlIHJvb3QsIEZTIGZzLCBGaWxlTW9kZVN0cmF0ZWd5IGZpbGVNb2RlU3RyYXRlZ3ksCisJCQkJaW50W10gY291bnQpIHsKKwkJCXN1cGVyKHAsIHJvb3QsIGZzLCBmaWxlTW9kZVN0cmF0ZWd5KTsKKwkJCXRoaXMuY291bnQgPSBjb3VudDsKKwkJfQorCisJCUBPdmVycmlkZQorCQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IgZW50ZXJTdWJ0cmVlKCkgeworCQkJY291bnRbMF0gKz0gMTsKKwkJCXJldHVybiBuZXcgVGVzdEZpbGVUcmVlSXRlcmF0b3IodGhpcywKKwkJCQkJKChGaWxlRW50cnkpIGN1cnJlbnQoKSkuZ2V0RmlsZSgpLCBmcywgZmlsZU1vZGVTdHJhdGVneSwKKwkJCQkJY291bnQpOworCQl9CisJfQorCisJcHJpdmF0ZSBpbnQgcmVzZXRIYXJkQW5kQ291bnQoUmV2Q29tbWl0IGNvbW1pdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCWludFtdIGNhbGxDb3VudCA9IHsgMCB9OworCQlEaXJDYWNoZSBjYWNoZSA9IGRiLmxvY2tEaXJDYWNoZSgpOworCQlGaWxlVHJlZUl0ZXJhdG9yIHdvcmtpbmdUcmVlSXRlcmF0b3IgPSBuZXcgVGVzdEZpbGVUcmVlSXRlcmF0b3IoZGIsCisJCQkJY2FsbENvdW50KTsKKwkJdHJ5IHsKKwkJCURpckNhY2hlQ2hlY2tvdXQgY2hlY2tvdXQgPSBuZXcgRGlyQ2FjaGVDaGVja291dChkYiwgbnVsbCwgY2FjaGUsCisJCQkJCWNvbW1pdC5nZXRUcmVlKCkuZ2V0SWQoKSwgd29ya2luZ1RyZWVJdGVyYXRvcik7CisJCQljaGVja291dC5zZXRGYWlsT25Db25mbGljdChmYWxzZSk7CisJCQljaGVja291dC5jaGVja291dCgpOworCQl9IGZpbmFsbHkgeworCQkJY2FjaGUudW5sb2NrKCk7CisJCX0KKwkJcmV0dXJuIGNhbGxDb3VudFswXTsKKwl9CisKIAlwdWJsaWMgdm9pZCBhc3NlcnRXb3JrRGlyKE1hcDxTdHJpbmcsIFN0cmluZz4gaSkKIAkJCXRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmZUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0luZGV4RGlmZlRlc3QuamF2YQppbmRleCAyY2I4Zjg2Li41ODBiMDhiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0luZGV4RGlmZlRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL0luZGV4RGlmZlRlc3QuamF2YQpAQCAtNDcwLDcgKzQ3MCw4IEBAIHB1YmxpYyB2b2lkIHRlc3RVbnRyYWNrZWRGb2xkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJfQogCiAJLyoqCi0JICogVGVzdCB0aGF0IGlnbm9yZWQgZm9sZGVycyBhcmVuJ3QgbGlzdGVkIGFzIHVudHJhY2tlZAorCSAqIFRlc3QgdGhhdCBpZ25vcmVkIGZvbGRlcnMgYXJlbid0IGxpc3RlZCBhcyB1bnRyYWNrZWQsIGJ1dCBhcmUgbGlzdGVkIGFzCisJICogaWdub3JlZC4KIAkgKgogCSAqIEB0aHJvd3MgRXhjZXB0aW9uCiAJICovCkBAIC00OTksNiArNTAwLDggQEAgcHVibGljIHZvaWQgdGVzdFVudHJhY2tlZE5vdElnbm9yZWRGb2xkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQlkaWZmLmRpZmYoKTsKIAkJCWFzc2VydEVxdWFscyhuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoInNyYyIpKSwKIAkJCQkJZGlmZi5nZXRVbnRyYWNrZWRGb2xkZXJzKCkpOworCQkJYXNzZXJ0RXF1YWxzKG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgic3IiLCAidGFyZ2V0IikpLAorCQkJCQlkaWZmLmdldElnbm9yZWROb3RJbkluZGV4KCkpOwogCiAJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oInNyYyIpLmNhbGwoKTsKIAkJCXdyaXRlVHJhc2hGaWxlKCJzci9jb20vWDEuamF2YSIsICIiKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0Q2hlY2tlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0Q2hlY2tlclRlc3QuamF2YQppbmRleCBmNjg3OWI5Li4xYWIzNmYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdENoZWNrZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RDaGVja2VyVGVzdC5qYXZhCkBAIC00NSw3ICs0NSw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCiBpbXBvcnQgc3RhdGljIGphdmEubGFuZy5JbnRlZ2VyLnZhbHVlT2Y7Ci1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuSkdpdFRlc3RVdGlsLmNvbmNhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSkVDVF9JRF9MRU5HVEg7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQkFEOwpAQCAtMTU2MCw3ICsxNTYwLDcgQEAgcHVibGljIHZvaWQgdGVzdEludmFsaWRUcmVlRHVwbGljYXRlTmFtZXM1KCkKIAkJU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBBIik7CiAJCWVudHJ5KGIsICIxMDA2NDQgYSIpOwotCQlieXRlW10gZGF0YSA9IGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBkYXRhID0gYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpOwogCQljaGVja2VyLnNldFNhZmVGb3JXaW5kb3dzKHRydWUpOwogCQlhc3NlcnRDb3JydXB0KCJkdXBsaWNhdGUgZW50cnkgbmFtZXMiLCBPQkpfVFJFRSwgZGF0YSk7CiAJCWFzc2VydFNraXBMaXN0QWNjZXB0cyhPQkpfVFJFRSwgZGF0YSk7CkBAIC0xNTc0LDcgKzE1NzQsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRyZWVEdXBsaWNhdGVOYW1lczYoKQogCQlTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQllbnRyeShiLCAiMTAwNjQ0IEEiKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBhIik7Ci0JCWJ5dGVbXSBkYXRhID0gYi50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIGRhdGEgPSBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCWNoZWNrZXIuc2V0U2FmZUZvck1hY09TKHRydWUpOwogCQlhc3NlcnRDb3JydXB0KCJkdXBsaWNhdGUgZW50cnkgbmFtZXMiLCBPQkpfVFJFRSwgZGF0YSk7CiAJCWFzc2VydFNraXBMaXN0QWNjZXB0cyhPQkpfVFJFRSwgZGF0YSk7CkBAIC0xNTg4LDcgKzE1ODgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRyZWVEdXBsaWNhdGVOYW1lczcoKQogCQlTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQllbnRyeShiLCAiMTAwNjQ0IFx1MDA2NVx1MDMwMSIpOwogCQllbnRyeShiLCAiMTAwNjQ0IFx1MDBlOSIpOwotCQlieXRlW10gZGF0YSA9IGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSBkYXRhID0gYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpOwogCQljaGVja2VyLnNldFNhZmVGb3JNYWNPUyh0cnVlKTsKIAkJYXNzZXJ0Q29ycnVwdCgiZHVwbGljYXRlIGVudHJ5IG5hbWVzIiwgT0JKX1RSRUUsIGRhdGEpOwogCQlhc3NlcnRTa2lwTGlzdEFjY2VwdHMoT0JKX1RSRUUsIGRhdGEpOwpAQCAtMTYwMiw3ICsxNjAyLDcgQEAgcHVibGljIHZvaWQgdGVzdEludmFsaWRUcmVlRHVwbGljYXRlTmFtZXM4KCkKIAkJU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJZW50cnkoYiwgIjEwMDY0NCBBIik7CiAJCWNoZWNrZXIuc2V0U2FmZUZvck1hY09TKHRydWUpOwotCQljaGVja2VyLmNoZWNrVHJlZShiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJY2hlY2tlci5jaGVja1RyZWUoYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAl9CiAKIAlAVGVzdApAQCAtMTc2Miw3ICsxNzYyLDcgQEAgcHJpdmF0ZSB2b2lkIGFzc2VydFNraXBMaXN0UmVqZWN0cyhTdHJpbmcgbXNnLCBpbnQgdHlwZSwgYnl0ZVtdIGRhdGEpIHsKIAkJY2hlY2tlci5zZXRTa2lwTGlzdChudWxsKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBPYmplY3RJZFNldCBzZXQoZmluYWwgT2JqZWN0SWQuLi4gaWRzKSB7CisJcHJpdmF0ZSBzdGF0aWMgT2JqZWN0SWRTZXQgc2V0KE9iamVjdElkLi4uIGlkcykgewogCQlyZXR1cm4gbmV3IE9iamVjdElkU2V0KCkgewogCQkJQE92ZXJyaWRlCiAJCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhBbnlPYmplY3RJZCBvYmplY3RJZCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SYWN5R2l0VGVzdHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmFjeUdpdFRlc3RzLmphdmEKaW5kZXggOTIzNmI0ZS4uOGQ5Y2NhYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SYWN5R2l0VGVzdHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JhY3lHaXRUZXN0cy5qYXZhCkBAIC0xNzYsMTIgKzE3Niw5IEBAIHB1YmxpYyB2b2lkIHRlc3RSYWN5R2l0RGV0ZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIEZpbGUgYWRkVG9Xb3JrRGlyKFN0cmluZyBwYXRoLCBTdHJpbmcgY29udGVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRmlsZSBmID0gbmV3IEZpbGUoZGIuZ2V0V29ya1RyZWUoKSwgcGF0aCk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7Ci0JCXRyeSB7CisJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKSkgewogCQkJZm9zLndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORykpOwogCQkJcmV0dXJuIGY7Ci0JCX0gZmluYWxseSB7Ci0JCQlmb3MuY2xvc2UoKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZUZXN0LmphdmEKaW5kZXggN2ZiMzMwOS4uMjQ4MWU2NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZUZXN0LmphdmEKQEAgLTU3LDYgKzU3LDcgQEAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKIApAQCAtMjUzLDExICsyNTQsMTEgQEAgcHVibGljIHZvaWQgdGVzdFJlYWRMb29zZVBhY2tlZFJlZigpIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCUludGVycnVwdGVkRXhjZXB0aW9uIHsKIAkJUmVmIHJlZiA9IGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL21hc3RlciIpOwogCQlhc3NlcnRFcXVhbHMoU3RvcmFnZS5QQUNLRUQsIHJlZi5nZXRTdG9yYWdlKCkpOwotCQlGaWxlT3V0cHV0U3RyZWFtIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksCi0JCQkJInJlZnMvaGVhZHMvbWFzdGVyIikpOwotCQlvcy53cml0ZShyZWYuZ2V0T2JqZWN0SWQoKS5uYW1lKCkuZ2V0Qnl0ZXMoKSk7Ci0JCW9zLndyaXRlKCdcbicpOwotCQlvcy5jbG9zZSgpOworCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSgKKwkJCQluZXcgRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgInJlZnMvaGVhZHMvbWFzdGVyIikpKSB7CisJCQlvcy53cml0ZShyZWYuZ2V0T2JqZWN0SWQoKS5uYW1lKCkuZ2V0Qnl0ZXMoKSk7CisJCQlvcy53cml0ZSgnXG4nKTsKKwkJfQogCiAJCXJlZiA9IGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL21hc3RlciIpOwogCQlhc3NlcnRFcXVhbHMoU3RvcmFnZS5MT09TRSwgcmVmLmdldFN0b3JhZ2UoKSk7CkBAIC0zMDUsNCArMzA2LDI2IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlZFN5bVJlZigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWFzc2VydFNhbWUoZHN0LmdldFBlZWxlZE9iamVjdElkKCksIHJlZi5nZXRQZWVsZWRPYmplY3RJZCgpKTsKIAkJYXNzZXJ0RXF1YWxzKGRzdC5pc1BlZWxlZCgpLCByZWYuaXNQZWVsZWQoKSk7CiAJfQorCisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NvbnRhaW5zUmVmKExpc3Q8UmVmPiBoYXlzdGFjaywgUmVmIG5lZWRsZSkgeworCQlmb3IgKFJlZiByZWYgOiBoYXlzdGFjaykgeworCQkJaWYgKHJlZi5nZXROYW1lKCkuZXF1YWxzKG5lZWRsZS5nZXROYW1lKCkpICYmCisJCQkJCXJlZi5nZXRPYmplY3RJZCgpLmVxdWFscyhuZWVkbGUuZ2V0T2JqZWN0SWQoKSkpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJZmFpbCgibGlzdCAiICsgaGF5c3RhY2sgKyAiIGRvZXMgbm90IGNvbnRhaW4gcmVmICIgKyBuZWVkbGUpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEdldFJlZnNCeVByZWZpeCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUxpc3Q8UmVmPiByZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzQnlQcmVmaXgoInJlZnMvaGVhZHMvZyIpOworCQlhc3NlcnRFcXVhbHMoMiwgcmVmcy5zaXplKCkpOworCQljaGVja0NvbnRhaW5zUmVmKHJlZnMsIGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL2ciKSk7CisJCWNoZWNrQ29udGFpbnNSZWYocmVmcywgZGIuZXhhY3RSZWYoInJlZnMvaGVhZHMvZ2l0bGluayIpKTsKKworCQlyZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzQnlQcmVmaXgoInJlZnMvaGVhZHMvcHJlZml4LyIpOworCQlhc3NlcnRFcXVhbHMoMSwgcmVmcy5zaXplKCkpOworCQljaGVja0NvbnRhaW5zUmVmKHJlZnMsIGRiLmV4YWN0UmVmKCJyZWZzL2hlYWRzL3ByZWZpeC9hIikpOworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeUNhY2hlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGVUZXN0LmphdmEKaW5kZXggMTEwN2MyYy4uNThiMDA1YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5Q2FjaGVUZXN0LmphdmEKQEAgLTk0LDI0ICs5NCwyNSBAQCBwdWJsaWMgdm9pZCB0ZXN0QmFyZUZpbGVLZXkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RmlsZUtleU9wZW5FeGlzdGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlcG9zaXRvcnkgcjsKKwkJdHJ5IChSZXBvc2l0b3J5IHIgPSBuZXcgRmlsZUtleShkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSkKKwkJCQkub3Blbih0cnVlKSkgeworCQkJYXNzZXJ0Tm90TnVsbChyKTsKKwkJCWFzc2VydEVxdWFsc0ZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIHIuZ2V0RGlyZWN0b3J5KCkpOworCQl9CiAKLQkJciA9IG5ldyBGaWxlS2V5KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKS5vcGVuKHRydWUpOwotCQlhc3NlcnROb3ROdWxsKHIpOwotCQlhc3NlcnRFcXVhbHNGaWxlKGRiLmdldERpcmVjdG9yeSgpLCByLmdldERpcmVjdG9yeSgpKTsKLQkJci5jbG9zZSgpOwotCi0JCXIgPSBuZXcgRmlsZUtleShkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSkub3BlbihmYWxzZSk7Ci0JCWFzc2VydE5vdE51bGwocik7Ci0JCWFzc2VydEVxdWFsc0ZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIHIuZ2V0RGlyZWN0b3J5KCkpOwotCQlyLmNsb3NlKCk7CisJCXRyeSAoUmVwb3NpdG9yeSByID0gbmV3IEZpbGVLZXkoZGIuZ2V0RGlyZWN0b3J5KCksIGRiLmdldEZTKCkpCisJCQkJLm9wZW4oZmFsc2UpKSB7CisJCQlhc3NlcnROb3ROdWxsKHIpOworCQkJYXNzZXJ0RXF1YWxzRmlsZShkYi5nZXREaXJlY3RvcnkoKSwgci5nZXREaXJlY3RvcnkoKSk7CisJCX0KIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RGaWxlS2V5T3Blbk5ldygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIFJlcG9zaXRvcnkgbiA9IGNyZWF0ZVJlcG9zaXRvcnkodHJ1ZSwgZmFsc2UpOwotCQlmaW5hbCBGaWxlIGdpdGRpciA9IG4uZ2V0RGlyZWN0b3J5KCk7Ci0JCW4uY2xvc2UoKTsKKwkJRmlsZSBnaXRkaXI7CisJCXRyeSAoUmVwb3NpdG9yeSBuID0gY3JlYXRlUmVwb3NpdG9yeSh0cnVlLCBmYWxzZSkpIHsKKwkJCWdpdGRpciA9IG4uZ2V0RGlyZWN0b3J5KCk7CisJCX0KIAkJcmVjdXJzaXZlRGVsZXRlKGdpdGRpcik7CiAJCWFzc2VydEZhbHNlKGdpdGRpci5leGlzdHMoKSk7CiAKQEAgLTE0Myw2ICsxNDQsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGVSZWdpc3Rlck9wZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RDYWNoZU9wZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgRmlsZUtleSBsb2MgPSBGaWxlS2V5LmV4YWN0KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKTsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gV2UgYXJlIHRlc3RpbmcgdGhlIGNsb3NlKCkgbWV0aG9kCiAJCWZpbmFsIFJlcG9zaXRvcnkgZDIgPSBSZXBvc2l0b3J5Q2FjaGUub3Blbihsb2MpOwogCQlhc3NlcnROb3RTYW1lKGRiLCBkMik7CiAJCWFzc2VydFNhbWUoZDIsIFJlcG9zaXRvcnlDYWNoZS5vcGVuKEZpbGVLZXkuZXhhY3QobG9jLmdldEZpbGUoKSwgZGIuZ2V0RlMoKSkpKTsKQEAgLTE3Niw2ICsxNzgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VW5yZWdpc3RlcigpIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5VXNhZ2VDb3VudCgpIHRocm93cyBFeGNlcHRpb24gewogCQlGaWxlS2V5IGxvYyA9IEZpbGVLZXkuZXhhY3QoZGIuZ2V0RGlyZWN0b3J5KCksIGRiLmdldEZTKCkpOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSBkMiA9IFJlcG9zaXRvcnlDYWNoZS5vcGVuKGxvYyk7CiAJCWFzc2VydEVxdWFscygxLCBkMi51c2VDbnQuZ2V0KCkpOwogCQlSZXBvc2l0b3J5Q2FjaGUub3BlbihGaWxlS2V5LmV4YWN0KGxvYy5nZXRGaWxlKCksIGRiLmdldEZTKCkpKTsKQEAgLTE4OSw2ICsxOTIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0UmVwb3NpdG9yeVVzYWdlQ291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5VXNhZ2VDb3VudFdpdGhSZWdpc3RlcmVkUmVwb3NpdG9yeSgpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSByZXBvID0gY3JlYXRlUmVwb3NpdG9yeShmYWxzZSwgZmFsc2UpOwogCQlhc3NlcnRFcXVhbHMoMSwgcmVwby51c2VDbnQuZ2V0KCkpOwogCQlSZXBvc2l0b3J5Q2FjaGUucmVnaXN0ZXIocmVwbyk7CkBAIC0yMDAsNiArMjA0LDcgQEAgcHVibGljIHZvaWQgdGVzdFJlcG9zaXRvcnlVc2FnZUNvdW50V2l0aFJlZ2lzdGVyZWRSZXBvc2l0b3J5KCkKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5Tm90VW5yZWdpc3RlcmluZ1doZW5DbG9zaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUZpbGVLZXkgbG9jID0gRmlsZUtleS5leGFjdChkYi5nZXREaXJlY3RvcnkoKSwgZGIuZ2V0RlMoKSk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlSZXBvc2l0b3J5IGQyID0gUmVwb3NpdG9yeUNhY2hlLm9wZW4obG9jKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIGQyLnVzZUNudC5nZXQoKSk7CiAJCWFzc2VydFRoYXQoUmVwb3NpdG9yeUNhY2hlLmdldFJlZ2lzdGVyZWRLZXlzKCksCkBAIC0yMTQsNiArMjE5LDcgQEAgcHVibGljIHZvaWQgdGVzdFJlcG9zaXRvcnlOb3RVbnJlZ2lzdGVyaW5nV2hlbkNsb3NpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5VW5yZWdpc3RlcmluZ1doZW5FeHBpcmVkQW5kVXNhZ2VDb3VudE5lZ2F0aXZlKCkKIAkJCXRocm93cyBFeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSByZXBvQSA9IGNyZWF0ZUJhcmVSZXBvc2l0b3J5KCk7CiAJCVJlcG9zaXRvcnlDYWNoZS5yZWdpc3RlcihyZXBvQSk7CiAKQEAgLTIzNCw3ICsyNDAsOSBAQCBwdWJsaWMgdm9pZCB0ZXN0UmVwb3NpdG9yeVVucmVnaXN0ZXJpbmdXaGVuRXhwaXJlZEFuZFVzYWdlQ291bnROZWdhdGl2ZSgpCiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5VW5yZWdpc3RlcmluZ1doZW5FeHBpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlSZXBvc2l0b3J5IHJlcG9BID0gY3JlYXRlUmVwb3NpdG9yeSh0cnVlLCBmYWxzZSk7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFdlIGFyZSB0ZXN0aW5nIHRoZSBjbG9zZSgpIG1ldGhvZAogCQlSZXBvc2l0b3J5IHJlcG9CID0gY3JlYXRlUmVwb3NpdG9yeSh0cnVlLCBmYWxzZSk7CiAJCVJlcG9zaXRvcnkgcmVwb0MgPSBjcmVhdGVCYXJlUmVwb3NpdG9yeSgpOwogCQlSZXBvc2l0b3J5Q2FjaGUucmVnaXN0ZXIocmVwb0EpOwpAQCAtMjY4LDYgKzI3Niw3IEBAIHB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5VW5yZWdpc3RlcmluZ1doZW5FeHBpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSZWNvbmZpZ3VyZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJUmVwb3NpdG9yeSByZXBvID0gY3JlYXRlUmVwb3NpdG9yeShmYWxzZSwgZmFsc2UpOwogCQlSZXBvc2l0b3J5Q2FjaGUucmVnaXN0ZXIocmVwbyk7CiAJCWFzc2VydFRydWUoUmVwb3NpdG9yeUNhY2hlLmlzQ2FjaGVkKHJlcG8pKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeVJlc29sdmVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlSZXNvbHZlVGVzdC5qYXZhCmluZGV4IDFkMmE0ZTkuLjA1Yjc4ZWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeVJlc29sdmVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5UmVzb2x2ZVRlc3QuamF2YQpAQCAtMzI0LDYgKzMyNCw4IEBAIHB1YmxpYyB2b2lkIGludmFsaWROYW1lcygpIHRocm93cyBBbWJpZ3VvdXNPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RmFsc2UoUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZSgieC9hXFxiIikpOwogCQlhc3NlcnRGYWxzZShSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKCJ4L2FcdTAwMDAiKSk7CiAKKwkJZGIucmVzb2x2ZSgieC9hQCIpOworCiAJCWFzc2VydFVucGFyc2VhYmxlKCIuIik7CiAJCWFzc2VydFVucGFyc2VhYmxlKCJ4QHszIik7CiAJCWFzc2VydFVucGFyc2VhYmxlKCJ4W2IiKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9saWIvU3F1YXNoQ29tbWl0TXNnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9TcXVhc2hDb21taXRNc2dUZXN0LmphdmEKaW5kZXggM2JjZDc4Ny4uMjAzYzAwZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9TcXVhc2hDb21taXRNc2dUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9TcXVhc2hDb21taXRNc2dUZXN0LmphdmEKQEAgLTY2LDEyICs2Niw5IEBAIHB1YmxpYyB2b2lkIHRlc3RSZWFkV3JpdGVNZXJnZU1zZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWRiLndyaXRlU3F1YXNoQ29tbWl0TXNnKG51bGwpOwogCQlhc3NlcnRFcXVhbHMoZGIucmVhZFNxdWFzaENvbW1pdE1zZygpLCBudWxsKTsKIAkJYXNzZXJ0RmFsc2UobmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksIENvbnN0YW50cy5TUVVBU0hfTVNHKS5leGlzdHMoKSk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obmV3IEZpbGUoZGIuZ2V0RGlyZWN0b3J5KCksCi0JCQkJQ29uc3RhbnRzLlNRVUFTSF9NU0cpKTsKLQkJdHJ5IHsKKwkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKAorCQkJCW5ldyBGaWxlKGRiLmdldERpcmVjdG9yeSgpLCBDb25zdGFudHMuU1FVQVNIX01TRykpKSB7CiAJCQlmb3Mud3JpdGUoc3F1YXNoTXNnLmdldEJ5dGVzKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWZvcy5jbG9zZSgpOwogCQl9CiAJCWFzc2VydEVxdWFscyhkYi5yZWFkU3F1YXNoQ29tbWl0TXNnKCksIHNxdWFzaE1zZyk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9WYWxpZFJlZk5hbWVUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1ZhbGlkUmVmTmFtZVRlc3QuamF2YQppbmRleCBkNDMxYTg5Li44N2U5MDFmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1ZhbGlkUmVmTmFtZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbGliL1ZhbGlkUmVmTmFtZVRlc3QuamF2YQpAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgVmFsaWRSZWZOYW1lVGVzdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRWYWxpZChmaW5hbCBib29sZWFuIGV4cCwgZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFZhbGlkKGJvb2xlYW4gZXhwLCBTdHJpbmcgbmFtZSkgewogCQlTeXN0ZW1SZWFkZXIgaW5zdGFuY2UgPSBTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKTsKIAkJdHJ5IHsKIAkJCXNldFVuaXhTeXN0ZW1SZWFkZXIoKTsKQEAgLTgxLDcgKzgxLDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRVbml4U3lzdGVtUmVhZGVyKCkgewogCQl9KTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEludmFsaWRPbldpbmRvd3MoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEludmFsaWRPbldpbmRvd3MoU3RyaW5nIG5hbWUpIHsKIAkJU3lzdGVtUmVhZGVyIGluc3RhbmNlID0gU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCk7CiAJCXRyeSB7CiAJCQlzZXRVbml4U3lzdGVtUmVhZGVyKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvQ2hlcnJ5UGlja1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9DaGVycnlQaWNrVGVzdC5qYXZhCmluZGV4IDQ5NDhiMzcuLjE5ZjZkY2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9DaGVycnlQaWNrVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9DaGVycnlQaWNrVGVzdC5qYXZhCkBAIC0xODMsNyArMTgzLDcgQEAgcHVibGljIHZvaWQgdGVzdFJldmVydCgpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRGYWxzZSh0dy5uZXh0KCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdElkKGZpbmFsIERpckNhY2hlIHRyZWVULCBmaW5hbCBUcmVlV2FsayB0dykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdElkKERpckNhY2hlIHRyZWVULCBUcmVlV2FsayB0dykgewogCQlhc3NlcnRFcXVhbHModHJlZVQuZ2V0RW50cnkodHcuZ2V0UGF0aFN0cmluZygpKS5nZXRPYmplY3RJZCgpLCB0dwogCQkJCS5nZXRPYmplY3RJZCgwKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1JlY3Vyc2l2ZU1lcmdlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9Dcmlzc0Nyb3NzTWVyZ2VUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCA5OSUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1JlY3Vyc2l2ZU1lcmdlclRlc3QuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL0NyaXNzQ3Jvc3NNZXJnZVRlc3QuamF2YQppbmRleCAxOTAyMjRhLi5hYWEwOGE5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVjdXJzaXZlTWVyZ2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9Dcmlzc0Nyb3NzTWVyZ2VUZXN0LmphdmEKQEAgLTgzLDcgKzgzLDcgQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIEBSdW5XaXRoKFRoZW9yaWVzLmNsYXNzKQotcHVibGljIGNsYXNzIFJlY3Vyc2l2ZU1lcmdlclRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgeworcHVibGljIGNsYXNzIENyaXNzQ3Jvc3NNZXJnZVRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgewogCXN0YXRpYyBpbnQgY291bnRlciA9IDA7CiAKIAlARGF0YVBvaW50cwpAQCAtNzgzLDcgKzc4Myw3IEBAIHZvaWQgbW9kaWZ5SW5kZXgoSW5kZXhTdGF0ZSBpbmRleFN0YXRlLCBTdHJpbmcgcGF0aCwgU3RyaW5nIG90aGVyKQogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNldEluZGV4KGZpbmFsIE9iamVjdElkIGlkLCBTdHJpbmcgcGF0aCkKKwlwcml2YXRlIHZvaWQgc2V0SW5kZXgoT2JqZWN0SWQgaWQsIFN0cmluZyBwYXRoKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJRGlyQ2FjaGUgbG9ja2VkRGlyY2FjaGU7CiAJCURpckNhY2hlRWRpdG9yIGRjZWRpdDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlclRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBvcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlclRlc3QuamF2YQpyZW5hbWUgdG8gb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlclRlc3QuamF2YQppbmRleCA5MzIyYTQ3Li41ODA5M2EzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5tZXJnZTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0JMT0I7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwpAQCAtOTEsMTkgKzkxLDE3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzLkRhdGFQb2ludDsKK2ltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzLkRhdGFQb2ludHM7CiBpbXBvcnQgb3JnLmp1bml0LmV4cGVyaW1lbnRhbC50aGVvcmllcy5UaGVvcmllczsKIGltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzLlRoZW9yeTsKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiAKIEBSdW5XaXRoKFRoZW9yaWVzLmNsYXNzKQotcHVibGljIGNsYXNzIFJlc29sdmVNZXJnZXJUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKK3B1YmxpYyBjbGFzcyBNZXJnZXJUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAotCUBEYXRhUG9pbnQKLQlwdWJsaWMgc3RhdGljIE1lcmdlU3RyYXRlZ3kgcmVzb2x2ZSA9IE1lcmdlU3RyYXRlZ3kuUkVTT0xWRTsKLQotCUBEYXRhUG9pbnQKLQlwdWJsaWMgc3RhdGljIE1lcmdlU3RyYXRlZ3kgcmVjdXJzaXZlID0gTWVyZ2VTdHJhdGVneS5SRUNVUlNJVkU7CisJQERhdGFQb2ludHMKKwlwdWJsaWMgc3RhdGljIE1lcmdlU3RyYXRlZ3lbXSBzdHJhdGVnaWVzVW5kZXJUZXN0ID0gbmV3IE1lcmdlU3RyYXRlZ3lbXSB7CisJCQlNZXJnZVN0cmF0ZWd5LlJFQ1VSU0lWRSwgTWVyZ2VTdHJhdGVneS5SRVNPTFZFIH07CiAKIAlAVGhlb3J5CiAJcHVibGljIHZvaWQgZmFpbGluZ0RlbGV0ZU9mRGlyZWN0b3J5V2l0aFVudHJhY2tlZENvbnRlbnQoCkBAIC03NTYsNyArNzU0LDcgQEAgcHVibGljIHZvaWQgY2hlY2tDb250ZW50TWVyZ2VMYXJnZUJpbmFyaWVzKE1lcmdlU3RyYXRlZ3kgc3RyYXRlZ3kpIHRocm93cyBFeGNlcHQKIAkJfQogCQliaW5hcnlbNTBdID0gJ1wwJzsKIAotCQl3cml0ZVRyYXNoRmlsZSgiZmlsZSIsIG5ldyBTdHJpbmcoYmluYXJ5LCBVVEZfOCkpOworCQl3cml0ZVRyYXNoRmlsZSgiZmlsZSIsIG5ldyBTdHJpbmcoYmluYXJ5LCBDSEFSU0VUKSk7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZmlsZSIpLmNhbGwoKTsKIAkJUmV2Q29tbWl0IGZpcnN0ID0gZ2l0LmNvbW1pdCgpLnNldE1lc3NhZ2UoImFkZGVkIGZpbGUiKS5jYWxsKCk7CiAKQEAgLTc2NCw3ICs3NjIsNyBAQCBwdWJsaWMgdm9pZCBjaGVja0NvbnRlbnRNZXJnZUxhcmdlQmluYXJpZXMoTWVyZ2VTdHJhdGVneSBzdHJhdGVneSkgdGhyb3dzIEV4Y2VwdAogCQlpbnQgaWR4ID0gTElORUxFTiAqIDEyMDAgKyAxOwogCQlieXRlIHNhdmUgPSBiaW5hcnlbaWR4XTsKIAkJYmluYXJ5W2lkeF0gPSAnQCc7Ci0JCXdyaXRlVHJhc2hGaWxlKCJmaWxlIiwgbmV3IFN0cmluZyhiaW5hcnksIFVURl84KSk7CisJCXdyaXRlVHJhc2hGaWxlKCJmaWxlIiwgbmV3IFN0cmluZyhiaW5hcnksIENIQVJTRVQpKTsKIAogCQliaW5hcnlbaWR4XSA9IHNhdmU7CiAJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybigiZmlsZSIpLmNhbGwoKTsKQEAgLTc3Myw3ICs3NzEsNyBAQCBwdWJsaWMgdm9pZCBjaGVja0NvbnRlbnRNZXJnZUxhcmdlQmluYXJpZXMoTWVyZ2VTdHJhdGVneSBzdHJhdGVneSkgdGhyb3dzIEV4Y2VwdAogCiAJCWdpdC5jaGVja291dCgpLnNldENyZWF0ZUJyYW5jaCh0cnVlKS5zZXRTdGFydFBvaW50KGZpcnN0KS5zZXROYW1lKCJzaWRlIikuY2FsbCgpOwogCQliaW5hcnlbTElORUxFTiAqIDE1MDAgKyAxXSA9ICchJzsKLQkJd3JpdGVUcmFzaEZpbGUoImZpbGUiLCBuZXcgU3RyaW5nKGJpbmFyeSwgVVRGXzgpKTsKKwkJd3JpdGVUcmFzaEZpbGUoImZpbGUiLCBuZXcgU3RyaW5nKGJpbmFyeSwgQ0hBUlNFVCkpOwogCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4oImZpbGUiKS5jYWxsKCk7CiAJCVJldkNvbW1pdCBzaWRlQ29tbWl0ID0gZ2l0LmNvbW1pdCgpLnNldEFsbCh0cnVlKQogCQkJLnNldE1lc3NhZ2UoIm1vZGlmaWVkIGZpbGUgbCAxNTAwIikuY2FsbCgpOwpAQCAtOTM1LDcgKzkzMyw3IEBAIHB1YmxpYyB2b2lkIGNoZWNrQ29udGVudE1lcmdlQ29uZmxpY3Rfbm9UcmVlKE1lcmdlU3RyYXRlZ3kgc3RyYXRlZ3kpCiAJCQltZXJnZXIuZ2V0TWVyZ2VSZXN1bHRzKCkuZ2V0KCJmaWxlIik7CiAJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQlmbXQuZm9ybWF0TWVyZ2Uob3V0LCBtZXJnZXIuZ2V0TWVyZ2VSZXN1bHRzKCkuZ2V0KCJmaWxlIiksCi0JCQkJCQkiQkFTRSIsICJPVVJTIiwgIlRIRUlSUyIsIFVURl84Lm5hbWUoKSk7CisJCQkJCQkiQkFTRSIsICJPVVJTIiwgIlRIRUlSUyIsIENIQVJTRVQubmFtZSgpKTsKIAkJCQlTdHJpbmcgZXhwZWN0ZWQgPSAiPDw8PDw8PCBPVVJTXG4iCiAJCQkJCQkrICIxbWFzdGVyXG4iCiAJCQkJCQkrICI9PT09PT09XG4iCkBAIC05NDMsNyArOTQxLDcgQEAgcHVibGljIHZvaWQgY2hlY2tDb250ZW50TWVyZ2VDb25mbGljdF9ub1RyZWUoTWVyZ2VTdHJhdGVneSBzdHJhdGVneSkKIAkJCQkJCSsgIj4+Pj4+Pj4gVEhFSVJTXG4iCiAJCQkJCQkrICIyXG4iCiAJCQkJCQkrICIzIjsKLQkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIG5ldyBTdHJpbmcob3V0LnRvQnl0ZUFycmF5KCksIFVURl84KSk7CisJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBuZXcgU3RyaW5nKG91dC50b0J5dGVBcnJheSgpLCBDSEFSU0VUKSk7CiAJCQl9CiAJCX0KIAl9CkBAIC0xMDMzLDE5ICsxMDMxLDIxIEBAIHB1YmxpYyB2b2lkIGNoZWNrTG9ja2VkRmlsZXNUb0JlRGVsZXRlZChNZXJnZVN0cmF0ZWd5IHN0cmF0ZWd5KQogCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZSgiYWRkZWQgYy50eHQiKS5jYWxsKCk7CiAKIAkJLy8gR2V0IGEgaGFuZGxlIHRvIHRoZSB0aGUgZmlsZSBzbyBvbiB3aW5kb3dzIGl0IGNhbid0IGJlIGRlbGV0ZWQuCi0JCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksCi0JCQkJImIudHh0IikpOwotCQlNZXJnZVJlc3VsdCBtZXJnZVJlcyA9IGdpdC5tZXJnZSgpLnNldFN0cmF0ZWd5KHN0cmF0ZWd5KQotCQkJCS5pbmNsdWRlKG1hc3RlckNvbW1pdCkuY2FsbCgpOwotCQlpZiAobWVyZ2VSZXMuZ2V0TWVyZ2VTdGF0dXMoKS5lcXVhbHMoTWVyZ2VTdGF0dXMuRkFJTEVEKSkgewotCQkJLy8gcHJvYmFibHkgd2luZG93cwotCQkJYXNzZXJ0RXF1YWxzKDEsIG1lcmdlUmVzLmdldEZhaWxpbmdQYXRocygpLnNpemUoKSk7Ci0JCQlhc3NlcnRFcXVhbHMoTWVyZ2VGYWlsdXJlUmVhc29uLkNPVUxEX05PVF9ERUxFVEUsIG1lcmdlUmVzCi0JCQkJCS5nZXRGYWlsaW5nUGF0aHMoKS5nZXQoImIudHh0IikpOworCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKAorCQkJCW5ldyBGaWxlKGRiLmdldFdvcmtUcmVlKCksICJiLnR4dCIpKSkgeworCQkJTWVyZ2VSZXN1bHQgbWVyZ2VSZXMgPSBnaXQubWVyZ2UoKS5zZXRTdHJhdGVneShzdHJhdGVneSkKKwkJCQkJLmluY2x1ZGUobWFzdGVyQ29tbWl0KS5jYWxsKCk7CisJCQlpZiAobWVyZ2VSZXMuZ2V0TWVyZ2VTdGF0dXMoKS5lcXVhbHMoTWVyZ2VTdGF0dXMuRkFJTEVEKSkgeworCQkJCS8vIHByb2JhYmx5IHdpbmRvd3MKKwkJCQlhc3NlcnRFcXVhbHMoMSwgbWVyZ2VSZXMuZ2V0RmFpbGluZ1BhdGhzKCkuc2l6ZSgpKTsKKwkJCQlhc3NlcnRFcXVhbHMoTWVyZ2VGYWlsdXJlUmVhc29uLkNPVUxEX05PVF9ERUxFVEUsCisJCQkJCQltZXJnZVJlcy5nZXRGYWlsaW5nUGF0aHMoKS5nZXQoImIudHh0IikpOworCQkJfQorCQkJYXNzZXJ0RXF1YWxzKAorCQkJCQkiW2EudHh0LCBtb2RlOjEwMDY0NCwgY29udGVudDptYXN0ZXJdIgorCQkJCQkJCSsgIltjLnR4dCwgbW9kZToxMDA2NDQsIGNvbnRlbnQ6c2lkZV0iLAorCQkJCQlpbmRleFN0YXRlKENPTlRFTlQpKTsKIAkJfQotCQlhc3NlcnRFcXVhbHMoIlthLnR4dCwgbW9kZToxMDA2NDQsIGNvbnRlbnQ6bWFzdGVyXSIKLQkJCQkrICJbYy50eHQsIG1vZGU6MTAwNjQ0LCBjb250ZW50OnNpZGVdIiwgaW5kZXhTdGF0ZShDT05URU5UKSk7Ci0JCWZpcy5jbG9zZSgpOwogCX0KIAogCUBUaGVvcnkKQEAgLTEzMjgsNiArMTMyOCw2IEBAIHByaXZhdGUgU3RyaW5nIHJlYWRCbG9iKE9iamVjdElkIHRyZWVpc2gsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJaWYgKG9iaiA9PSBudWxsKSB7CiAJCQlyZXR1cm4gbnVsbDsKIAkJfQotCQlyZXR1cm4gbmV3IFN0cmluZyhydy5nZXRPYmplY3RSZWFkZXIoKS5vcGVuKG9iaiwgT0JKX0JMT0IpLmdldEJ5dGVzKCksIFVURl84KTsKKwkJcmV0dXJuIG5ldyBTdHJpbmcocncuZ2V0T2JqZWN0UmVhZGVyKCkub3BlbihvYmosIE9CSl9CTE9CKS5nZXRCeXRlcygpLCBDSEFSU0VUKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU2ltcGxlTWVyZ2VUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU2ltcGxlTWVyZ2VUZXN0LmphdmEKaW5kZXggOTUxNTY4ZS4uZGQyYzJlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1NpbXBsZU1lcmdlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9TaW1wbGVNZXJnZVRlc3QuamF2YQpAQCAtNDAzLDcgKzQwMyw3IEBAIHB1YmxpYyB2b2lkIHRlc3RUcml2aWFsVHdvV2F5X3JpZ2h0REZjb25mbGljdDIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RmFsc2UobWVyZ2UpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdElkKGZpbmFsIERpckNhY2hlIHRyZWVULCBmaW5hbCBUcmVlV2FsayB0dykgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0Q29ycmVjdElkKERpckNhY2hlIHRyZWVULCBUcmVlV2FsayB0dykgewogCQlhc3NlcnRFcXVhbHModHJlZVQuZ2V0RW50cnkodHcuZ2V0UGF0aFN0cmluZygpKS5nZXRPYmplY3RJZCgpLCB0dwogCQkJCS5nZXRPYmplY3RJZCgwKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VkaXRMaXN0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0VkaXRMaXN0VGVzdC5qYXZhCmluZGV4IDYwMjdhZmYuLjZjMTA3ZjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9FZGl0TGlzdFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRWRpdExpc3RUZXN0LmphdmEKQEAgLTg5LDcgKzg5LDcgQEAgcHVibGljIHZvaWQgdGVzdFR5cGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKG5ldyBFZGl0KDIzIC0gMSwgMjUgLSAxLCAyMiAtIDEsIDI4IC0gMSksIGUuZ2V0KDIpKTsKIAl9CiAKLQlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZShmaW5hbCBTdHJpbmcgcGF0Y2hGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgUGF0Y2ggcGFyc2VUZXN0UGF0Y2hGaWxlKFN0cmluZyBwYXRjaEZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKSkgewogCQkJaWYgKGluID09IG51bGwpIHsKIAkJCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0ZpbGVIZWFkZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlclRlc3QuamF2YQppbmRleCA3YjRlMDE0Li4yNGZiZGExIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlclRlc3QuamF2YQpAQCAtNDMzLDMwICs0MzMsMzAgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlQWJickluZGV4TGluZV9Ob01vZGUoKSB7CiAJCWFzc2VydFRydWUoT2JqZWN0SWQuZnJvbVN0cmluZyhuaWQpLnN0YXJ0c1dpdGgoZmguZ2V0TmV3SWQoKSkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UGFyc2UoZmluYWwgRmlsZUhlYWRlciBmaCkgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UGFyc2UoRmlsZUhlYWRlciBmaCkgewogCQlpbnQgcHRyID0gZmgucGFyc2VHaXRGaWxlTmFtZSgwLCBmaC5idWYubGVuZ3RoKTsKIAkJYXNzZXJ0VHJ1ZShwdHIgPiAwKTsKIAkJcHRyID0gZmgucGFyc2VHaXRIZWFkZXJzKHB0ciwgZmguYnVmLmxlbmd0aCk7CiAJCWFzc2VydFRydWUocHRyID4gMCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZUhlYWRlciBkYXRhKGZpbmFsIFN0cmluZyBpbikgeworCXByaXZhdGUgc3RhdGljIEZpbGVIZWFkZXIgZGF0YShTdHJpbmcgaW4pIHsKIAkJcmV0dXJuIG5ldyBGaWxlSGVhZGVyKENvbnN0YW50cy5lbmNvZGVBU0NJSShpbiksIDApOwogCX0KIAotCXByaXZhdGUgc3RhdGljIEZpbGVIZWFkZXIgaGVhZGVyKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHJpdmF0ZSBzdGF0aWMgRmlsZUhlYWRlciBoZWFkZXIoU3RyaW5nIHBhdGgpIHsKIAkJcmV0dXJuIGRhdGEoZ2l0TGluZShwYXRoKSArICItLS0gIiArIHBhdGggKyAiXG4iKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2l0TGluZShmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBnaXRMaW5lKFN0cmluZyBwYXRoKSB7CiAJCXJldHVybiAiYS8iICsgcGF0aCArICIgYi8iICsgcGF0aCArICJcbiI7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgRmlsZUhlYWRlciBkcUhlYWRlcihmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByaXZhdGUgc3RhdGljIEZpbGVIZWFkZXIgZHFIZWFkZXIoU3RyaW5nIHBhdGgpIHsKIAkJcmV0dXJuIGRhdGEoZHFHaXRMaW5lKHBhdGgpICsgIi0tLSAiICsgcGF0aCArICJcbiIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkcUdpdExpbmUoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZHFHaXRMaW5lKFN0cmluZyBwYXRoKSB7CiAJCXJldHVybiAiXCJhLyIgKyBwYXRoICsgIlwiIFwiYi8iICsgcGF0aCArICJcIlxuIjsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvR2V0VGV4dFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9HZXRUZXh0VGVzdC5qYXZhCmluZGV4IDY1Mzc1YzcuLjdiNTg2OGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9HZXRUZXh0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9HZXRUZXh0VGVzdC5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucGF0Y2g7CiAKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzE7Ci1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKQEAgLTgzLDcgKzgzLDcgQEAgcHVibGljIHZvaWQgdGVzdEdldFRleHRfTm9CaW5hcnkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEdldFRleHRfQ29udmVydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIENoYXJzZXQgY3NPbGQgPSBJU09fODg1OV8xOwotCQlmaW5hbCBDaGFyc2V0IGNzTmV3ID0gVVRGXzg7CisJCWZpbmFsIENoYXJzZXQgY3NOZXcgPSBDSEFSU0VUOwogCQlmaW5hbCBQYXRjaCBwID0gcGFyc2VUZXN0UGF0Y2hGaWxlKCk7CiAJCWFzc2VydFRydWUocC5nZXRFcnJvcnMoKS5pc0VtcHR5KCkpOwogCQlhc3NlcnRFcXVhbHMoMSwgcC5nZXRGaWxlcygpLnNpemUoKSk7CkBAIC0xMDMsNyArMTAzLDcgQEAgcHVibGljIHZvaWQgdGVzdEdldFRleHRfQ29udmVydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0R2V0VGV4dF9EaWZmQ2MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBDaGFyc2V0IGNzT2xkID0gSVNPXzg4NTlfMTsKLQkJZmluYWwgQ2hhcnNldCBjc05ldyA9IFVURl84OworCQlmaW5hbCBDaGFyc2V0IGNzTmV3ID0gQ0hBUlNFVDsKIAkJZmluYWwgUGF0Y2ggcCA9IHBhcnNlVGVzdFBhdGNoRmlsZSgpOwogCQlhc3NlcnRUcnVlKHAuZ2V0RXJyb3JzKCkuaXNFbXB0eSgpKTsKIAkJYXNzZXJ0RXF1YWxzKDEsIHAuZ2V0RmlsZXMoKS5zaXplKCkpOwpAQCAtMTM0LDcgKzEzNCw3IEBAIHByaXZhdGUgUGF0Y2ggcGFyc2VUZXN0UGF0Y2hGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgU3RyaW5nIHJlYWRUZXN0UGF0Y2hGaWxlKGZpbmFsIENoYXJzZXQgY3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgcmVhZFRlc3RQYXRjaEZpbGUoQ2hhcnNldCBjcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHBhdGNoRmlsZSA9IEpHaXRUZXN0VXRpbC5nZXROYW1lKCkgKyAiLnBhdGNoIjsKIAkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRjaEZpbGUpKSB7CiAJCQlpZiAoaW4gPT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoQ2NFcnJvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaENjRXJyb3JUZXN0LmphdmEKaW5kZXggZTRiNDMxNy4uNjk4OTM0MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoQ2NFcnJvclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY0Vycm9yVGVzdC5qYXZhCkBAIC05NiwxNyArOTYsMTQgQEAgcHVibGljIHZvaWQgdGVzdEVycm9yX0NjVHJ1bmNhdGVkT2xkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCXByaXZhdGUgUGF0Y2ggcGFyc2VUZXN0UGF0Y2hGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHBhdGNoRmlsZSA9IEpHaXRUZXN0VXRpbC5nZXROYW1lKCkgKyAiLnBhdGNoIjsKLQkJZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKTsKLQkJaWYgKGluID09IG51bGwpIHsKLQkJCWZhaWwoIk5vICIgKyBwYXRjaEZpbGUgKyAiIHRlc3QgdmVjdG9yIik7Ci0JCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucwotCQl9Ci0JCXRyeSB7CisJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0ocGF0Y2hGaWxlKSkgeworCQkJaWYgKGluID09IG51bGwpIHsKKwkJCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOworCQkJCXJldHVybiBudWxsOyAvLyBOZXZlciBoYXBwZW5zCisJCQl9CiAJCQlmaW5hbCBQYXRjaCBwID0gbmV3IFBhdGNoKCk7CiAJCQlwLnBhcnNlKGluKTsKIAkJCXJldHVybiBwOwotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoQ2NUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY1Rlc3QuamF2YQppbmRleCA4Mzc0MTRiLi40YTI2ZDUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hDY1Rlc3QuamF2YQpAQCAtMTk5LDE3ICsxOTksMTQgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX0NjRGVsZXRlRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBwYXRjaEZpbGUgPSBKR2l0VGVzdFV0aWwuZ2V0TmFtZSgpICsgIi5wYXRjaCI7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSk7Ci0JCWlmIChpbiA9PSBudWxsKSB7Ci0JCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwotCQkJcmV0dXJuIG51bGw7IC8vIE5ldmVyIGhhcHBlbnMKLQkJfQotCQl0cnkgeworCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKKwkJCWlmIChpbiA9PSBudWxsKSB7CisJCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucworCQkJfQogCQkJZmluYWwgUGF0Y2ggcCA9IG5ldyBQYXRjaCgpOwogCQkJcC5wYXJzZShpbik7CiAJCQlyZXR1cm4gcDsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hFcnJvclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaEVycm9yVGVzdC5qYXZhCmluZGV4IDUyZTM4NzQuLjNiZGY4NTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaEVycm9yVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaEVycm9yVGVzdC5qYXZhCkBAIC0xNzcsMTcgKzE3NywxNCBAQCBwdWJsaWMgdm9pZCB0ZXN0RXJyb3JfR2l0QmluYXJ5Tm9Gb3J3YXJkSHVuaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBwYXRjaEZpbGUgPSBKR2l0VGVzdFV0aWwuZ2V0TmFtZSgpICsgIi5wYXRjaCI7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSk7Ci0JCWlmIChpbiA9PSBudWxsKSB7Ci0JCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwotCQkJcmV0dXJuIG51bGw7IC8vIE5ldmVyIGhhcHBlbnMKLQkJfQotCQl0cnkgeworCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKKwkJCWlmIChpbiA9PSBudWxsKSB7CisJCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucworCQkJfQogCQkJZmluYWwgUGF0Y2ggcCA9IG5ldyBQYXRjaCgpOwogCQkJcC5wYXJzZShpbik7CiAJCQlyZXR1cm4gcDsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2hUZXN0LmphdmEKaW5kZXggOWY1N2FiOS4uNmEwOWE0OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaFRlc3QuamF2YQpAQCAtMzU3LDE3ICszNTcsMTQgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX0FkZE5vTmV3bGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIFBhdGNoIHBhcnNlVGVzdFBhdGNoRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBwYXRjaEZpbGUgPSBKR2l0VGVzdFV0aWwuZ2V0TmFtZSgpICsgIi5wYXRjaCI7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSk7Ci0JCWlmIChpbiA9PSBudWxsKSB7Ci0JCQlmYWlsKCJObyAiICsgcGF0Y2hGaWxlICsgIiB0ZXN0IHZlY3RvciIpOwotCQkJcmV0dXJuIG51bGw7IC8vIE5ldmVyIGhhcHBlbnMKLQkJfQotCQl0cnkgeworCQl0cnkgKElucHV0U3RyZWFtIGluID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHBhdGNoRmlsZSkpIHsKKwkJCWlmIChpbiA9PSBudWxsKSB7CisJCQkJZmFpbCgiTm8gIiArIHBhdGNoRmlsZSArICIgdGVzdCB2ZWN0b3IiKTsKKwkJCQlyZXR1cm4gbnVsbDsgLy8gTmV2ZXIgaGFwcGVucworCQkJfQogCQkJZmluYWwgUGF0Y2ggcCA9IG5ldyBQYXRjaCgpOwogCQkJcC5wYXJzZShpbik7CiAJCQlyZXR1cm4gcDsKLQkJfSBmaW5hbGx5IHsKLQkJCWluLmNsb3NlKCk7CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJMaW5lVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyTGluZVRlc3QuamF2YQppbmRleCA4N2M4NTQ3Li5hZDgzMjdmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJMaW5lVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlckxpbmVUZXN0LmphdmEKQEAgLTM1Myw3ICszNTMsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hlc0J1Z0lkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RmFsc2UoIm5vdCBDQyIsIGxpbmUubWF0Y2hlcyhGb290ZXJLZXkuQ0MpKTsKIAl9CiAKLQlwcml2YXRlIFJldkNvbW1pdCBwYXJzZShmaW5hbCBTdHJpbmcgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgUmV2Q29tbWl0IHBhcnNlKFN0cmluZyBtc2cpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJYnVmLmFwcGVuZCgidHJlZSAiICsgT2JqZWN0SWQuemVyb0lkKCkubmFtZSgpICsgIlxuIik7CiAJCWJ1Zi5hcHBlbmQoImF1dGhvciBBLiBVLiBUaG9yIDxhQGV4YW1wbGUuY29tPiAxICswMDAwXG4iKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdFBhcnNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0UGFyc2VUZXN0LmphdmEKaW5kZXggODhmMjQwYi4uY2ZlZmFjMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0UGFyc2VUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0UGFyc2VUZXN0LmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrOwogCiBpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5JU09fODg1OV8xOwotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CkBAIC0xMTQsNyArMTE0LDcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX05vUGFyZW50cygpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnROdWxsKGMuZ2V0VHJlZSgpKTsKIAkJYXNzZXJ0TnVsbChjLnBhcmVudHMpOwogCi0JCWMucGFyc2VDYW5vbmljYWwocncsIGJvZHkudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKHJ3LCBib2R5LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlhc3NlcnROb3ROdWxsKGMuZ2V0VHJlZSgpKTsKIAkJYXNzZXJ0RXF1YWxzKHRyZWVJZCwgYy5nZXRUcmVlKCkuZ2V0SWQoKSk7CiAJCWFzc2VydFNhbWUocncubG9va3VwVHJlZSh0cmVlSWQpLCBjLmdldFRyZWUoKSk7CkBAIC0xMzgsNyArMTM4LDcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX05vUGFyZW50cygpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoVGltZVpvbmUuZ2V0VGltZVpvbmUoIkdNVCIgKyBjb21taXR0ZXJUaW1lWm9uZSksIGNDb21taXR0ZXIuZ2V0VGltZVpvbmUoKSk7CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgY3JlYXRlKGZpbmFsIFN0cmluZyBtc2cpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgUmV2Q29tbWl0IGNyZWF0ZShTdHJpbmcgbXNnKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJYi5hcHBlbmQoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIik7CiAJCWIuYXBwZW5kKCJhdXRob3IgQSBVLiBUaG9yIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIik7CkBAIC0xNDgsNyArMTQ4LDcgQEAgcHJpdmF0ZSBSZXZDb21taXQgY3JlYXRlKGZpbmFsIFN0cmluZyBtc2cpIHRocm93cyBFeGNlcHRpb24gewogCiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKLQkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJcmV0dXJuIGM7CiAJfQogCkBAIC0xNjEsNyArMTYxLDcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX1dlaXJkSGVhZGVyT25seUNvbW1pdCgpIHRocm93cyBFeGNlcHRpb24gewogCiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKLQkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQlhc3NlcnRFcXVhbHMoIiIsIGMuZ2V0RnVsbE1lc3NhZ2UoKSk7CiAJCWFzc2VydEVxdWFscygiIiwgYy5nZXRTaG9ydE1lc3NhZ2UoKSk7CkBAIC0xNzYsNyArMTc2LDcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2luY29tcGxldGVBdXRob3JBbmRDb21taXR0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQlmaW5hbCBSZXZDb21taXQgYzsKIAkJYyA9IG5ldyBSZXZDb21taXQoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7Ci0JCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJYXNzZXJ0RXF1YWxzKG5ldyBQZXJzb25JZGVudCgiIiwgImFfdV90aG9yQGV4YW1wbGUuY29tIiwgMTIxODEyMzM4NzAwMGwsIDcpLCBjLmdldEF1dGhvcklkZW50KCkpOwogCQlhc3NlcnRFcXVhbHMobmV3IFBlcnNvbklkZW50KCIiLCAiIiwgMTIxODEyMzM5MDAwMGwsIC01KSwgYy5nZXRDb21taXR0ZXJJZGVudCgpKTsKQEAgLTE4NSwxMyArMTg1LDEzIEBAIHB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbmNvbXBsZXRlQXV0aG9yQW5kQ29tbWl0dGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaW1wbGljaXRfVVRGOF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiYXV0aG9yIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJhdXRob3IgRlx1MDBmNnIgZmF0dGFyZSA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJjb21taXR0ZXIgQyBPLiBNaXRlciA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsgLy8gYm9ndXMgaWQKIAkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9CeXRlQXJyYXkoKSk7CkBAIC0yMDUsMTMgKzIwNSwxMyBAQCBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaW1wbGljaXRfVVRGOF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaW1wbGljaXRfbWl4ZWRfZW5jb2RlZCgpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWIud3JpdGUoImF1dGhvciBGXHUwMGY2ciBmYXR0YXJlIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhJU09fODg1OV8xKSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJjb21taXR0ZXIgQyBPLiBNaXRlciA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIFJldkNvbW1pdCBjOwogCQljID0gbmV3IFJldkNvbW1pdChpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsgLy8gYm9ndXMgaWQKIAkJYy5wYXJzZUNhbm9uaWNhbChuZXcgUmV2V2FsayhkYiksIGIudG9CeXRlQXJyYXkoKSk7CkBAIC0yNjAsMTQgKzI2MCwxNCBAQCBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfZXhwbGljaXRfZW5jb2RlZCgpIHRocm93cyBFeGNlcHRpb24gewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYi53cml0ZSgiYXV0aG9yIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKElTT184ODU5XzEpKTsKLQkJYi53cml0ZSgiY29tbWl0dGVyIEMgTy4gTWl0ZXIgPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiZW5jb2RpbmcgRVVDLUpQXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIkhpXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiZW5jb2RpbmcgRVVDLUpQXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZDb21taXQgYzsKIAkJYyA9IG5ldyBSZXZDb21taXQoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7IC8vIGJvZ3VzIGlkCiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMjkxLDE0ICsyOTEsMTQgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfZXhwbGljaXRfYmFkX2VuY29kZWQyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiYXV0aG9yIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBDIE8uIE1pdGVyIDxjQGV4YW1wbGUuY29tPiAxMjE4MTIzMzkwIC0wNTAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImVuY29kaW5nIElTTy04ODU5LTFcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiYXV0aG9yIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiY29tbWl0dGVyIEMgTy4gTWl0ZXIgPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyBJU08tODg1OS0xXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZDb21taXQgYzsKIAkJYyA9IG5ldyBSZXZDb21taXQoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7IC8vIGJvZ3VzIGlkCiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMzEzLDEzICszMTMsMTMgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkMigpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbmNvcnJlY3RVdGY4TmFtZSgpIHRocm93cyBFeGNlcHRpb24gewogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAkJYi53cml0ZSgidHJlZSA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iCi0JCQkJLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImF1dGhvciBhdSA8YUBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJCS5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImF1dGhvciBhdSA8YUBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWIud3JpdGUoImNvbW1pdHRlciBjbyA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIgotCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyAndXRmOCdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJCS5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImVuY29kaW5nICd1dGY4J1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJUmV2Q29tbWl0IGMgPSBuZXcgUmV2Q29tbWl0KAogCQkJCWlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwpAQCAtMzM4LDEyICszMzgsMTIgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2luY29ycmVjdFV0ZjhOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaWxsZWdhbEVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiYXV0aG9yIGF1IDxhQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBjbyA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyB1dGYtOGxvZ291dHB1dGVuY29kaW5nPWdia1xuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJhdXRob3IgYXUgPGFAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJjb21taXR0ZXIgY28gPGNAZXhhbXBsZS5jb20+IDEyMTgxMjMzOTAgLTA1MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyB1dGYtOGxvZ291dHB1dGVuY29kaW5nPWdia1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoIm1lc3NhZ2VcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCiAJCVJldkNvbW1pdCBjID0gbmV3IFJldkNvbW1pdCgKIAkJCQlpZCgiOTQ3MzA5NWM0Y2IyZjEyYWVmZTFkYjhhMzU1ZmUzZmFmYmE0MmY2NyIpKTsKQEAgLTM2NSwxMiArMzY1LDEyIEBAIHB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbGxlZ2FsRW5jb2RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV91bnN1cHBvcnRlZEVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJ0cmVlIDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiYXV0aG9yIGF1IDxhQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImNvbW1pdHRlciBjbyA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyBpdF9JVC5VVEY4XG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJtZXNzYWdlXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoInRyZWUgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImF1dGhvciBhdSA8YUBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImNvbW1pdHRlciBjbyA8Y0BleGFtcGxlLmNvbT4gMTIxODEyMzM5MCAtMDUwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImVuY29kaW5nIGl0X0lULlVURjhcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJtZXNzYWdlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAogCQlSZXZDb21taXQgYyA9IG5ldyBSZXZDb21taXQoCiAJCQkJaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CkBAIC00ODMsNyArNDgzLDcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX0dpdFN0eWxlTWVzc2FnZVdpdGhDUkxGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydEVxdWFscyhzaG9ydE1zZywgYy5nZXRTaG9ydE1lc3NhZ2UoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgT2JqZWN0SWQgaWQoZmluYWwgU3RyaW5nIHN0cikgeworCXByaXZhdGUgc3RhdGljIE9iamVjdElkIGlkKFN0cmluZyBzdHIpIHsKIAkJcmV0dXJuIE9iamVjdElkLmZyb21TdHJpbmcoc3RyKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3RUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3RUZXN0LmphdmEKaW5kZXggMTIyYTM5Ny4uOGUzODlhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdFRlc3QuamF2YQpAQCAtNzYsNyArNzYsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAkJZmluYWwgUmV2Q29tbWl0IGEyOwogCQlmaW5hbCBSZXZDb21taXQgYjI7Ci0JCXRyeSAoZmluYWwgUmV2V2FsayBydzIgPSBuZXcgUmV2V2FsayhkYikpIHsKKwkJdHJ5IChSZXZXYWxrIHJ3MiA9IG5ldyBSZXZXYWxrKGRiKSkgewogCQkJYTIgPSBydzIucGFyc2VDb21taXQoYTEpOwogCQkJYjIgPSBydzIucGFyc2VDb21taXQoYjEpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUYWdQYXJzZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZ1BhcnNlVGVzdC5qYXZhCmluZGV4IDM4YmQzNzEuLmUxMWNlZjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZ1BhcnNlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZ1BhcnNlVGVzdC5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsazsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuSVNPXzg4NTlfMTsKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwpAQCAtODIsNyArODIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VGFnVGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXRlc3RPbmVUeXBlKENvbnN0YW50cy5PQkpfVEFHKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdGVzdE9uZVR5cGUoZmluYWwgaW50IHR5cGVDb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgdGVzdE9uZVR5cGUoaW50IHR5cGVDb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgT2JqZWN0SWQgaWQgPSBpZCgiOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2NyIpOwogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQliLmFwcGVuZCgib2JqZWN0ICIgKyBpZC5uYW1lKCkgKyAiXG4iKTsKQEAgLTk4LDcgKzk4LDcgQEAgcHJpdmF0ZSB2b2lkIHRlc3RPbmVUeXBlKGZpbmFsIGludCB0eXBlQ29kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydE51bGwoYy5nZXRPYmplY3QoKSk7CiAJCWFzc2VydE51bGwoYy5nZXRUYWdOYW1lKCkpOwogCi0JCWMucGFyc2VDYW5vbmljYWwocncsIGIudG9TdHJpbmcoKS5nZXRCeXRlcyhVVEZfOCkpOworCQljLnBhcnNlQ2Fub25pY2FsKHJ3LCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlhc3NlcnROb3ROdWxsKGMuZ2V0T2JqZWN0KCkpOwogCQlhc3NlcnRFcXVhbHMoaWQsIGMuZ2V0T2JqZWN0KCkuZ2V0SWQoKSk7CiAJCWFzc2VydFNhbWUocncubG9va3VwQW55KGlkLCB0eXBlQ29kZSksIGMuZ2V0T2JqZWN0KCkpOwpAQCAtMTQxLDcgKzE0MSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUFsbEZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnROdWxsKGMuZ2V0T2JqZWN0KCkpOwogCQlhc3NlcnROdWxsKGMuZ2V0VGFnTmFtZSgpKTsKIAotCQljLnBhcnNlQ2Fub25pY2FsKHJ3LCBib2R5LnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYy5wYXJzZUNhbm9uaWNhbChydywgYm9keS50b1N0cmluZygpLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYXNzZXJ0Tm90TnVsbChjLmdldE9iamVjdCgpKTsKIAkJYXNzZXJ0RXF1YWxzKHRyZWVJZCwgYy5nZXRPYmplY3QoKS5nZXRJZCgpKTsKIAkJYXNzZXJ0U2FtZShydy5sb29rdXBUcmVlKHRyZWVJZCksIGMuZ2V0T2JqZWN0KCkpOwpAQCAtMTg5LDcgKzE4OSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU9sZFN0eWxlTm9UYWdnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0TnVsbChjLmdldE9iamVjdCgpKTsKIAkJYXNzZXJ0TnVsbChjLmdldFRhZ05hbWUoKSk7CiAKLQkJYy5wYXJzZUNhbm9uaWNhbChydywgYm9keS50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCWMucGFyc2VDYW5vbmljYWwocncsIGJvZHkudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWFzc2VydE5vdE51bGwoYy5nZXRPYmplY3QoKSk7CiAJCWFzc2VydEVxdWFscyh0cmVlSWQsIGMuZ2V0T2JqZWN0KCkuZ2V0SWQoKSk7CiAJCWFzc2VydFNhbWUocncubG9va3VwVHJlZSh0cmVlSWQpLCBjLmdldE9iamVjdCgpKTsKQEAgLTIwMiw3ICsyMDIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VPbGRTdHlsZU5vVGFnZ2VyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWFzc2VydE51bGwoYy5nZXRUYWdnZXJJZGVudCgpKTsKIAl9CiAKLQlwcml2YXRlIFJldlRhZyBjcmVhdGUoZmluYWwgU3RyaW5nIG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBSZXZUYWcgY3JlYXRlKFN0cmluZyBtc2cpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQliLmFwcGVuZCgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIpOwogCQliLmFwcGVuZCgidHlwZSB0cmVlXG4iKTsKQEAgLTIxMyw3ICsyMTMsNyBAQCBwcml2YXRlIFJldlRhZyBjcmVhdGUoZmluYWwgU3RyaW5nIG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAkJZmluYWwgUmV2VGFnIGM7CiAJCWMgPSBuZXcgUmV2VGFnKGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwotCQljLnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b1N0cmluZygpLmdldEJ5dGVzKFVURl84KSk7CisJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlyZXR1cm4gYzsKIAl9CiAKQEAgLTIyMSwxNyArMjIxLDE3IEBAIHByaXZhdGUgUmV2VGFnIGNyZWF0ZShmaW5hbCBTdHJpbmcgbXNnKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfaW1wbGljaXRfVVRGOF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIgotCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnIHYxLjIuMy40LjVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0YWcgdjEuMi4zLjQuNVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJYgogCQkJCS53cml0ZSgidGFnZ2VyIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iCi0JCQkJCQkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlNtXHUwMGY2cmdcdTAwZTVzYm9yZFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCQkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZUYWcgYzsKIAkJYyA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMjQ2LDE1ICsyNDYsMTUgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2ltcGxpY2l0X1VURjhfZW5jb2RlZCgpIHRocm93cyBFeGNlcHRpb24gewogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbXBsaWNpdF9taXhlZF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIgotCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnIHYxLjIuMy40LjVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0YWcgdjEuMi4zLjQuNVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWIud3JpdGUoInRhZ2dlciBGXHUwMGY2ciBmYXR0YXJlIDxhX3VfdGhvckBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIgogCQkJCS5nZXRCeXRlcyhJU09fODg1OV8xKSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJTbVx1MDBmNnJnXHUwMGU1c2JvcmRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZUYWcgYzsKIAkJYyA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMzA3LDE3ICszMDcsMTcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2VuY29kZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfZXhwbGljaXRfYmFkX2VuY29kZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAJCWIud3JpdGUoIm9iamVjdCA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iCi0JCQkJLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0YWcgdjEuMi4zLjQuNVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQkJCS5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInRhZyB2MS4yLjMuNC41XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJYgogCQkJCS53cml0ZSgidGFnZ2VyIEZcdTAwZjZyIGZhdHRhcmUgPGFfdV90aG9yQGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iCiAJCQkJCQkuZ2V0Qnl0ZXMoSVNPXzg4NTlfMSkpOwotCQliLndyaXRlKCJlbmNvZGluZyBFVUMtSlBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlx1MzA0ZFx1MzA4Y1x1MzA0NFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYi53cml0ZSgiZW5jb2RpbmcgRVVDLUpQXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZUYWcgYzsKIAkJYyA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMzQyLDE3ICszNDIsMTcgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkMigpIHRocm93cyBFeGNlcHRpb24gewogCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKIAkJYi53cml0ZSgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIKLQkJCQkuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInRhZyB2MS4yLjMuNC41XG4iLmdldEJ5dGVzKFVURl84KSk7CisJCQkJLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidGFnIHYxLjIuMy40LjVcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQliCiAJCQkJLndyaXRlKCJ0YWdnZXIgRlx1MDBmNnIgZmF0dGFyZSA8YV91X3Rob3JAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIKLQkJCQkJCS5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJlbmNvZGluZyBJU08tODg1OS0xXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcdTMwNGRcdTMwOGNcdTMwNDRcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIkhpXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCQkJCQkuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyBJU08tODg1OS0xXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXHUzMDRkXHUzMDhjXHUzMDQ0XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiSGlcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlmaW5hbCBSZXZUYWcgYzsKIAkJYyA9IG5ldyBSZXZUYWcoaWQoIjk0NzMwOTVjNGNiMmYxMmFlZmUxZGI4YTM1NWZlM2ZhZmJhNDJmNjciKSk7CiAJCWMucGFyc2VDYW5vbmljYWwobmV3IFJldldhbGsoZGIpLCBiLnRvQnl0ZUFycmF5KCkpOwpAQCAtMzY1LDEzICszNjUsMTMgQEAgcHVibGljIHZvaWQgdGVzdFBhcnNlX2V4cGxpY2l0X2JhZF9lbmNvZGVkMigpIHRocm93cyBFeGNlcHRpb24gewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdFBhcnNlX2lsbGVnYWxFbmNvZGluZygpIHRocm93cyBFeGNlcHRpb24gewogCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYiA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJYi53cml0ZSgib2JqZWN0IDk3ODg2NjlhZDkxOGI2ZmNjZTY0YWY4ODgyZmM5YTgxY2I2YWJhNjdcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInRhZyB2MS4wXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoInRhZ2dlciB0IDx0QGV4YW1wbGUuY29tPiAxMjE4MTIzMzg3ICswNzAwXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoImVuY29kaW5nIHV0Zi04bG9nb3V0cHV0ZW5jb2Rpbmc9Z2JrXG4iLmdldEJ5dGVzKFVURl84KSk7Ci0JCWIud3JpdGUoIlxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJtZXNzYWdlXG4iLmdldEJ5dGVzKFVURl84KSk7CisJCWIud3JpdGUoIm9iamVjdCA5Nzg4NjY5YWQ5MThiNmZjY2U2NGFmODg4MmZjOWE4MWNiNmFiYTY3XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidHlwZSB0cmVlXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidGFnIHYxLjBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJ0YWdnZXIgdCA8dEBleGFtcGxlLmNvbT4gMTIxODEyMzM4NyArMDcwMFxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoImVuY29kaW5nIHV0Zi04bG9nb3V0cHV0ZW5jb2Rpbmc9Z2JrXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJUmV2VGFnIHQgPSBuZXcgUmV2VGFnKGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwogCQl0LnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b0J5dGVBcnJheSgpKTsKQEAgLTM4NCwxMyArMzg0LDEzIEBAIHB1YmxpYyB2b2lkIHRlc3RQYXJzZV9pbGxlZ2FsRW5jb2RpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RQYXJzZV91bnN1cHBvcnRlZEVuY29kaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBiID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJ0eXBlIHRyZWVcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnIHYxLjBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgidGFnZ2VyIHQgPHRAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgiZW5jb2RpbmcgaXRfSVQuVVRGOFxuIi5nZXRCeXRlcyhVVEZfOCkpOwotCQliLndyaXRlKCJcbiIuZ2V0Qnl0ZXMoVVRGXzgpKTsKLQkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhVVEZfOCkpOworCQliLndyaXRlKCJvYmplY3QgOTc4ODY2OWFkOTE4YjZmY2NlNjRhZjg4ODJmYzlhODFjYjZhYmE2N1xuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInR5cGUgdHJlZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CisJCWIud3JpdGUoInRhZyB2MS4wXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgidGFnZ2VyIHQgPHRAZXhhbXBsZS5jb20+IDEyMTgxMjMzODcgKzA3MDBcbiIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOworCQliLndyaXRlKCJlbmNvZGluZyBpdF9JVC5VVEY4XG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgiXG4iLmdldEJ5dGVzKENIQVJTRVQpKTsKKwkJYi53cml0ZSgibWVzc2FnZVxuIi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAKIAkJUmV2VGFnIHQgPSBuZXcgUmV2VGFnKGlkKCI5NDczMDk1YzRjYjJmMTJhZWZlMWRiOGEzNTVmZTNmYWZiYTQyZjY3IikpOwogCQl0LnBhcnNlQ2Fub25pY2FsKG5ldyBSZXZXYWxrKGRiKSwgYi50b0J5dGVBcnJheSgpKTsKQEAgLTQ4MCw3ICs0ODAsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VfUHVibGljUGFyc2VNZXRob2QoKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCWFzc2VydEVxdWFscyhzcmMuZ2V0TWVzc2FnZSgpLCBwLmdldEZ1bGxNZXNzYWdlKCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIE9iamVjdElkIGlkKGZpbmFsIFN0cmluZyBzdHIpIHsKKwlwcml2YXRlIHN0YXRpYyBPYmplY3RJZCBpZChTdHJpbmcgc3RyKSB7CiAJCXJldHVybiBPYmplY3RJZC5mcm9tU3RyaW5nKHN0cik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa0ZvbGxvd0ZpbHRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtGb2xsb3dGaWx0ZXJUZXN0LmphdmEKaW5kZXggYWIyNzA1Yy4uNzAwNTAyNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa0ZvbGxvd0ZpbHRlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrRm9sbG93RmlsdGVyVGVzdC5qYXZhCkBAIC03NSw3ICs3NSw3IEBAIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWRpZmZDb2xsZWN0b3IgPSBuZXcgRGlmZkNvbGxlY3RvcigpOwogCX0KIAotCXByb3RlY3RlZCBGb2xsb3dGaWx0ZXIgZm9sbG93KGZpbmFsIFN0cmluZyBmb2xsb3dQYXRoKSB7CisJcHJvdGVjdGVkIEZvbGxvd0ZpbHRlciBmb2xsb3coU3RyaW5nIGZvbGxvd1BhdGgpIHsKIAkJRm9sbG93RmlsdGVyIGZvbGxvd0ZpbHRlciA9CiAJCQlGb2xsb3dGaWx0ZXIuY3JlYXRlKGZvbGxvd1BhdGgsIG5ldyBDb25maWcoKS5nZXQoRGlmZkNvbmZpZy5LRVkpKTsKIAkJZm9sbG93RmlsdGVyLnNldFJlbmFtZUNhbGxiYWNrKGRpZmZDb2xsZWN0b3IpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1BhdGhGaWx0ZXIxVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1BhdGhGaWx0ZXIxVGVzdC5qYXZhCmluZGV4IDZlYzUyOWMuLmI1NWE0NWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtQYXRoRmlsdGVyMVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrUGF0aEZpbHRlcjFUZXN0LmphdmEKQEAgLTU0LDcgKzU0LDcgQEAKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAogcHVibGljIGNsYXNzIFJldldhbGtQYXRoRmlsdGVyMVRlc3QgZXh0ZW5kcyBSZXZXYWxrVGVzdENhc2UgewotCXByb3RlY3RlZCB2b2lkIGZpbHRlcihmaW5hbCBTdHJpbmcgcGF0aCkgeworCXByb3RlY3RlZCB2b2lkIGZpbHRlcihTdHJpbmcgcGF0aCkgewogCQlydy5zZXRUcmVlRmlsdGVyKEFuZFRyZWVGaWx0ZXIuY3JlYXRlKFBhdGhGaWx0ZXJHcm91cAogCQkJCS5jcmVhdGVGcm9tU3RyaW5ncyhDb2xsZWN0aW9ucy5zaW5nbGV0b24ocGF0aCkpLAogCQkJCVRyZWVGaWx0ZXIuQU5ZX0RJRkYpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtQYXRoRmlsdGVyNjAxMlRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtQYXRoRmlsdGVyNjAxMlRlc3QuamF2YQppbmRleCA2MzFlMzk1Li5jZWY1NTIxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrUGF0aEZpbHRlcjYwMTJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1BhdGhGaWx0ZXI2MDEyVGVzdC5qYXZhCkBAIC0xMDIsMTcgKzEwMiwxNyBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJvdGVjdGVkIHZvaWQgY2hlY2soZmluYWwgUmV2Q29tbWl0Li4uIG9yZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBjaGVjayhSZXZDb21taXQuLi4gb3JkZXIpIHRocm93cyBFeGNlcHRpb24gewogCQltYXJrU3RhcnQoaSk7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgYWN0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChmaW5hbCBSZXZDb21taXQgeiA6IHJ3KSB7CisJCWZvciAoUmV2Q29tbWl0IHogOiBydykgewogCQkJZmluYWwgU3RyaW5nIG5hbWUgPSBieU5hbWUuZ2V0KHopOwogCQkJYXNzZXJ0Tm90TnVsbChuYW1lKTsKIAkJCWFjdC5hcHBlbmQobmFtZSk7CiAJCQlhY3QuYXBwZW5kKCcgJyk7CiAJCX0KIAkJZmluYWwgU3RyaW5nQnVpbGRlciBleHAgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlmb3IgKGZpbmFsIFJldkNvbW1pdCB6IDogb3JkZXIpIHsKKwkJZm9yIChSZXZDb21taXQgeiA6IG9yZGVyKSB7CiAJCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGJ5TmFtZS5nZXQoeik7CiAJCQlhc3NlcnROb3ROdWxsKG5hbWUpOwogCQkJZXhwLmFwcGVuZChuYW1lKTsKQEAgLTEyMSw3ICsxMjEsNyBAQCBwcm90ZWN0ZWQgdm9pZCBjaGVjayhmaW5hbCBSZXZDb21taXQuLi4gb3JkZXIpIHRocm93cyBFeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoZXhwLnRvU3RyaW5nKCksIGFjdC50b1N0cmluZygpKTsKIAl9CiAKLQlwcm90ZWN0ZWQgdm9pZCBmaWx0ZXIoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcm90ZWN0ZWQgdm9pZCBmaWx0ZXIoU3RyaW5nIHBhdGgpIHsKIAkJcncuc2V0VHJlZUZpbHRlcihBbmRUcmVlRmlsdGVyLmNyZWF0ZShQYXRoRmlsdGVyR3JvdXAKIAkJCQkuY3JlYXRlRnJvbVN0cmluZ3MoQ29sbGVjdGlvbnMuc2luZ2xldG9uKHBhdGgpKSwKIAkJCQlUcmVlRmlsdGVyLkFOWV9ESUZGKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrVGVzdENhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtUZXN0Q2FzZS5qYXZhCmluZGV4IGYxMmNjMDguLjU0NDM5ODIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtUZXN0Q2FzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtUZXN0Q2FzZS5qYXZhCkBAIC03NCwzOCArNzQsMzggQEAgcHJvdGVjdGVkIERhdGUgZ2V0RGF0ZSgpIHsKIAkJcmV0dXJuIHV0aWwuZ2V0RGF0ZSgpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIHRpY2soZmluYWwgaW50IHNlY0RlbHRhKSB7CisJcHJvdGVjdGVkIHZvaWQgdGljayhpbnQgc2VjRGVsdGEpIHsKIAkJdXRpbC50aWNrKHNlY0RlbHRhKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2QmxvYiBibG9iKGZpbmFsIFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgUmV2QmxvYiBibG9iKFN0cmluZyBjb250ZW50KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwuYmxvYihjb250ZW50KTsKIAl9CiAKLQlwcm90ZWN0ZWQgRGlyQ2FjaGVFbnRyeSBmaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBSZXZCbG9iIGJsb2IpCisJcHJvdGVjdGVkIERpckNhY2hlRW50cnkgZmlsZShTdHJpbmcgcGF0aCwgUmV2QmxvYiBibG9iKQogCQkJdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiB1dGlsLmZpbGUocGF0aCwgYmxvYik7CiAJfQogCi0JcHJvdGVjdGVkIFJldlRyZWUgdHJlZShmaW5hbCBEaXJDYWNoZUVudHJ5Li4uIGVudHJpZXMpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCBSZXZUcmVlIHRyZWUoRGlyQ2FjaGVFbnRyeS4uLiBlbnRyaWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwudHJlZShlbnRyaWVzKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2T2JqZWN0IGdldChmaW5hbCBSZXZUcmVlIHRyZWUsIGZpbmFsIFN0cmluZyBwYXRoKQorCXByb3RlY3RlZCBSZXZPYmplY3QgZ2V0KFJldlRyZWUgdHJlZSwgU3RyaW5nIHBhdGgpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwuZ2V0KHRyZWUsIHBhdGgpOwogCX0KIAotCXByb3RlY3RlZCBSZXZDb21taXQgY29tbWl0KGZpbmFsIFJldkNvbW1pdC4uLiBwYXJlbnRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNvbW1pdChSZXZDb21taXQuLi4gcGFyZW50cykgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiB1dGlsLmNvbW1pdChwYXJlbnRzKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNvbW1pdChmaW5hbCBSZXZUcmVlIHRyZWUsIGZpbmFsIFJldkNvbW1pdC4uLiBwYXJlbnRzKQorCXByb3RlY3RlZCBSZXZDb21taXQgY29tbWl0KFJldlRyZWUgdHJlZSwgUmV2Q29tbWl0Li4uIHBhcmVudHMpCiAJCQl0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwuY29tbWl0KHRyZWUsIHBhcmVudHMpOwogCX0KIAotCXByb3RlY3RlZCBSZXZDb21taXQgY29tbWl0KGZpbmFsIGludCBzZWNEZWx0YSwgZmluYWwgUmV2Q29tbWl0Li4uIHBhcmVudHMpCisJcHJvdGVjdGVkIFJldkNvbW1pdCBjb21taXQoaW50IHNlY0RlbHRhLCBSZXZDb21taXQuLi4gcGFyZW50cykKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdXRpbC5jb21taXQoc2VjRGVsdGEsIHBhcmVudHMpOwogCX0KQEAgLTExNSw3ICsxMTUsNyBAQCBwcm90ZWN0ZWQgUmV2Q29tbWl0IGNvbW1pdChmaW5hbCBpbnQgc2VjRGVsdGEsIGZpbmFsIFJldlRyZWUgdHJlZSwKIAkJcmV0dXJuIHV0aWwuY29tbWl0KHNlY0RlbHRhLCB0cmVlLCBwYXJlbnRzKTsKIAl9CiAKLQlwcm90ZWN0ZWQgUmV2VGFnIHRhZyhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgUmV2T2JqZWN0IGRzdCkKKwlwcm90ZWN0ZWQgUmV2VGFnIHRhZyhTdHJpbmcgbmFtZSwgUmV2T2JqZWN0IGRzdCkKIAkJCXRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gdXRpbC50YWcobmFtZSwgZHN0KTsKIAl9CkBAIC0xMjUsMTkgKzEyNSwxOSBAQCBwcm90ZWN0ZWQgQ29tbWl0QnVpbGRlciBjb21taXRCdWlsZGVyKCkKIAkJcmV0dXJuIHV0aWwuY29tbWl0KCk7CiAJfQogCi0JcHJvdGVjdGVkIDxUIGV4dGVuZHMgUmV2T2JqZWN0PiBUIHBhcnNlQm9keShmaW5hbCBUIHQpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCA8VCBleHRlbmRzIFJldk9iamVjdD4gVCBwYXJzZUJvZHkoVCB0KSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHV0aWwucGFyc2VCb2R5KHQpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIG1hcmtTdGFydChmaW5hbCBSZXZDb21taXQgY29tbWl0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCBtYXJrU3RhcnQoUmV2Q29tbWl0IGNvbW1pdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJ3Lm1hcmtTdGFydChjb21taXQpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIG1hcmtVbmludGVyZXN0aW5nKGZpbmFsIFJldkNvbW1pdCBjb21taXQpIHRocm93cyBFeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIG1hcmtVbmludGVyZXN0aW5nKFJldkNvbW1pdCBjb21taXQpIHRocm93cyBFeGNlcHRpb24gewogCQlydy5tYXJrVW5pbnRlcmVzdGluZyhjb21taXQpOwogCX0KIAotCXByb3RlY3RlZCB2b2lkIGFzc2VydENvbW1pdChmaW5hbCBSZXZDb21taXQgZXhwLCBmaW5hbCBSZXZDb21taXQgYWN0KSB7CisJcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29tbWl0KFJldkNvbW1pdCBleHAsIFJldkNvbW1pdCBhY3QpIHsKIAkJYXNzZXJ0U2FtZShleHAsIGFjdCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1V0aWxzUmVhY2hhYmxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsa1V0aWxzUmVhY2hhYmxlVGVzdC5qYXZhCmluZGV4IDEwYmVhMGEuLmEyNmFlMTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGtVdGlsc1JlYWNoYWJsZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrVXRpbHNSZWFjaGFibGVUZXN0LmphdmEKQEAgLTEwOSw3ICsxMDksNyBAQCBwdWJsaWMgdm9pZCB3aXRoQ29tbWl0TG9hZGVkQnlEaWZmZXJlbnRSZXZXYWxrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIFJlZiBicmFuY2goZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFJldkNvbW1pdCBkc3QpIHRocm93cyBFeGNlcHRpb24geworCXByaXZhdGUgUmVmIGJyYW5jaChTdHJpbmcgbmFtZSwgUmV2Q29tbWl0IGRzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiBHaXQud3JhcChkYikuYnJhbmNoQ3JlYXRlKCkuc2V0TmFtZShuYW1lKQogCQkJCS5zZXRTdGFydFBvaW50KGRzdC5uYW1lKCkpLmNhbGwoKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnVGVzdC5qYXZhCmluZGV4IDdmMGQ2MDIuLjBkZWE1Y2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvRmlsZUJhc2VkQ29uZmlnVGVzdC5qYXZhCkBAIC00Miw3ICs0Miw3IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscy5wYXRoVG9TdHJpbmc7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwpAQCAtMTA1LDcgKzEwNSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RTeXN0ZW1FbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RVVEY4d2l0aG91dEJPTSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7Ci0JCWZpbmFsIEZpbGUgZmlsZSA9IGNyZWF0ZUZpbGUoQ09OVEVOVDEuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJZmluYWwgRmlsZSBmaWxlID0gY3JlYXRlRmlsZShDT05URU5UMS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWZpbmFsIEZpbGVCYXNlZENvbmZpZyBjb25maWcgPSBuZXcgRmlsZUJhc2VkQ29uZmlnKGZpbGUsIEZTLkRFVEVDVEVEKTsKIAkJY29uZmlnLmxvYWQoKTsKIAkJYXNzZXJ0RXF1YWxzKEFMSUNFLCBjb25maWcuZ2V0U3RyaW5nKFVTRVIsIG51bGwsIE5BTUUpKTsKQEAgLTEyMSw3ICsxMjEsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0VVRGOHdpdGhCT00oKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlib3MxLndyaXRlKDB4RUYpOwogCQlib3MxLndyaXRlKDB4QkIpOwogCQlib3MxLndyaXRlKDB4QkYpOwotCQlib3MxLndyaXRlKENPTlRFTlQxLmdldEJ5dGVzKFVURl84KSk7CisJCWJvczEud3JpdGUoQ09OVEVOVDEuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCiAJCWZpbmFsIEZpbGUgZmlsZSA9IGNyZWF0ZUZpbGUoYm9zMS50b0J5dGVBcnJheSgpKTsKIAkJZmluYWwgRmlsZUJhc2VkQ29uZmlnIGNvbmZpZyA9IG5ldyBGaWxlQmFzZWRDb25maWcoZmlsZSwgRlMuREVURUNURUQpOwpAQCAtMTM1LDcgKzEzNSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RVVEY4d2l0aEJPTSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCWJvczIud3JpdGUoMHhFRik7CiAJCWJvczIud3JpdGUoMHhCQik7CiAJCWJvczIud3JpdGUoMHhCRik7Ci0JCWJvczIud3JpdGUoQ09OVEVOVDIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYm9zMi53cml0ZShDT05URU5UMi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCWFzc2VydEFycmF5RXF1YWxzKGJvczIudG9CeXRlQXJyYXkoKSwgSU8ucmVhZEZ1bGx5KGZpbGUpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlQWRkVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVBZGRUZXN0LmphdmEKaW5kZXggOTNmNDcwOS4uNTc4MDk3MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVBZGRUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVBZGRUZXN0LmphdmEKQEAgLTEyOSwxMCArMTI5LDExIEBAIHB1YmxpYyB2b2lkIGFkZFN1Ym1vZHVsZSgpIHRocm93cyBFeGNlcHRpb24gewogCQkJY29tbWFuZC5zZXRQYXRoKHBhdGgpOwogCQkJU3RyaW5nIHVyaSA9IGRiLmdldERpcmVjdG9yeSgpLnRvVVJJKCkudG9TdHJpbmcoKTsKIAkJCWNvbW1hbmQuc2V0VVJJKHVyaSk7Ci0JCQlSZXBvc2l0b3J5IHJlcG8gPSBjb21tYW5kLmNhbGwoKTsKLQkJCWFzc2VydE5vdE51bGwocmVwbyk7Ci0JCQlPYmplY3RJZCBzdWJDb21taXQgPSByZXBvLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpOwotCQkJcmVwby5jbG9zZSgpOworCQkJT2JqZWN0SWQgc3ViQ29tbWl0OworCQkJdHJ5IChSZXBvc2l0b3J5IHJlcG8gPSBjb21tYW5kLmNhbGwoKSkgeworCQkJCWFzc2VydE5vdE51bGwocmVwbyk7CisJCQkJc3ViQ29tbWl0ID0gcmVwby5yZXNvbHZlKENvbnN0YW50cy5IRUFEKTsKKwkJCX0KIAogCQkJU3VibW9kdWxlV2FsayBnZW5lcmF0b3IgPSBTdWJtb2R1bGVXYWxrLmZvckluZGV4KGRiKTsKIAkJCWFzc2VydFRydWUoZ2VuZXJhdG9yLm5leHQoKSk7CkBAIC0xNDEsMTAgKzE0MiwxMCBAQCBwdWJsaWMgdm9pZCBhZGRTdWJtb2R1bGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCWFzc2VydEVxdWFscyh1cmksIGdlbmVyYXRvci5nZXRNb2R1bGVzVXJsKCkpOwogCQkJYXNzZXJ0RXF1YWxzKHBhdGgsIGdlbmVyYXRvci5nZXRNb2R1bGVzUGF0aCgpKTsKIAkJCWFzc2VydEVxdWFscyh1cmksIGdlbmVyYXRvci5nZXRDb25maWdVcmwoKSk7Ci0JCQlSZXBvc2l0b3J5IHN1Yk1vZFJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOwotCQkJYXNzZXJ0Tm90TnVsbChzdWJNb2RSZXBvKTsKLQkJCWFzc2VydEVxdWFscyhzdWJDb21taXQsIGNvbW1pdCk7Ci0JCQlzdWJNb2RSZXBvLmNsb3NlKCk7CisJCQl0cnkgKFJlcG9zaXRvcnkgc3ViTW9kUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCQlhc3NlcnROb3ROdWxsKHN1Yk1vZFJlcG8pOworCQkJCWFzc2VydEVxdWFscyhzdWJDb21taXQsIGNvbW1pdCk7CisJCQl9CiAKIAkJCVN0YXR1cyBzdGF0dXMgPSBHaXQud3JhcChkYikuc3RhdHVzKCkuY2FsbCgpOwogCQkJYXNzZXJ0VHJ1ZShzdGF0dXMuZ2V0QWRkZWQoKS5jb250YWlucyhDb25zdGFudHMuRE9UX0dJVF9NT0RVTEVTKSk7CkBAIC0yNDAsMTYgKzI0MSwxNCBAQCBwdWJsaWMgdm9pZCBhZGRTdWJtb2R1bGVXaXRoUmVsYXRpdmVVcmkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlmdWxsVXJpID0gZnVsbFVyaS5yZXBsYWNlKCdcXCcsICcvJyk7CiAJCQl9CiAJCQlhc3NlcnRFcXVhbHMoZnVsbFVyaSwgZ2VuZXJhdG9yLmdldENvbmZpZ1VybCgpKTsKLQkJCVJlcG9zaXRvcnkgc3ViTW9kUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCQlhc3NlcnROb3ROdWxsKHN1Yk1vZFJlcG8pOwotCQkJYXNzZXJ0RXF1YWxzKAotCQkJCQlmdWxsVXJpLAotCQkJCQlzdWJNb2RSZXBvCi0JCQkJCQkJLmdldENvbmZpZygpCi0JCQkJCQkJLmdldFN0cmluZyhDb25maWdDb25zdGFudHMuQ09ORklHX1JFTU9URV9TRUNUSU9OLAotCQkJCQkJCQkJQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsCi0JCQkJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwpKTsKLQkJCXN1Yk1vZFJlcG8uY2xvc2UoKTsKKwkJCXRyeSAoUmVwb3NpdG9yeSBzdWJNb2RSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKSkgeworCQkJCWFzc2VydE5vdE51bGwoc3ViTW9kUmVwbyk7CisJCQkJYXNzZXJ0RXF1YWxzKGZ1bGxVcmksCisJCQkJCQlzdWJNb2RSZXBvLmdldENvbmZpZygpLmdldFN0cmluZygKKwkJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19SRU1PVEVfU0VDVElPTiwKKwkJCQkJCQkJQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsCisJCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCkpOworCQkJfQogCQkJYXNzZXJ0RXF1YWxzKGNvbW1pdCwgcmVwby5yZXNvbHZlKENvbnN0YW50cy5IRUFEKSk7CiAKIAkJCVN0YXR1cyBzdGF0dXMgPSBHaXQud3JhcChkYikuc3RhdHVzKCkuY2FsbCgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVTeW5jVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVTeW5jVGVzdC5qYXZhCmluZGV4IDEzZGI0NGEuLjZmM2I1MmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlU3luY1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVN5bmNUZXN0LmphdmEKQEAgLTEzNSwxMiArMTM1LDE0IEBAIHB1YmxpYyB2b2lkIGFwcGx5KERpckNhY2hlRW50cnkgZW50KSB7CiAJCWdlbmVyYXRvciA9IFN1Ym1vZHVsZVdhbGsuZm9ySW5kZXgoZGIpOwogCQlhc3NlcnRUcnVlKGdlbmVyYXRvci5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHModXJsLCBnZW5lcmF0b3IuZ2V0Q29uZmlnVXJsKCkpOwotCQlSZXBvc2l0b3J5IHN1Yk1vZFJlcG9zaXRvcnkgPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOwotCQlTdG9yZWRDb25maWcgc3VibW9kdWxlQ29uZmlnID0gc3ViTW9kUmVwb3NpdG9yeS5nZXRDb25maWcoKTsKLQkJc3ViTW9kUmVwb3NpdG9yeS5jbG9zZSgpOwotCQlhc3NlcnRFcXVhbHModXJsLCBzdWJtb2R1bGVDb25maWcuZ2V0U3RyaW5nKAotCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfUkVNT1RFX1NFQ1RJT04sCi0JCQkJQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsIENvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCkpOworCQl0cnkgKFJlcG9zaXRvcnkgc3ViTW9kUmVwb3NpdG9yeSA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCVN0b3JlZENvbmZpZyBzdWJtb2R1bGVDb25maWcgPSBzdWJNb2RSZXBvc2l0b3J5LmdldENvbmZpZygpOworCQkJYXNzZXJ0RXF1YWxzKHVybCwKKwkJCQkJc3VibW9kdWxlQ29uZmlnLmdldFN0cmluZygKKwkJCQkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX1JFTU9URV9TRUNUSU9OLAorCQkJCQkJCUNvbnN0YW50cy5ERUZBVUxUX1JFTU9URV9OQU1FLAorCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfS0VZX1VSTCkpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTIwOCwxMSArMjEwLDEzIEBAIHB1YmxpYyB2b2lkIGFwcGx5KERpckNhY2hlRW50cnkgZW50KSB7CiAJCWdlbmVyYXRvciA9IFN1Ym1vZHVsZVdhbGsuZm9ySW5kZXgoZGIpOwogCQlhc3NlcnRUcnVlKGdlbmVyYXRvci5uZXh0KCkpOwogCQlhc3NlcnRFcXVhbHMoImdpdDovL3NlcnZlci9zdWIuZ2l0IiwgZ2VuZXJhdG9yLmdldENvbmZpZ1VybCgpKTsKLQkJUmVwb3NpdG9yeSBzdWJNb2RSZXBvc2l0b3J5MSA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCVN0b3JlZENvbmZpZyBzdWJtb2R1bGVDb25maWcgPSBzdWJNb2RSZXBvc2l0b3J5MS5nZXRDb25maWcoKTsKLQkJc3ViTW9kUmVwb3NpdG9yeTEuY2xvc2UoKTsKLQkJYXNzZXJ0RXF1YWxzKCJnaXQ6Ly9zZXJ2ZXIvc3ViLmdpdCIsIHN1Ym1vZHVsZUNvbmZpZy5nZXRTdHJpbmcoCi0JCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19SRU1PVEVfU0VDVElPTiwKLQkJCQlDb25zdGFudHMuREVGQVVMVF9SRU1PVEVfTkFNRSwgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKSk7CisJCXRyeSAoUmVwb3NpdG9yeSBzdWJNb2RSZXBvc2l0b3J5MSA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCkpIHsKKwkJCVN0b3JlZENvbmZpZyBzdWJtb2R1bGVDb25maWcgPSBzdWJNb2RSZXBvc2l0b3J5MS5nZXRDb25maWcoKTsKKwkJCWFzc2VydEVxdWFscygiZ2l0Oi8vc2VydmVyL3N1Yi5naXQiLAorCQkJCQlzdWJtb2R1bGVDb25maWcuZ2V0U3RyaW5nKAorCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfUkVNT1RFX1NFQ1RJT04sCisJCQkJCQkJQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUUsCisJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMKSk7CisJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVVwZGF0ZVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlVXBkYXRlVGVzdC5qYXZhCmluZGV4IDcwNjRmNjAuLmJiY2U0MTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlVXBkYXRlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlVXBkYXRlVGVzdC5qYXZhCkBAIC0xMjEsMTAgKzEyMSwxMCBAQCBwdWJsaWMgdm9pZCBhcHBseShEaXJDYWNoZUVudHJ5IGVudCkgewogCiAJCVN1Ym1vZHVsZVdhbGsgZ2VuZXJhdG9yID0gU3VibW9kdWxlV2Fsay5mb3JJbmRleChkYik7CiAJCWFzc2VydFRydWUoZ2VuZXJhdG9yLm5leHQoKSk7Ci0JCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCWFzc2VydE5vdE51bGwoc3ViUmVwbyk7Ci0JCWFzc2VydEVxdWFscyhjb21taXQsIHN1YlJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCkpOwotCQlzdWJSZXBvLmNsb3NlKCk7CisJCXRyeSAoUmVwb3NpdG9yeSBzdWJSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKSkgeworCQkJYXNzZXJ0Tm90TnVsbChzdWJSZXBvKTsKKwkJCWFzc2VydEVxdWFscyhjb21taXQsIHN1YlJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCkpOworCQl9CiAJfQogCiAJQFRlc3QKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQnVuZGxlV3JpdGVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKaW5kZXggNjU4Yjk3MS4uZDMwYWM4NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXJUZXN0LmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuT0JKX0JMT0I7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CkBAIC0xOTksNyArMTk5LDcgQEAgcHVibGljIHZvaWQgdGVzdEN1c3RvbU9iamVjdFJlYWRlcigpIHRocm93cyBFeGNlcHRpb24gewogCQkJUmVmIHJlZiA9IHJlcG8uZXhhY3RSZWYocmVmTmFtZSk7CiAJCQlhc3NlcnROb3ROdWxsKHJlZik7CiAJCQlhc3NlcnRFcXVhbHMoaWQsIHJlZi5nZXRPYmplY3RJZCgpKTsKLQkJCWFzc2VydEVxdWFscyhkYXRhLCBuZXcgU3RyaW5nKHJlcG8ub3BlbihpZCwgT0JKX0JMT0IpLmdldEJ5dGVzKCksIFVURl84KSk7CisJCQlhc3NlcnRFcXVhbHMoZGF0YSwgbmV3IFN0cmluZyhyZXBvLm9wZW4oaWQsIE9CSl9CTE9CKS5nZXRCeXRlcygpLCBDSEFSU0VUKSk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvTmV0UkNUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L05ldFJDVGVzdC5qYXZhCmluZGV4IDJmZWE4YTkuLjRlNWQ1NmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvTmV0UkNUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9OZXRSQ1Rlc3QuamF2YQpAQCAtNDIsNiArNDIsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwogCkBAIC03MywxMSArNzQsMTEgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY29uZmlnRmlsZSA9IG5ldyBGaWxlKGhvbWUsICIubmV0cmMiKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgY29uZmlnKGZpbmFsIFN0cmluZyBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBPdXRwdXRTdHJlYW1Xcml0ZXIgZncgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAotCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGNvbmZpZ0ZpbGUpLCAiVVRGLTgiKTsKLQkJZncud3JpdGUoZGF0YSk7Ci0JCWZ3LmNsb3NlKCk7CisJcHJpdmF0ZSB2b2lkIGNvbmZpZyhTdHJpbmcgZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IChPdXRwdXRTdHJlYW1Xcml0ZXIgZncgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKAorCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGNvbmZpZ0ZpbGUpLCBDSEFSU0VUKSkgeworCQkJZncud3JpdGUoZGF0YSk7CisJCX0KIAl9CiAKIAlAVGVzdApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVuU3NoQ29uZmlnVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVuU3NoQ29uZmlnVGVzdC5qYXZhCmluZGV4IGQ2MDQ3NTEuLmFiZjgwZWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlblNzaENvbmZpZ1Rlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZW5Tc2hDb25maWdUZXN0LmphdmEKQEAgLTQzLDYgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAoraW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CkBAIC04OSwxMSArOTAsMTEgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJb3NjID0gbmV3IE9wZW5Tc2hDb25maWcoaG9tZSwgY29uZmlnRmlsZSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZyhmaW5hbCBTdHJpbmcgZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgY29uZmlnKFN0cmluZyBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlsb25nIGxhc3RNdGltZSA9IGNvbmZpZ0ZpbGUubGFzdE1vZGlmaWVkKCk7CiAJCWRvIHsKIAkJCXRyeSAoZmluYWwgT3V0cHV0U3RyZWFtV3JpdGVyIGZ3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKLQkJCQkJbmV3IEZpbGVPdXRwdXRTdHJlYW0oY29uZmlnRmlsZSksICJVVEYtOCIpKSB7CisJCQkJCW5ldyBGaWxlT3V0cHV0U3RyZWFtKGNvbmZpZ0ZpbGUpLCBDSEFSU0VUKSkgewogCQkJCWZ3LndyaXRlKGRhdGEpOwogCQkJfQogCQl9IHdoaWxlIChsYXN0TXRpbWUgPT0gY29uZmlnRmlsZS5sYXN0TW9kaWZpZWQoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXJUZXN0LmphdmEKaW5kZXggNWQ5YmRiZC4uYjZkMDYxMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlclRlc3QuamF2YQpAQCAtOTMsOCArOTMsNyBAQCBwdWJsaWMgY2xhc3MgUGFja1BhcnNlclRlc3QgZXh0ZW5kcyBSZXBvc2l0b3J5VGVzdENhc2UgewogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgIElPRXhjZXB0aW9uIHsKIAkJRmlsZSBwYWNrRmlsZSA9IEpHaXRUZXN0VXRpbC5nZXRUZXN0UmVzb3VyY2VGaWxlKCJwYWNrLTM0YmU5MDMyYWMyODJiMTFmYTliYWJkYzJiMmE5M2NhOTk2YzljMmYucGFjayIpOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGFja0ZpbGUpOwotCQl0cnkgeworCQl0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYWNrRmlsZSkpIHsKIAkJCU9iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIgcCA9IChPYmplY3REaXJlY3RvcnlQYWNrUGFyc2VyKSBpbmRleChpcyk7CiAJCQlwLnBhcnNlKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UpOwogCQkJUGFja0ZpbGUgZmlsZSA9IHAuZ2V0UGFja0ZpbGUoKTsKQEAgLTEwNyw4ICsxMDYsNiBAQCBwdWJsaWMgdm9pZCB0ZXN0MSgpIHRocm93cyAgSU9FeGNlcHRpb24gewogCQkJYXNzZXJ0VHJ1ZShmaWxlLmhhc09iamVjdChPYmplY3RJZC5mcm9tU3RyaW5nKCI5MDJkNTQ3NmZhMjQ5YjdhYmM5ZDg0YzYxMTU3N2E4MTM4MWYwMzI3IikpKTsKIAkJCWFzc2VydFRydWUoZmlsZS5oYXNPYmplY3QoT2JqZWN0SWQuZnJvbVN0cmluZygiYWFiZjJmZmFlYzliNDk3ZjA5NTAzNTJiM2U1ODJkNzMwMzVjMjAzNSIpKSk7CiAJCQlhc3NlcnRUcnVlKGZpbGUuaGFzT2JqZWN0KE9iamVjdElkLmZyb21TdHJpbmcoImM1OTc1OWYxNDNmYjFmZTIxYzE5Nzk4MWRmNzVhN2VlMDAyOTA3OTkiKSkpOwotCQl9IGZpbmFsbHkgewotCQkJaXMuY2xvc2UoKTsKIAkJfQogCX0KIApAQCAtMTIxLDggKzExOCw3IEBAIHB1YmxpYyB2b2lkIHRlc3QxKCkgdGhyb3dzICBJT0V4Y2VwdGlvbiB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0MigpIHRocm93cyAgSU9FeGNlcHRpb24gewogCQlGaWxlIHBhY2tGaWxlID0gSkdpdFRlc3RVdGlsLmdldFRlc3RSZXNvdXJjZUZpbGUoInBhY2stZGYyOTgyZjI4NGJiYWJiNmJkYjU5ZWUzZmNjNmViMDk4M2UyMDM3MS5wYWNrIik7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYWNrRmlsZSk7Ci0JCXRyeSB7CisJCXRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhY2tGaWxlKSkgewogCQkJT2JqZWN0RGlyZWN0b3J5UGFja1BhcnNlciBwID0gKE9iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIpIGluZGV4KGlzKTsKIAkJCXAucGFyc2UoTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSk7CiAJCQlQYWNrRmlsZSBmaWxlID0gcC5nZXRQYWNrRmlsZSgpOwpAQCAtMTQwLDggKzEzNiw2IEBAIHB1YmxpYyB2b2lkIHRlc3QyKCkgdGhyb3dzICBJT0V4Y2VwdGlvbiB7CiAJCQlhc3NlcnRUcnVlKGZpbGUuaGFzT2JqZWN0KE9iamVjdElkLmZyb21TdHJpbmcoIjIwYThhZGU3NzYzOTQ5MWVhMGJkNjY3YmY5NWRlOGFiZjNhNDM0YzgiKSkpOwogCQkJYXNzZXJ0VHJ1ZShmaWxlLmhhc09iamVjdChPYmplY3RJZC5mcm9tU3RyaW5nKCIyNjc1MTg4ZmQ4Njk3OGQ1YmM0ZDcyMTE2OThiMjExOGFlM2JmNjU4IikpKTsKIAkJCS8vIGFuZCBsb3RzIG1vcmUuLi4KLQkJfSBmaW5hbGx5IHsKLQkJCWlzLmNsb3NlKCk7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZUluVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW5UZXN0LmphdmEKaW5kZXggMTNmYzY4ZC4uOGIxZDg2MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW5UZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW5UZXN0LmphdmEKQEAgLTExNiwxNyArMTE2LDYgQEAgcHVibGljIHZvaWQgdGVzdFJlYWRTdHJpbmdfTGVuSEVMTygpIHsKIAl9CiAKIAlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RSZWFkU3RyaW5nX0xlbjAwMDEoKSB7Ci0JCWluaXQoIjAwMDEiKTsKLQkJdHJ5IHsKLQkJCWluLnJlYWRTdHJpbmcoKTsKLQkJCWZhaWwoImluY29ycmVjdGx5IGFjY2VwdGVkIGludmFsaWQgcGFja2V0IGhlYWRlciIpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlhc3NlcnRFcXVhbHMoIkludmFsaWQgcGFja2V0IGxpbmUgaGVhZGVyOiAwMDAxIiwgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVhZFN0cmluZ19MZW4wMDAyKCkgewogCQlpbml0KCIwMDAyIik7CiAJCXRyeSB7CkBAIC0xNjQsNiArMTUzLDEzIEBAIHB1YmxpYyB2b2lkIHRlc3RSZWFkU3RyaW5nX0VuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWFzc2VydEVPRigpOwogCX0KIAorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFJlYWRTdHJpbmdfRGVsaW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpbml0KCIwMDAxIik7CisJCWFzc2VydFNhbWUoUGFja2V0TGluZUluLkRFTElNLCBpbi5yZWFkU3RyaW5nKCkpOworCQlhc3NlcnRFT0YoKTsKKwl9CisKIAkvLyByZWFkU3RyaW5nTm9MRgogCiAJQFRlc3QKQEAgLTMzMCw3ICszMjYsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0UmVhZEFDS19FUlIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLy8gdGVzdCBzdXBwb3J0CiAKLQlwcml2YXRlIHZvaWQgaW5pdChmaW5hbCBTdHJpbmcgbXNnKSB7CisJcHJpdmF0ZSB2b2lkIGluaXQoU3RyaW5nIG1zZykgewogCQlyYXdJbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShDb25zdGFudHMuZW5jb2RlQVNDSUkobXNnKSk7CiAJCWluID0gbmV3IFBhY2tldExpbmVJbihyYXdJbik7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lT3V0VGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lT3V0VGVzdC5qYXZhCmluZGV4IGVjYTU0NzUuLjM5MWE3MDEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZU91dFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVPdXRUZXN0LmphdmEKQEAgLTExMyw2ICsxMTMsMTIgQEAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoMSwgZmx1c2hDbnRbMF0pOwogCX0KIAorCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFdyaXRlRGVsaW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlvdXQud3JpdGVEZWxpbSgpOworCQlhc3NlcnRCdWZmZXIoIjAwMDEiKTsKKwl9CisKIAkvLyB3cml0ZVBhY2tldAogCiAJQFRlc3QKQEAgLTE2Nyw3ICsxNzMsNyBAQCBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWFzc2VydEVxdWFscygxLCBmbHVzaENudFswXSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFzc2VydEJ1ZmZlcihmaW5hbCBTdHJpbmcgZXhwKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBhc3NlcnRCdWZmZXIoU3RyaW5nIGV4cCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKGV4cCwgbmV3IFN0cmluZyhyYXdPdXQudG9CeXRlQXJyYXkoKSwKIAkJCQlDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29ubmVjdGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENvbm5lY3Rpb25UZXN0LmphdmEKaW5kZXggYzE2YzFiMi4uNjM0NzhmNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ29ubmVjdGlvblRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDb25uZWN0aW9uVGVzdC5qYXZhCkBAIC01MSwxMiArNTEsMTYgQEAKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnMuRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnMuSW5NZW1vcnlSZXBvc2l0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuanVuaXQuVGVzdFJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLk51bGxQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQ7CkBAIC03Niw2ICs4MCw3IEBAIHB1YmxpYyBjbGFzcyBQdXNoQ29ubmVjdGlvblRlc3QgewogCXByaXZhdGUgT2JqZWN0IGN0eCA9IG5ldyBPYmplY3QoKTsKIAlwcml2YXRlIEluTWVtb3J5UmVwb3NpdG9yeSBzZXJ2ZXI7CiAJcHJpdmF0ZSBJbk1lbW9yeVJlcG9zaXRvcnkgY2xpZW50OworCXByaXZhdGUgTGlzdDxTdHJpbmc+IHByb2Nlc3NlZFJlZnM7CiAJcHJpdmF0ZSBPYmplY3RJZCBvYmoxOwogCXByaXZhdGUgT2JqZWN0SWQgb2JqMjsKIAlwcml2YXRlIE9iamVjdElkIG9iajM7CkBAIC04NSw2ICs5MCw3IEBAIHB1YmxpYyBjbGFzcyBQdXNoQ29ubmVjdGlvblRlc3QgewogCXB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXNlcnZlciA9IG5ld1JlcG8oInNlcnZlciIpOwogCQljbGllbnQgPSBuZXdSZXBvKCJjbGllbnQiKTsKKwkJcHJvY2Vzc2VkUmVmcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQl0ZXN0UHJvdG9jb2wgPSBuZXcgVGVzdFByb3RvY29sPD4oCiAJCQkJbnVsbCwKIAkJCQluZXcgUmVjZWl2ZVBhY2tGYWN0b3J5PE9iamVjdD4oKSB7CkBAIC05Miw3ICs5OCwxOCBAQCBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCQlwdWJsaWMgUmVjZWl2ZVBhY2sgY3JlYXRlKE9iamVjdCByZXEsIFJlcG9zaXRvcnkgZGIpCiAJCQkJCQkJdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAogCQkJCQkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKLQkJCQkJCXJldHVybiBuZXcgUmVjZWl2ZVBhY2soZGIpOworCQkJCQkJUmVjZWl2ZVBhY2sgcnAgPSBuZXcgUmVjZWl2ZVBhY2soZGIpOworCQkJCQkJcnAuc2V0UHJlUmVjZWl2ZUhvb2soCisJCQkJCQkJCW5ldyBQcmVSZWNlaXZlSG9vaygpIHsKKwkJCQkJCQkJCUBPdmVycmlkZQorCQkJCQkJCQkJcHVibGljIHZvaWQgb25QcmVSZWNlaXZlKFJlY2VpdmVQYWNrIHJlY2VpdmVQYWNrLAorCQkJCQkJCQkJCQlDb2xsZWN0aW9uPFJlY2VpdmVDb21tYW5kPiBjbWRzKSB7CisJCQkJCQkJCQkJZm9yIChSZWNlaXZlQ29tbWFuZCBjbWQgOiBjbWRzKSB7CisJCQkJCQkJCQkJCXByb2Nlc3NlZFJlZnMuYWRkKGNtZC5nZXRSZWZOYW1lKCkpOworCQkJCQkJCQkJCX0KKwkJCQkJCQkJCX0KKwkJCQkJCQkJfSk7CisJCQkJCQlyZXR1cm4gcnA7CiAJCQkJCX0KIAkJCQl9KTsKIAkJdXJpID0gdGVzdFByb3RvY29sLnJlZ2lzdGVyKGN0eCwgc2VydmVyKTsKQEAgLTE5Niw0ICsyMTMsNDUgQEAgcHVibGljIHZvaWQgbGltaXRDb21tYW5kQnl0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJfQogCQl9CiAJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCBjb21tYW5kT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJVGVzdFJlcG9zaXRvcnk8Pz4gdHIgPSBuZXcgVGVzdFJlcG9zaXRvcnk8PihjbGllbnQpOworCQlMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkvLyBBcmJpdHJhcnkgbm9uLXNvcnRlZCBvcmRlci4KKwkJZm9yIChpbnQgaSA9IDk7IGkgPj0gMDsgaS0tKSB7CisJCQlTdHJpbmcgbmFtZSA9ICJyZWZzL2hlYWRzL2IiICsgaTsKKwkJCXRyLmJyYW5jaChuYW1lKS5jb21taXQoKS5jcmVhdGUoKTsKKwkJCVJlbW90ZVJlZlVwZGF0ZSBycnUgPSBuZXcgUmVtb3RlUmVmVXBkYXRlKGNsaWVudCwgbmFtZSwgbmFtZSwgZmFsc2UsIG51bGwsCisJCQkJCU9iamVjdElkLnplcm9JZCgpKTsKKwkJCXVwZGF0ZXMuYWRkKHJydSk7CisJCX0KKworCQlQdXNoUmVzdWx0IHJlc3VsdDsKKwkJdHJ5IChUcmFuc3BvcnQgdG4gPSB0ZXN0UHJvdG9jb2wub3Blbih1cmksIGNsaWVudCwgInNlcnZlciIpKSB7CisJCQlyZXN1bHQgPSB0bi5wdXNoKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsIHVwZGF0ZXMpOworCQl9CisKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcmVtb3RlVXBkYXRlIDogcmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkgeworCQkJYXNzZXJ0RXF1YWxzKAorCQkJCQkidXBkYXRlIHNob3VsZCBzdWNjZWVkIG9uICIgKyByZW1vdGVVcGRhdGUuZ2V0UmVtb3RlTmFtZSgpLAorCQkJCQlSZW1vdGVSZWZVcGRhdGUuU3RhdHVzLk9LLCByZW1vdGVVcGRhdGUuZ2V0U3RhdHVzKCkpOworCQl9CisKKwkJTGlzdDxTdHJpbmc+IGV4cGVjdGVkID0gcmVtb3RlUmVmTmFtZXModXBkYXRlcyk7CisJCWFzc2VydEVxdWFscygKKwkJCQkicmVmIG5hbWVzIHByb2Nlc3NlZCBieSBSZWNlaXZlUGFjayBzaG91bGQgbWF0Y2ggaW5wdXQgcmVmIG5hbWVzIGluIG9yZGVyIiwKKwkJCQlleHBlY3RlZCwgcHJvY2Vzc2VkUmVmcyk7CisJCWFzc2VydEVxdWFscygKKwkJCQkicmVtb3RlIHJlZiBuYW1lcyBzaG91bGQgbWF0Y2ggaW5wdXQgcmVmIG5hbWVzIGluIG9yZGVyIiwKKwkJCQlleHBlY3RlZCwgcmVtb3RlUmVmTmFtZXMocmVzdWx0LmdldFJlbW90ZVVwZGF0ZXMoKSkpOworCX0KKworCXByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiByZW1vdGVSZWZOYW1lcyhDb2xsZWN0aW9uPFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcykgeworCQlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHUgOiB1cGRhdGVzKSB7CisJCQlyZXN1bHQuYWRkKHUuZ2V0UmVtb3RlTmFtZSgpKTsKKwkJfQorCQlyZXR1cm4gcmVzdWx0OworCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3NUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzVGVzdC5qYXZhCmluZGV4IDEwNGE2OWMuLjYxMWNkMGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3NUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzc1Rlc3QuamF2YQpAQCAtNDIyLDcgKzQyMiw3IEBAIHByaXZhdGUgY2xhc3MgTW9ja1B1c2hDb25uZWN0aW9uIGV4dGVuZHMgQmFzZUNvbm5lY3Rpb24gaW1wbGVtZW50cwogCQkJUHVzaENvbm5lY3Rpb24gewogCQlNb2NrUHVzaENvbm5lY3Rpb24oKSB7CiAJCQlmaW5hbCBNYXA8U3RyaW5nLCBSZWY+IHJlZnNNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCQlmb3IgKGZpbmFsIFJlZiByIDogYWR2ZXJ0aXNlZFJlZnMpCisJCQlmb3IgKFJlZiByIDogYWR2ZXJ0aXNlZFJlZnMpCiAJCQkJcmVmc01hcC5wdXQoci5nZXROYW1lKCksIHIpOwogCQkJYXZhaWxhYmxlKHJlZnNNYXApOwogCQl9CkBAIC00NDMsNyArNDQzLDcgQEAgcHVibGljIHZvaWQgcHVzaChQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJcHVibGljIHZvaWQgcHVzaChQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJCQlNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlZnNUb1VwZGF0ZSkKIAkJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKLQkJCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlZnNUb1VwZGF0ZS52YWx1ZXMoKSkgeworCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVmc1RvVXBkYXRlLnZhbHVlcygpKSB7CiAJCQkJYXNzZXJ0RXF1YWxzKFN0YXR1cy5OT1RfQVRURU1QVEVELCBycnUuZ2V0U3RhdHVzKCkpOwogCQkJCXJydS5zZXRTdGF0dXMoY29ubmVjdGlvblVwZGF0ZVN0YXR1cyk7CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrQWR2ZXJ0aXNlUmVmc0hvb2tUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrQWR2ZXJ0aXNlUmVmc0hvb2tUZXN0LmphdmEKaW5kZXggMzgzNmI3ZC4uMGZmYmU2NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFja0FkdmVydGlzZVJlZnNIb29rVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZVBhY2tBZHZlcnRpc2VSZWZzSG9va1Rlc3QuamF2YQpAQCAtMTM2LDcgKzEzNiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJIaWRlc1ByaXZhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJdHJ5IChUcmFuc3BvcnRMb2NhbCB0ID0gbmV3IFRyYW5zcG9ydExvY2FsKHNyYywgdXJpT2YoZHN0KSwKIAkJCQlkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKIAkJCUBPdmVycmlkZQotCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soZmluYWwgUmVwb3NpdG9yeSBkYikgeworCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBkYikgewogCQkJCWRiLmNsb3NlKCk7CiAJCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKIApAQCAtMTk5LDYgKzE5OSwyMyBAQCBwdWJsaWMgdm9pZCBhZHZlcnRpc2VSZWZzKFVwbG9hZFBhY2sgdXBsb2FkUGFjaykKIAkJYXNzZXJ0RmFsc2UoaGF2ZXMuZ2V0KCkuY29udGFpbnMoUCkpOwogCX0KIAorCXByaXZhdGUgVHJhbnNwb3J0TG9jYWwgbmV3VHJhbnNwb3J0TG9jYWxXaXRoU3RyaWN0VmFsaWRhdGlvbigpCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJcmV0dXJuIG5ldyBUcmFuc3BvcnRMb2NhbChzcmMsIHVyaU9mKGRzdCksIGRzdC5nZXREaXJlY3RvcnkoKSkgeworCQkJQE92ZXJyaWRlCisJCQlSZWNlaXZlUGFjayBjcmVhdGVSZWNlaXZlUGFjayhSZXBvc2l0b3J5IGRiKSB7CisJCQkJZGIuY2xvc2UoKTsKKwkJCQlkc3QuaW5jcmVtZW50T3BlbigpOworCisJCQkJZmluYWwgUmVjZWl2ZVBhY2sgcnAgPSBzdXBlci5jcmVhdGVSZWNlaXZlUGFjayhkc3QpOworCQkJCXJwLnNldENoZWNrUmVjZWl2ZWRPYmplY3RzKHRydWUpOworCQkJCXJwLnNldENoZWNrUmVmZXJlbmNlZE9iamVjdHNBcmVSZWFjaGFibGUodHJ1ZSk7CisJCQkJcnAuc2V0QWR2ZXJ0aXNlUmVmc0hvb2sobmV3IEhpZGVQcml2YXRlSG9vaygpKTsKKwkJCQlyZXR1cm4gcnA7CisJCQl9CisJCX07CisJfQorCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0U3VjY2VzcygpIHRocm93cyBFeGNlcHRpb24gewogCQkvLyBNYW51YWxseSBmb3JjZSBhIGRlbHRhIG9mIGFuIG9iamVjdCBzbyB3ZSByZXVzZSBpdCBsYXRlci4KQEAgLTIzMCwxOSArMjQ3LDcgQEAgcHVibGljIHZvaWQgdGVzdFN1Y2Nlc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCQkvLyBQdXNoIHRoaXMgbmV3IGNvbnRlbnQgdG8gdGhlIHJlbW90ZSwgZG9pbmcgc3RyaWN0IHZhbGlkYXRpb24uCiAJCS8vCi0JCVRyYW5zcG9ydExvY2FsIHQgPSBuZXcgVHJhbnNwb3J0TG9jYWwoc3JjLCB1cmlPZihkc3QpLCBkc3QuZ2V0RGlyZWN0b3J5KCkpIHsKLQkJCUBPdmVycmlkZQotCQkJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soZmluYWwgUmVwb3NpdG9yeSBkYikgewotCQkJCWRiLmNsb3NlKCk7Ci0JCQkJZHN0LmluY3JlbWVudE9wZW4oKTsKLQotCQkJCWZpbmFsIFJlY2VpdmVQYWNrIHJwID0gc3VwZXIuY3JlYXRlUmVjZWl2ZVBhY2soZHN0KTsKLQkJCQlycC5zZXRDaGVja1JlY2VpdmVkT2JqZWN0cyh0cnVlKTsKLQkJCQlycC5zZXRDaGVja1JlZmVyZW5jZWRPYmplY3RzQXJlUmVhY2hhYmxlKHRydWUpOwotCQkJCXJwLnNldEFkdmVydGlzZVJlZnNIb29rKG5ldyBIaWRlUHJpdmF0ZUhvb2soKSk7Ci0JCQkJcmV0dXJuIHJwOwotCQkJfQotCQl9OworCQlQdXNoUmVzdWx0IHI7CiAJCVJlbW90ZVJlZlVwZGF0ZSB1ID0gbmV3IFJlbW90ZVJlZlVwZGF0ZSggLy8KIAkJCQlzcmMsIC8vCiAJCQkJUl9NQVNURVIsIC8vIHNyYyBuYW1lCkBAIC0yNTEsMTIgKzI1Niw5IEBAIFJlY2VpdmVQYWNrIGNyZWF0ZVJlY2VpdmVQYWNrKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKIAkJCQludWxsLCAvLyBsb2NhbCB0cmFja2luZyBicmFuY2gKIAkJCQludWxsIC8vIGV4cGVjdGVkIGlkCiAJCSk7Ci0JCVB1c2hSZXN1bHQgcjsKLQkJdHJ5IHsKKwkJdHJ5IChUcmFuc3BvcnRMb2NhbCB0ID0gbmV3VHJhbnNwb3J0TG9jYWxXaXRoU3RyaWN0VmFsaWRhdGlvbigpKSB7CiAJCQl0LnNldFB1c2hUaGluKHRydWUpOwogCQkJciA9IHQucHVzaChQTSwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHUpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXQuY2xvc2UoKTsKIAkJfQogCiAJCWFzc2VydE5vdE51bGwoImhhdmUgcmVzdWx0Iiwgcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZUNvbmZpZ1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnVGVzdC5qYXZhCmluZGV4IGEwY2YwZDIuLjlhYWJkNzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlQ29uZmlnVGVzdC5qYXZhCkBAIC02NywxMiArNjcsMTIgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJY29uZmlnID0gbmV3IENvbmZpZygpOwogCX0KIAotCXByaXZhdGUgdm9pZCByZWFkQ29uZmlnKGZpbmFsIFN0cmluZyBkYXQpIHRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgcmVhZENvbmZpZyhTdHJpbmcgZGF0KSB0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCWNvbmZpZyA9IG5ldyBDb25maWcoKTsKIAkJY29uZmlnLmZyb21UZXh0KGRhdCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ29uZmlnKGZpbmFsIFN0cmluZyBleHApIHsKKwlwcml2YXRlIHZvaWQgY2hlY2tDb25maWcoU3RyaW5nIGV4cCkgewogCQlhc3NlcnRFcXVhbHMoZXhwLCBjb25maWcudG9UZXh0KCkpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZE91dHB1dFN0cmVhbVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRPdXRwdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggNDU3MTYxOS4uNGQzZTE2MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZE91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kT3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0yNTksNyArMjU5LDcgQEAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9yX1JlamVjdHNCYWRCdWZmZXJTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgYXNzZXJ0QnVmZmVyKGZpbmFsIFN0cmluZyBleHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIGFzc2VydEJ1ZmZlcihTdHJpbmcgZXhwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoZXhwLCBuZXcgU3RyaW5nKHJhd091dC50b0J5dGVBcnJheSgpLAogCQkJCUNvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0VGVzdC5qYXZhCmluZGV4IGQ0YzQ3ZDMuLmMyMzk5MjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0VGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0VGVzdC5qYXZhCkBAIC0xNDIsNyArMTQyLDcgQEAgcHVibGljIHZvaWQgdGVzdEZpbmRSZW1vdGVSZWZVcGRhdGVzV2lsZGNhcmROb1RyYWNraW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKDEyLCByZXN1bHQuc2l6ZSgpKTsKIAkJYm9vbGVhbiBmb3VuZEEgPSBmYWxzZTsKIAkJYm9vbGVhbiBmb3VuZEIgPSBmYWxzZTsKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0KSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdCkgewogCQkJaWYgKCJyZWZzL2hlYWRzL2EiLmVxdWFscyhycnUuZ2V0U3JjUmVmKCkpCiAJCQkJCSYmICJyZWZzL2hlYWRzL3Rlc3QvYSIuZXF1YWxzKHJydS5nZXRSZW1vdGVOYW1lKCkpKQogCQkJCWZvdW5kQSA9IHRydWU7CkBAIC0xNzQsNyArMTc0LDcgQEAgcHVibGljIHZvaWQgdGVzdEZpbmRSZW1vdGVSZWZVcGRhdGVzVHdvUmVmU3BlY3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlhc3NlcnRFcXVhbHMoMiwgcmVzdWx0LnNpemUoKSk7CiAJCWJvb2xlYW4gZm91bmRBID0gZmFsc2U7CiAJCWJvb2xlYW4gZm91bmRDID0gZmFsc2U7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlc3VsdCkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQpIHsKIAkJCWlmICgicmVmcy9oZWFkcy9hIi5lcXVhbHMocnJ1LmdldFNyY1JlZigpKQogCQkJCQkmJiAicmVmcy9oZWFkcy9iIi5lcXVhbHMocnJ1LmdldFJlbW90ZU5hbWUoKSkpCiAJCQkJZm91bmRBID0gdHJ1ZTsKQEAgLTIzMyw3ICsyMzMsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RmluZFJlbW90ZVJlZlVwZGF0ZXNXaXRoTGVhc2VzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKDIsIHJlc3VsdC5zaXplKCkpOwogCQlib29sZWFuIGZvdW5kQSA9IGZhbHNlOwogCQlib29sZWFuIGZvdW5kQyA9IGZhbHNlOwotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZXN1bHQpIHsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogcmVzdWx0KSB7CiAJCQlpZiAoInJlZnMvaGVhZHMvYSIuZXF1YWxzKHJydS5nZXRTcmNSZWYoKSkKIAkJCQkJJiYgInJlZnMvaGVhZHMvYiIuZXF1YWxzKHJydS5nZXRSZW1vdGVOYW1lKCkpKSB7CiAJCQkJZm91bmRBID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja1Rlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFja1Rlc3QuamF2YQppbmRleCBhODEyN2FiLi5lZjA4M2RhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrVGVzdC5qYXZhCkBAIC0xLDIyICsxLDQxIEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5oYXNJdGVtczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMudGhlSW5zdGFuY2U7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUGFja1Byb3RvY29sRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzLkRmc0dhcmJhZ2VDb2xsZWN0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmcy5EZnNSZXBvc2l0b3J5RGVzY3JpcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmRmcy5Jbk1lbW9yeVJlcG9zaXRvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5qdW5pdC5UZXN0UmVwb3NpdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5OdWxsUHJvZ3Jlc3NNb25pdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWY7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5TZXRzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlRleHRQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkJsb2I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2VHJlZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2VGFnOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVwbG9hZFBhY2suUmVxdWVzdFBvbGljeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5VcGxvYWRQYWNrRmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uTnVsbE91dHB1dFN0cmVhbTsKIGltcG9ydCBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnM7CiBpbXBvcnQgb3JnLmp1bml0LkFmdGVyOwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC0xNzAsNCArMTg5LDg5OSBAQCBwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hSZWFjaGFibGVCbG9iV2l0aG91dEJpdG1hcCgpIHRocm93cyBFeGNlcHRpb24gewogCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBSZWZTcGVjKGJsb2IubmFtZSgpKSkpOwogCQl9CiAJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hXaXRoQmxvYk5vbmVGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW5NZW1vcnlSZXBvc2l0b3J5IHNlcnZlcjIgPSBuZXdSZXBvKCJzZXJ2ZXIyIik7CisJCVRlc3RSZXBvc2l0b3J5PEluTWVtb3J5UmVwb3NpdG9yeT4gcmVtb3RlMiA9CisJCQkJbmV3IFRlc3RSZXBvc2l0b3J5PD4oc2VydmVyMik7CisJCVJldkJsb2IgYmxvYjEgPSByZW1vdGUyLmJsb2IoImZvb2JhciIpOworCQlSZXZCbG9iIGJsb2IyID0gcmVtb3RlMi5ibG9iKCJmb29iYSIpOworCQlSZXZUcmVlIHRyZWUgPSByZW1vdGUyLnRyZWUocmVtb3RlMi5maWxlKCIxIiwgYmxvYjEpLAorCQkJCXJlbW90ZTIuZmlsZSgiMiIsIGJsb2IyKSk7CisJCVJldkNvbW1pdCBjb21taXQgPSByZW1vdGUyLmNvbW1pdCh0cmVlKTsKKwkJcmVtb3RlMi51cGRhdGUoIm1hc3RlciIsIGNvbW1pdCk7CisKKwkJc2VydmVyMi5nZXRDb25maWcoKS5zZXRCb29sZWFuKCJ1cGxvYWRwYWNrIiwgbnVsbCwgImFsbG93ZmlsdGVyIiwgdHJ1ZSk7CisKKwkJdGVzdFByb3RvY29sID0gbmV3IFRlc3RQcm90b2NvbDw+KAorCQkJCW5ldyBVcGxvYWRQYWNrRmFjdG9yeTxPYmplY3Q+KCkgeworCQkJCQlAT3ZlcnJpZGUKKwkJCQkJcHVibGljIFVwbG9hZFBhY2sgY3JlYXRlKE9iamVjdCByZXEsIFJlcG9zaXRvcnkgZGIpCisJCQkJCQkJdGhyb3dzIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAorCQkJCQkJCVNlcnZpY2VOb3RBdXRob3JpemVkRXhjZXB0aW9uIHsKKwkJCQkJCVVwbG9hZFBhY2sgdXAgPSBuZXcgVXBsb2FkUGFjayhkYik7CisJCQkJCQlyZXR1cm4gdXA7CisJCQkJCX0KKwkJCQl9LCBudWxsKTsKKwkJdXJpID0gdGVzdFByb3RvY29sLnJlZ2lzdGVyKGN0eCwgc2VydmVyMik7CisKKwkJdHJ5IChUcmFuc3BvcnQgdG4gPSB0ZXN0UHJvdG9jb2wub3Blbih1cmksIGNsaWVudCwgInNlcnZlcjIiKSkgeworCQkJdG4uc2V0RmlsdGVyQmxvYkxpbWl0KDApOworCQkJdG4uZmV0Y2goTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSwKKwkJCQkJQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChuZXcgUmVmU3BlYyhjb21taXQubmFtZSgpKSkpOworCQkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHRyZWUudG9PYmplY3RJZCgpKSk7CisJCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGJsb2IxLnRvT2JqZWN0SWQoKSkpOworCQkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChibG9iMi50b09iamVjdElkKCkpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoV2l0aEJsb2JMaW1pdEZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlJbk1lbW9yeVJlcG9zaXRvcnkgc2VydmVyMiA9IG5ld1JlcG8oInNlcnZlcjIiKTsKKwkJVGVzdFJlcG9zaXRvcnk8SW5NZW1vcnlSZXBvc2l0b3J5PiByZW1vdGUyID0KKwkJCQluZXcgVGVzdFJlcG9zaXRvcnk8PihzZXJ2ZXIyKTsKKwkJUmV2QmxvYiBsb25nQmxvYiA9IHJlbW90ZTIuYmxvYigiZm9vYmFyIik7CisJCVJldkJsb2Igc2hvcnRCbG9iID0gcmVtb3RlMi5ibG9iKCJmb29iYSIpOworCQlSZXZUcmVlIHRyZWUgPSByZW1vdGUyLnRyZWUocmVtb3RlMi5maWxlKCIxIiwgbG9uZ0Jsb2IpLAorCQkJCXJlbW90ZTIuZmlsZSgiMiIsIHNob3J0QmxvYikpOworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlMi5jb21taXQodHJlZSk7CisJCXJlbW90ZTIudXBkYXRlKCJtYXN0ZXIiLCBjb21taXQpOworCisJCXNlcnZlcjIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIHRydWUpOworCisJCXRlc3RQcm90b2NvbCA9IG5ldyBUZXN0UHJvdG9jb2w8PigKKwkJCQluZXcgVXBsb2FkUGFja0ZhY3Rvcnk8T2JqZWN0PigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBVcGxvYWRQYWNrIGNyZWF0ZShPYmplY3QgcmVxLCBSZXBvc2l0b3J5IGRiKQorCQkJCQkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKKwkJCQkJCQlTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7CisJCQkJCQlVcGxvYWRQYWNrIHVwID0gbmV3IFVwbG9hZFBhY2soZGIpOworCQkJCQkJcmV0dXJuIHVwOworCQkJCQl9CisJCQkJfSwgbnVsbCk7CisJCXVyaSA9IHRlc3RQcm90b2NvbC5yZWdpc3RlcihjdHgsIHNlcnZlcjIpOworCisJCXRyeSAoVHJhbnNwb3J0IHRuID0gdGVzdFByb3RvY29sLm9wZW4odXJpLCBjbGllbnQsICJzZXJ2ZXIyIikpIHsKKwkJCXRuLnNldEZpbHRlckJsb2JMaW1pdCg1KTsKKwkJCXRuLmZldGNoKE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0UsCisJCQkJCUNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IFJlZlNwZWMoY29tbWl0Lm5hbWUoKSkpKTsKKwkJCWFzc2VydEZhbHNlKGNsaWVudC5oYXNPYmplY3QobG9uZ0Jsb2IudG9PYmplY3RJZCgpKSk7CisJCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3Qoc2hvcnRCbG9iLnRvT2JqZWN0SWQoKSkpOworCQl9CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0RmV0Y2hXaXRoQmxvYkxpbWl0RmlsdGVyQW5kQml0bWFwcygpIHRocm93cyBFeGNlcHRpb24geworCQlJbk1lbW9yeVJlcG9zaXRvcnkgc2VydmVyMiA9IG5ld1JlcG8oInNlcnZlcjIiKTsKKwkJVGVzdFJlcG9zaXRvcnk8SW5NZW1vcnlSZXBvc2l0b3J5PiByZW1vdGUyID0KKwkJCQluZXcgVGVzdFJlcG9zaXRvcnk8PihzZXJ2ZXIyKTsKKwkJUmV2QmxvYiBsb25nQmxvYiA9IHJlbW90ZTIuYmxvYigiZm9vYmFyIik7CisJCVJldkJsb2Igc2hvcnRCbG9iID0gcmVtb3RlMi5ibG9iKCJmb29iYSIpOworCQlSZXZUcmVlIHRyZWUgPSByZW1vdGUyLnRyZWUocmVtb3RlMi5maWxlKCIxIiwgbG9uZ0Jsb2IpLAorCQkJCXJlbW90ZTIuZmlsZSgiMiIsIHNob3J0QmxvYikpOworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlMi5jb21taXQodHJlZSk7CisJCXJlbW90ZTIudXBkYXRlKCJtYXN0ZXIiLCBjb21taXQpOworCisJCXNlcnZlcjIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIHRydWUpOworCisJCS8vIGdlbmVyYXRlIGJpdG1hcHMKKwkJbmV3IERmc0dhcmJhZ2VDb2xsZWN0b3Ioc2VydmVyMikucGFjayhudWxsKTsKKwkJc2VydmVyMi5zY2FuRm9yUmVwb0NoYW5nZXMoKTsKKworCQl0ZXN0UHJvdG9jb2wgPSBuZXcgVGVzdFByb3RvY29sPD4oCisJCQkJbmV3IFVwbG9hZFBhY2tGYWN0b3J5PE9iamVjdD4oKSB7CisJCQkJCUBPdmVycmlkZQorCQkJCQlwdWJsaWMgVXBsb2FkUGFjayBjcmVhdGUoT2JqZWN0IHJlcSwgUmVwb3NpdG9yeSBkYikKKwkJCQkJCQl0aHJvd3MgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24sCisJCQkJCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24geworCQkJCQkJVXBsb2FkUGFjayB1cCA9IG5ldyBVcGxvYWRQYWNrKGRiKTsKKwkJCQkJCXJldHVybiB1cDsKKwkJCQkJfQorCQkJCX0sIG51bGwpOworCQl1cmkgPSB0ZXN0UHJvdG9jb2wucmVnaXN0ZXIoY3R4LCBzZXJ2ZXIyKTsKKworCQl0cnkgKFRyYW5zcG9ydCB0biA9IHRlc3RQcm90b2NvbC5vcGVuKHVyaSwgY2xpZW50LCAic2VydmVyMiIpKSB7CisJCQl0bi5zZXRGaWx0ZXJCbG9iTGltaXQoNSk7CisJCQl0bi5mZXRjaChOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFLAorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBSZWZTcGVjKGNvbW1pdC5uYW1lKCkpKSk7CisJCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGxvbmdCbG9iLnRvT2JqZWN0SWQoKSkpOworCQkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHNob3J0QmxvYi50b09iamVjdElkKCkpKTsKKwkJfQorCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdEZldGNoV2l0aE5vblN1cHBvcnRpbmdTZXJ2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJSW5NZW1vcnlSZXBvc2l0b3J5IHNlcnZlcjIgPSBuZXdSZXBvKCJzZXJ2ZXIyIik7CisJCVRlc3RSZXBvc2l0b3J5PEluTWVtb3J5UmVwb3NpdG9yeT4gcmVtb3RlMiA9CisJCQkJbmV3IFRlc3RSZXBvc2l0b3J5PD4oc2VydmVyMik7CisJCVJldkJsb2IgYmxvYiA9IHJlbW90ZTIuYmxvYigiZm9vIik7CisJCVJldlRyZWUgdHJlZSA9IHJlbW90ZTIudHJlZShyZW1vdGUyLmZpbGUoIjEiLCBibG9iKSk7CisJCVJldkNvbW1pdCBjb21taXQgPSByZW1vdGUyLmNvbW1pdCh0cmVlKTsKKwkJcmVtb3RlMi51cGRhdGUoIm1hc3RlciIsIGNvbW1pdCk7CisKKwkJc2VydmVyMi5nZXRDb25maWcoKS5zZXRCb29sZWFuKCJ1cGxvYWRwYWNrIiwgbnVsbCwgImFsbG93ZmlsdGVyIiwgZmFsc2UpOworCisJCXRlc3RQcm90b2NvbCA9IG5ldyBUZXN0UHJvdG9jb2w8PigKKwkJCQluZXcgVXBsb2FkUGFja0ZhY3Rvcnk8T2JqZWN0PigpIHsKKwkJCQkJQE92ZXJyaWRlCisJCQkJCXB1YmxpYyBVcGxvYWRQYWNrIGNyZWF0ZShPYmplY3QgcmVxLCBSZXBvc2l0b3J5IGRiKQorCQkJCQkJCXRocm93cyBTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKKwkJCQkJCQlTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7CisJCQkJCQlVcGxvYWRQYWNrIHVwID0gbmV3IFVwbG9hZFBhY2soZGIpOworCQkJCQkJcmV0dXJuIHVwOworCQkJCQl9CisJCQkJfSwgbnVsbCk7CisJCXVyaSA9IHRlc3RQcm90b2NvbC5yZWdpc3RlcihjdHgsIHNlcnZlcjIpOworCisJCXRyeSAoVHJhbnNwb3J0IHRuID0gdGVzdFByb3RvY29sLm9wZW4odXJpLCBjbGllbnQsICJzZXJ2ZXIyIikpIHsKKwkJCXRuLnNldEZpbHRlckJsb2JMaW1pdCgwKTsKKworCQkJdGhyb3duLmV4cGVjdChUcmFuc3BvcnRFeGNlcHRpb24uY2xhc3MpOworCQkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoImZpbHRlciByZXF1aXJlcyBzZXJ2ZXIgdG8gYWR2ZXJ0aXNlIHRoYXQgY2FwYWJpbGl0eSIpOworCisJCQl0bi5mZXRjaChOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFLAorCQkJCQlDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBSZWZTcGVjKGNvbW1pdC5uYW1lKCkpKSk7CisJCX0KKwl9CisKKwkvKgorCSAqIEludm9rZXMgVXBsb2FkUGFjayB3aXRoIHByb3RvY29sIHYyIGFuZCBzZW5kcyBpdCB0aGUgZ2l2ZW4gbGluZXMsCisJICogYW5kIHJldHVybnMgVXBsb2FkUGFjaydzIG91dHB1dCBzdHJlYW0uCisJICovCisJcHJpdmF0ZSBCeXRlQXJyYXlJbnB1dFN0cmVhbSB1cGxvYWRQYWNrVjJTZXR1cChSZXF1ZXN0UG9saWN5IHJlcXVlc3RQb2xpY3ksCisJCQlSZWZGaWx0ZXIgcmVmRmlsdGVyLCBTdHJpbmcuLi4gaW5wdXRMaW5lcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKwkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHNlbmQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCVBhY2tldExpbmVPdXQgcGNrT3V0ID0gbmV3IFBhY2tldExpbmVPdXQoc2VuZCk7CisJCWZvciAoU3RyaW5nIGxpbmUgOiBpbnB1dExpbmVzKSB7CisJCQlpZiAobGluZSA9PSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQkJcGNrT3V0LmVuZCgpOworCQkJfSBlbHNlIGlmIChsaW5lID09IFBhY2tldExpbmVJbi5ERUxJTSkgeworCQkJCXBja091dC53cml0ZURlbGltKCk7CisJCQl9IGVsc2UgeworCQkJCXBja091dC53cml0ZVN0cmluZyhsaW5lKTsKKwkJCX0KKwkJfQorCisJCXNlcnZlci5nZXRDb25maWcoKS5zZXRTdHJpbmcoInByb3RvY29sIiwgbnVsbCwgInZlcnNpb24iLCAiMiIpOworCQlVcGxvYWRQYWNrIHVwID0gbmV3IFVwbG9hZFBhY2soc2VydmVyKTsKKwkJaWYgKHJlcXVlc3RQb2xpY3kgIT0gbnVsbCkKKwkJCXVwLnNldFJlcXVlc3RQb2xpY3kocmVxdWVzdFBvbGljeSk7CisJCWlmIChyZWZGaWx0ZXIgIT0gbnVsbCkKKwkJCXVwLnNldFJlZkZpbHRlcihyZWZGaWx0ZXIpOworCQl1cC5zZXRFeHRyYVBhcmFtZXRlcnMoU2V0cy5vZigidmVyc2lvbj0yIikpOworCisJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSByZWN2ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQl1cC51cGxvYWQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNlbmQudG9CeXRlQXJyYXkoKSksIHJlY3YsIG51bGwpOworCisJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVjdi50b0J5dGVBcnJheSgpKTsKKwl9CisKKwkvKgorCSAqIEludm9rZXMgVXBsb2FkUGFjayB3aXRoIHByb3RvY29sIHYyIGFuZCBzZW5kcyBpdCB0aGUgZ2l2ZW4gbGluZXMuCisJICogUmV0dXJucyBVcGxvYWRQYWNrJ3Mgb3V0cHV0IHN0cmVhbSwgbm90IGluY2x1ZGluZyB0aGUgY2FwYWJpbGl0eQorCSAqIGFkdmVydGlzZW1lbnQgYnkgdGhlIHNlcnZlci4KKwkgKi8KKwlwcml2YXRlIEJ5dGVBcnJheUlucHV0U3RyZWFtIHVwbG9hZFBhY2tWMihSZXF1ZXN0UG9saWN5IHJlcXVlc3RQb2xpY3ksCisJCQlSZWZGaWx0ZXIgcmVmRmlsdGVyLCBTdHJpbmcuLi4gaW5wdXRMaW5lcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPQorCQkJdXBsb2FkUGFja1YyU2V0dXAocmVxdWVzdFBvbGljeSwgcmVmRmlsdGVyLCBpbnB1dExpbmVzKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQkvLyBkcmFpbiBjYXBhYmlsaXRpZXMKKwkJd2hpbGUgKHBja0luLnJlYWRTdHJpbmcoKSAhPSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQkvLyBkbyBub3RoaW5nCisJCX0KKwkJcmV0dXJuIHJlY3ZTdHJlYW07CisJfQorCisJcHJpdmF0ZSBCeXRlQXJyYXlJbnB1dFN0cmVhbSB1cGxvYWRQYWNrVjIoU3RyaW5nLi4uIGlucHV0TGluZXMpIHRocm93cyBFeGNlcHRpb24geworCQlyZXR1cm4gdXBsb2FkUGFja1YyKG51bGwsIG51bGwsIGlucHV0TGluZXMpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyQ2FwYWJpbGl0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPQorCQkJdXBsb2FkUGFja1YyU2V0dXAobnVsbCwgbnVsbCwgUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJ2ZXJzaW9uIDIiKSk7CisJCWFzc2VydFRoYXQoCisJCQlBcnJheXMuYXNMaXN0KHBja0luLnJlYWRTdHJpbmcoKSwgcGNrSW4ucmVhZFN0cmluZygpKSwKKwkJCS8vIFRPRE8oam9uYXRoYW50YW5teSkgVGhpcyBjaGVjayBpcyB3cml0dGVuIHRoaXMgd2F5CisJCQkvLyB0byBtYWtlIGl0IHNpbXBsZSB0byBzZWUgdGhhdCB3ZSBleHBlY3QgdGhpcyBsaXN0IG9mCisJCQkvLyBjYXBhYmlsaXRpZXMsIGJ1dCBwcm9iYWJseSBzaG91bGQgYmUgbG9vc2VuZWQgdG8KKwkJCS8vIGFsbG93IGFkZGl0aW9uYWwgY29tbWFuZHMgdG8gYmUgYWRkZWQgdG8gdGhlIGxpc3QsCisJCQkvLyBhbmQgYWRkaXRpb25hbCBjYXBhYmlsaXRpZXMgdG8gYmUgYWRkZWQgdG8gZXhpc3RpbmcKKwkJCS8vIGNvbW1hbmRzIHdpdGhvdXQgcmVxdWlyaW5nIHRlc3QgY2hhbmdlcy4KKwkJCWhhc0l0ZW1zKCJscy1yZWZzIiwgImZldGNoPXNoYWxsb3ciKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyQ2FwYWJpbGl0aWVzQWxsb3dGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJc2VydmVyLmdldENvbmZpZygpLnNldEJvb2xlYW4oInVwbG9hZHBhY2siLCBudWxsLCAiYWxsb3dmaWx0ZXIiLCB0cnVlKTsKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9CisJCQl1cGxvYWRQYWNrVjJTZXR1cChudWxsLCBudWxsLCBQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInZlcnNpb24gMiIpKTsKKwkJYXNzZXJ0VGhhdCgKKwkJCUFycmF5cy5hc0xpc3QocGNrSW4ucmVhZFN0cmluZygpLCBwY2tJbi5yZWFkU3RyaW5nKCkpLAorCQkJLy8gVE9ETyhqb25hdGhhbnRhbm15KSBUaGlzIGNoZWNrIG92ZXJzcGVjaWZpZXMgdGhlCisJCQkvLyBvcmRlciBvZiB0aGUgY2FwYWJpbGl0aWVzIG9mICJmZXRjaCIuCisJCQloYXNJdGVtcygibHMtcmVmcyIsICJmZXRjaD1maWx0ZXIgc2hhbGxvdyIpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlAU3VwcHJlc3NXYXJuaW5ncygiYm94aW5nIikKKwlwdWJsaWMgdm9pZCB0ZXN0VjJFbXB0eVJlcXVlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMihQYWNrZXRMaW5lSW4uRU5EKTsKKwkJLy8gVmVyaWZ5IHRoYXQgdGhlcmUgaXMgbm90aGluZyBtb3JlIGFmdGVyIHRoZSBjYXBhYmlsaXR5CisJCS8vIGFkdmVydGlzZW1lbnQuCisJCWFzc2VydFRoYXQocmVjdlN0cmVhbS5hdmFpbGFibGUoKSwgaXMoMCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCB0aXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgibWVzc2FnZSIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJtYXN0ZXIiLCB0aXApOworCQlzZXJ2ZXIudXBkYXRlUmVmKCJIRUFEIikubGluaygicmVmcy9oZWFkcy9tYXN0ZXIiKTsKKwkJUmV2VGFnIHRhZyA9IHJlbW90ZS50YWcoInRhZyIsIHRpcCk7CisJCXJlbW90ZS51cGRhdGUoInJlZnMvdGFncy90YWciLCB0YWcpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoImNvbW1hbmQ9bHMtcmVmc1xuIiwgUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiBIRUFEIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGFnLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvdGFncy90YWciKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzU3ltcmVmcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIm1lc3NhZ2UiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgdGlwKTsKKwkJc2VydmVyLnVwZGF0ZVJlZigiSEVBRCIpLmxpbmsoInJlZnMvaGVhZHMvbWFzdGVyIik7CisJCVJldlRhZyB0YWcgPSByZW1vdGUudGFnKCJ0YWciLCB0aXApOworCQlyZW1vdGUudXBkYXRlKCJyZWZzL3RhZ3MvdGFnIiwgdGFnKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKCJjb21tYW5kPWxzLXJlZnNcbiIsIFBhY2tldExpbmVJbi5ERUxJTSwgInN5bXJlZnMiLCBQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIEhFQUQgc3ltcmVmLXRhcmdldDpyZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRhZy50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL3RhZ3MvdGFnIikpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKSA9PSBQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkxzUmVmc1BlZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHRpcCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJtZXNzYWdlIikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoIm1hc3RlciIsIHRpcCk7CisJCXNlcnZlci51cGRhdGVSZWYoIkhFQUQiKS5saW5rKCJyZWZzL2hlYWRzL21hc3RlciIpOworCQlSZXZUYWcgdGFnID0gcmVtb3RlLnRhZygidGFnIiwgdGlwKTsKKwkJcmVtb3RlLnVwZGF0ZSgicmVmcy90YWdzL3RhZyIsIHRhZyk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigiY29tbWFuZD1scy1yZWZzXG4iLCBQYWNrZXRMaW5lSW4uREVMSU0sICJwZWVsIiwgUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiBIRUFEIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KAorCQkJcGNrSW4ucmVhZFN0cmluZygpLAorCQkJaXModGFnLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvdGFncy90YWcgcGVlbGVkOiIKKwkJCQkrIHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzTXVsdGlwbGVDb21tYW5kcygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIm1lc3NhZ2UiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgdGlwKTsKKwkJc2VydmVyLnVwZGF0ZVJlZigiSEVBRCIpLmxpbmsoInJlZnMvaGVhZHMvbWFzdGVyIik7CisJCVJldlRhZyB0YWcgPSByZW1vdGUudGFnKCJ0YWciLCB0aXApOworCQlyZW1vdGUudXBkYXRlKCJyZWZzL3RhZ3MvdGFnIiwgdGFnKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9bHMtcmVmc1xuIiwgUGFja2V0TGluZUluLkRFTElNLCAic3ltcmVmcyIsICJwZWVsIiwgUGFja2V0TGluZUluLkVORCwKKwkJCSJjb21tYW5kPWxzLXJlZnNcbiIsIFBhY2tldExpbmVJbi5ERUxJTSwgUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiBIRUFEIHN5bXJlZi10YXJnZXQ6cmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQoCisJCQlwY2tJbi5yZWFkU3RyaW5nKCksCisJCQlpcyh0YWcudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy90YWdzL3RhZyBwZWVsZWQ6IgorCQkJCSsgdGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgSEVBRCIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRpcC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL2hlYWRzL21hc3RlciIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKHRhZy50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIiByZWZzL3RhZ3MvdGFnIikpOworCQlhc3NlcnRUcnVlKHBja0luLnJlYWRTdHJpbmcoKSA9PSBQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkxzUmVmc1JlZlByZWZpeCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIm1lc3NhZ2UiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgdGlwKTsKKwkJcmVtb3RlLnVwZGF0ZSgib3RoZXIiLCB0aXApOworCQlyZW1vdGUudXBkYXRlKCJ5ZXRBbm90aGVyIiwgdGlwKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9bHMtcmVmc1xuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJyZWYtcHJlZml4IHJlZnMvaGVhZHMvbWFzdGUiLAorCQkJInJlZi1wcmVmaXggcmVmcy9oZWFkcy9vdGhlciIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvbWFzdGVyIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXModGlwLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiIHJlZnMvaGVhZHMvb3RoZXIiKSk7CisJCWFzc2VydFRydWUocGNrSW4ucmVhZFN0cmluZygpID09IFBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyTHNSZWZzUmVmUHJlZml4Tm9TbGFzaCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIm1lc3NhZ2UiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgdGlwKTsKKwkJcmVtb3RlLnVwZGF0ZSgib3RoZXIiLCB0aXApOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1scy1yZWZzXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJInJlZi1wcmVmaXggcmVmcy9oZWFkcy9tYXN0ZSIsCisJCQkicmVmLXByZWZpeCByIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9tYXN0ZXIiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcyh0aXAudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICIgcmVmcy9oZWFkcy9vdGhlciIpKTsKKwkJYXNzZXJ0VHJ1ZShwY2tJbi5yZWFkU3RyaW5nKCkgPT0gUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJMc1JlZnNVbnJlY29nbml6ZWRBcmd1bWVudCgpIHRocm93cyBFeGNlcHRpb24geworCQl0aHJvd24uZXhwZWN0KFBhY2tQcm90b2NvbEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKCJ1bmV4cGVjdGVkIGludmFsaWQtYXJndW1lbnQiKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9bHMtcmVmc1xuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJpbnZhbGlkLWFyZ3VtZW50XG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJLyoKKwkgKiBQYXJzZSBtdWx0aXBsZXhlZCBwYWNrZmlsZSBvdXRwdXQgZnJvbSB1cGxvYWQtcGFjayB1c2luZyBwcm90b2NvbCBWMgorCSAqIGludG8gdGhlIGNsaWVudCByZXBvc2l0b3J5LgorCSAqLworCXByaXZhdGUgUmVjZWl2ZWRQYWNrU3RhdGlzdGljcyBwYXJzZVBhY2soQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXJldHVybiBwYXJzZVBhY2socmVjdlN0cmVhbSwgTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSk7CisJfQorCisJcHJpdmF0ZSBSZWNlaXZlZFBhY2tTdGF0aXN0aWNzIHBhcnNlUGFjayhCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtLCBQcm9ncmVzc01vbml0b3IgcG0pCisJCQl0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU2lkZUJhbmRJbnB1dFN0cmVhbSBzYiA9IG5ldyBTaWRlQmFuZElucHV0U3RyZWFtKAorCQkJCXJlY3ZTdHJlYW0sIHBtLAorCQkJCW5ldyBTdHJpbmdXcml0ZXIoKSwgTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSk7CisJCVBhY2tQYXJzZXIgcHAgPSBjbGllbnQubmV3T2JqZWN0SW5zZXJ0ZXIoKS5uZXdQYWNrUGFyc2VyKHNiKTsKKwkJcHAucGFyc2UoTnVsbFByb2dyZXNzTW9uaXRvci5JTlNUQU5DRSk7CisJCXJldHVybiBwcC5nZXRSZWNlaXZlZFBhY2tTdGF0aXN0aWNzKCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFJlcXVlc3RQb2xpY3lBZHZlcnRpc2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBhZHZlcnRpemVkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IHVuYWR2ZXJ0aXplZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBhZHZlcnRpemVkKTsKKworCQkvLyBUaGlzIHdvcmtzCisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuQURWRVJUSVNFRCwKKwkJCW51bGwsCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBhZHZlcnRpemVkLm5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKworCQkvLyBUaGlzIGRvZXNuJ3QKKwkJdGhyb3duLmV4cGVjdChUcmFuc3BvcnRFeGNlcHRpb24uY2xhc3MpOworCQl0aHJvd24uZXhwZWN0TWVzc2FnZShNYXRjaGVycy5jb250YWluc1N0cmluZygKKwkJCQkJIndhbnQgIiArIHVuYWR2ZXJ0aXplZC5uYW1lKCkgKyAiIG5vdCB2YWxpZCIpKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5BRFZFUlRJU0VELAorCQkJbnVsbCwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIHVuYWR2ZXJ0aXplZC5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFJlcXVlc3RQb2xpY3lSZWFjaGFibGVDb21taXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHJlYWNoYWJsZSA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBhZHZlcnRpemVkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5wYXJlbnQocmVhY2hhYmxlKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IHVucmVhY2hhYmxlID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGFkdmVydGl6ZWQpOworCisJCS8vIFRoaXMgd29ya3MKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5SRUFDSEFCTEVfQ09NTUlULAorCQkJbnVsbCwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIHJlYWNoYWJsZS5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisKKwkJLy8gVGhpcyBkb2Vzbid0CisJCXRocm93bi5leHBlY3QoVHJhbnNwb3J0RXhjZXB0aW9uLmNsYXNzKTsKKwkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoTWF0Y2hlcnMuY29udGFpbnNTdHJpbmcoCisJCQkJCSJ3YW50ICIgKyB1bnJlYWNoYWJsZS5uYW1lKCkgKyAiIG5vdCB2YWxpZCIpKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5SRUFDSEFCTEVfQ09NTUlULAorCQkJbnVsbCwKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIHVucmVhY2hhYmxlLm5hbWUoKSArICJcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoUmVxdWVzdFBvbGljeVRpcCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgcGFyZW50T2ZUaXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgdGlwID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5wYXJlbnQocGFyZW50T2ZUaXApLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJzZWNyZXQiLCB0aXApOworCisJCS8vIFRoaXMgd29ya3MKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5USVAsCisJCQluZXcgUmVqZWN0QWxsUmVmRmlsdGVyKCksCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyB0aXAubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCisJCS8vIFRoaXMgZG9lc24ndAorCQl0aHJvd24uZXhwZWN0KFRyYW5zcG9ydEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKE1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nKAorCQkJCQkid2FudCAiICsgcGFyZW50T2ZUaXAubmFtZSgpICsgIiBub3QgdmFsaWQiKSk7CisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuVElQLAorCQkJbmV3IFJlamVjdEFsbFJlZkZpbHRlcigpLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgcGFyZW50T2ZUaXAubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hSZXF1ZXN0UG9saWN5UmVhY2hhYmxlQ29tbWl0VGlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBwYXJlbnRPZlRpcCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCB0aXAgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLnBhcmVudChwYXJlbnRPZlRpcCkuY3JlYXRlKCk7CisJCVJldkNvbW1pdCB1bnJlYWNoYWJsZSA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoInNlY3JldCIsIHRpcCk7CisKKwkJLy8gVGhpcyB3b3JrcworCQl1cGxvYWRQYWNrVjIoCisJCQlSZXF1ZXN0UG9saWN5LlJFQUNIQUJMRV9DT01NSVRfVElQLAorCQkJbmV3IFJlamVjdEFsbFJlZkZpbHRlcigpLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgcGFyZW50T2ZUaXAubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCisJCS8vIFRoaXMgZG9lc24ndAorCQl0aHJvd24uZXhwZWN0KFRyYW5zcG9ydEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKE1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nKAorCQkJCQkid2FudCAiICsgdW5yZWFjaGFibGUubmFtZSgpICsgIiBub3QgdmFsaWQiKSk7CisJCXVwbG9hZFBhY2tWMigKKwkJCVJlcXVlc3RQb2xpY3kuUkVBQ0hBQkxFX0NPTU1JVF9USVAsCisJCQluZXcgUmVqZWN0QWxsUmVmRmlsdGVyKCksCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyB1bnJlYWNoYWJsZS5uYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFJlcXVlc3RQb2xpY3lBbnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHVucmVhY2hhYmxlID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKworCQkvLyBFeGVyY2lzZSB0byBtYWtlIHN1cmUgdGhhdCBldmVuIHVucmVhY2hhYmxlIGNvbW1pdHMgY2FuIGJlIGZldGNoZWQKKwkJdXBsb2FkUGFja1YyKAorCQkJUmVxdWVzdFBvbGljeS5BTlksCisJCQludWxsLAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgdW5yZWFjaGFibGUubmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hTZXJ2ZXJEb2VzTm90U3RvcE5lZ290aWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBmb29QYXJlbnQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgZm9vQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChmb29QYXJlbnQpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGJhckNoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5wYXJlbnQoYmFyUGFyZW50KS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGZvb0NoaWxkKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMiIsIGJhckNoaWxkKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkid2FudCAiICsgYmFyQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgZm9vUGFyZW50LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJhY2tub3dsZWRnbWVudHMiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygiQUNLICIgKyBmb29QYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSkpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgdGhlSW5zdGFuY2UoUGFja2V0TGluZUluLkVORCkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hTZXJ2ZXJTdG9wc05lZ290aWF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBmb29QYXJlbnQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgZm9vQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChmb29QYXJlbnQpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGJhckNoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInkiKS5wYXJlbnQoYmFyUGFyZW50KS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGZvb0NoaWxkKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMiIsIGJhckNoaWxkKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkid2FudCAiICsgYmFyQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgZm9vUGFyZW50LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImhhdmUgIiArIGJhclBhcmVudC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygiYWNrbm93bGVkZ21lbnRzIikpOworCQlhc3NlcnRUaGF0KAorCQkJQXJyYXlzLmFzTGlzdChwY2tJbi5yZWFkU3RyaW5nKCksIHBja0luLnJlYWRTdHJpbmcoKSksCisJCQloYXNJdGVtcygKKwkJCQkiQUNLICIgKyBmb29QYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSwKKwkJCQkiQUNLICIgKyBiYXJQYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSkpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInJlYWR5IikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgdGhlSW5zdGFuY2UoUGFja2V0TGluZUluLkRFTElNKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChmb29QYXJlbnQudG9PYmplY3RJZCgpKSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChmb29DaGlsZC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChiYXJQYXJlbnQudG9PYmplY3RJZCgpKSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChiYXJDaGlsZC50b09iamVjdElkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoQ2xpZW50U3RvcHNOZWdvdGlhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgZm9vUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGZvb0NoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5wYXJlbnQoZm9vUGFyZW50KS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGJhclBhcmVudCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikuY3JlYXRlKCk7CisJCVJldkNvbW1pdCBiYXJDaGlsZCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ5IikucGFyZW50KGJhclBhcmVudCkuY3JlYXRlKCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBmb29DaGlsZCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDIiLCBiYXJDaGlsZCk7CisKKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGZvb0NoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJIndhbnQgIiArIGJhckNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImhhdmUgIiArIGZvb1BhcmVudC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGZvb1BhcmVudC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KGZvb0NoaWxkLnRvT2JqZWN0SWQoKSkpOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QoYmFyUGFyZW50LnRvT2JqZWN0SWQoKSkpOworCQlhc3NlcnRUcnVlKGNsaWVudC5oYXNPYmplY3QoYmFyQ2hpbGQudG9PYmplY3RJZCgpKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFRoaW5QYWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVN0cmluZyBjb21tb25JbkJsb2IgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCisJCVJldkJsb2IgcGFyZW50QmxvYiA9IHJlbW90ZS5ibG9iKGNvbW1vbkluQmxvYiArICJhIik7CisJCVJldkNvbW1pdCBwYXJlbnQgPSByZW1vdGUuY29tbWl0KHJlbW90ZS50cmVlKHJlbW90ZS5maWxlKCJmb28iLCBwYXJlbnRCbG9iKSkpOworCQlSZXZCbG9iIGNoaWxkQmxvYiA9IHJlbW90ZS5ibG9iKGNvbW1vbkluQmxvYiArICJiIik7CisJCVJldkNvbW1pdCBjaGlsZCA9IHJlbW90ZS5jb21taXQocmVtb3RlLnRyZWUocmVtb3RlLmZpbGUoImZvbyIsIGNoaWxkQmxvYikpLCBwYXJlbnQpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgY2hpbGQpOworCisJCS8vIFByZXRlbmQgdGhhdCB3ZSBoYXZlIHBhcmVudCB0byBnZXQgYSB0aGluIHBhY2sgYmFzZWQgb24gaXQuCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJoYXZlICIgKyBwYXJlbnQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkidGhpbi1wYWNrXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCisJCS8vIFZlcmlmeSB0aGF0IHdlIHJlY2VpdmVkIGEgdGhpbiBwYWNrIGJ5IHRyeWluZyB0byBhcHBseSBpdAorCQkvLyBhZ2FpbnN0IHRoZSBjbGllbnQgcmVwbywgd2hpY2ggZG9lcyBub3QgaGF2ZSBwYXJlbnQuCisJCXRocm93bi5leHBlY3QoSU9FeGNlcHRpb24uY2xhc3MpOworCQl0aHJvd24uZXhwZWN0TWVzc2FnZSgicGFjayBoYXMgdW5yZXNvbHZlZCBkZWx0YXMiKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0pOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hOb1Byb2dyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCVJldkNvbW1pdCBjb21taXQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgY29tbWl0KTsKKworCQkvLyBXaXRob3V0IG5vLXByb2dyZXNzLCBwcm9ncmVzcyBpcyByZXBvcnRlZC4KKwkJU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY29tbWl0LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJcGFyc2VQYWNrKHJlY3ZTdHJlYW0sIG5ldyBUZXh0UHJvZ3Jlc3NNb25pdG9yKHN3KSk7CisJCWFzc2VydEZhbHNlKHN3LnRvU3RyaW5nKCkuaXNFbXB0eSgpKTsKKworCQkvLyBXaXRoIG5vLXByb2dyZXNzLCBwcm9ncmVzcyBpcyBub3QgcmVwb3J0ZWQuCisJCXN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworCQlyZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY29tbWl0LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJIm5vLXByb2dyZXNzXG4iLAorCQkJImRvbmVcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSwgbmV3IFRleHRQcm9ncmVzc01vbml0b3Ioc3cpKTsKKwkJYXNzZXJ0VHJ1ZShzdy50b1N0cmluZygpLmlzRW1wdHkoKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaEluY2x1ZGVUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IGNvbW1pdCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJ4IikuY3JlYXRlKCk7CisJCVJldlRhZyB0YWcgPSByZW1vdGUudGFnKCJ0YWciLCBjb21taXQpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgY29tbWl0KTsKKwkJcmVtb3RlLnVwZGF0ZSgicmVmcy90YWdzL3RhZyIsIHRhZyk7CisKKwkJLy8gV2l0aG91dCBpbmNsdWRlLXRhZy4KKwkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNvbW1pdC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdCh0YWcudG9PYmplY3RJZCgpKSk7CisKKwkJLy8gV2l0aCB0YWcuCisJCXJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjb21taXQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaW5jbHVkZS10YWdcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHRhZy50b09iamVjdElkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoT2ZzRGVsdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJU3RyaW5nIGNvbW1vbkluQmxvYiA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisKKwkJUmV2QmxvYiBwYXJlbnRCbG9iID0gcmVtb3RlLmJsb2IoY29tbW9uSW5CbG9iICsgImEiKTsKKwkJUmV2Q29tbWl0IHBhcmVudCA9IHJlbW90ZS5jb21taXQocmVtb3RlLnRyZWUocmVtb3RlLmZpbGUoImZvbyIsIHBhcmVudEJsb2IpKSk7CisJCVJldkJsb2IgY2hpbGRCbG9iID0gcmVtb3RlLmJsb2IoY29tbW9uSW5CbG9iICsgImIiKTsKKwkJUmV2Q29tbWl0IGNoaWxkID0gcmVtb3RlLmNvbW1pdChyZW1vdGUudHJlZShyZW1vdGUuZmlsZSgiZm9vIiwgY2hpbGRCbG9iKSksIHBhcmVudCk7CisJCXJlbW90ZS51cGRhdGUoImJyYW5jaDEiLCBjaGlsZCk7CisKKwkJLy8gV2l0aG91dCBvZnMtZGVsdGEuCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCVJlY2VpdmVkUGFja1N0YXRpc3RpY3Mgc3RhdHMgPSBwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoc3RhdHMuZ2V0TnVtT2ZzRGVsdGEoKSA9PSAwKTsKKworCQkvLyBXaXRoIG9mcy1kZWx0YS4KKwkJcmVjdlN0cmVhbSA9IHVwbG9hZFBhY2tWMigKKwkJCSJjb21tYW5kPWZldGNoXG4iLAorCQkJUGFja2V0TGluZUluLkRFTElNLAorCQkJIndhbnQgIiArIGNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJIm9mcy1kZWx0YVxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCXBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJwYWNrZmlsZSIpKTsKKwkJc3RhdHMgPSBwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoc3RhdHMuZ2V0TnVtT2ZzRGVsdGEoKSAhPSAwKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoU2hhbGxvdygpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgY29tbW9uUGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInBhcmVudCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgZm9vQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChjb21tb25QYXJlbnQpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgYmFyQ2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieSIpLnBhcmVudChjb21tb25QYXJlbnQpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgYmFyQ2hpbGQpOworCisJCS8vIFdpdGhvdXQgc2hhbGxvdywgdGhlIHNlcnZlciB0aGlua3MgdGhhdCB3ZSBoYXZlCisJCS8vIGNvbW1vblBhcmVudCwgc28gaXQgZG9lc24ndCBzZW5kIGl0LgorCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgYmFyQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlQYWNrZXRMaW5lSW4gcGNrSW4gPSBuZXcgUGFja2V0TGluZUluKHJlY3ZTdHJlYW0pOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChiYXJDaGlsZC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChjb21tb25QYXJlbnQudG9PYmplY3RJZCgpKSk7CisKKwkJLy8gV2l0aCBzaGFsbG93LCB0aGUgc2VydmVyIGtub3dzIHRoYXQgd2UgZG9uJ3QgaGF2ZQorCQkvLyBjb21tb25QYXJlbnQsIHNvIGl0IHNlbmRzIGl0LgorCQlyZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgYmFyQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiaGF2ZSAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkic2hhbGxvdyAiICsgZm9vQ2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KGNvbW1vblBhcmVudC50b09iamVjdElkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoRGVlcGVuQW5kRG9uZSgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgcGFyZW50ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoInBhcmVudCIpLmNyZWF0ZSgpOworCQlSZXZDb21taXQgY2hpbGQgPSByZW1vdGUuY29tbWl0KCkubWVzc2FnZSgieCIpLnBhcmVudChwYXJlbnQpLmNyZWF0ZSgpOworCQlyZW1vdGUudXBkYXRlKCJicmFuY2gxIiwgY2hpbGQpOworCisJCS8vICJkZWVwZW4gMSIgc2VuZHMgb25seSB0aGUgY2hpbGQuCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjaGlsZC50b09iamVjdElkKCkuZ2V0TmFtZSgpICsgIlxuIiwKKwkJCSJkZWVwZW4gMVxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygic2hhbGxvdy1pbmZvIikpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInNoYWxsb3cgIiArIGNoaWxkLnRvT2JqZWN0SWQoKS5nZXROYW1lKCkpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIHRoZUluc3RhbmNlKFBhY2tldExpbmVJbi5ERUxJTSkpOworCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoInBhY2tmaWxlIikpOworCQlwYXJzZVBhY2socmVjdlN0cmVhbSk7CisJCWFzc2VydFRydWUoY2xpZW50Lmhhc09iamVjdChjaGlsZC50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0RmFsc2UoY2xpZW50Lmhhc09iamVjdChwYXJlbnQudG9PYmplY3RJZCgpKSk7CisKKwkJLy8gV2l0aG91dCB0aGF0LCB0aGUgcGFyZW50IGlzIHNlbnQgdG9vLgorCQlyZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCQlwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHBhcmVudC50b09iamVjdElkKCkpKTsKKwl9CisKKwlAVGVzdAorCXB1YmxpYyB2b2lkIHRlc3RWMkZldGNoRGVlcGVuV2l0aG91dERvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwkJUmV2Q29tbWl0IHBhcmVudCA9IHJlbW90ZS5jb21taXQoKS5tZXNzYWdlKCJwYXJlbnQiKS5jcmVhdGUoKTsKKwkJUmV2Q29tbWl0IGNoaWxkID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIngiKS5wYXJlbnQocGFyZW50KS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgiYnJhbmNoMSIsIGNoaWxkKTsKKworCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSByZWN2U3RyZWFtID0gdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY2hpbGQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZGVlcGVuIDFcbiIsCisJCQlQYWNrZXRMaW5lSW4uRU5EKTsKKwkJUGFja2V0TGluZUluIHBja0luID0gbmV3IFBhY2tldExpbmVJbihyZWN2U3RyZWFtKTsKKworCQkvLyBWZXJpZnkgdGhhdCBvbmx5IHRoZSBjb3JyZWN0IHNlY3Rpb24gaXMgc2VudC4gInNoYWxsb3ctaW5mbyIKKwkJLy8gaXMgbm90IHNlbnQgYmVjYXVzZSwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLCBpdCBpcworCQkvLyBzZW50IG9ubHkgaWYgYSBwYWNrZmlsZSBpcyBzZW50LgorCQlhc3NlcnRUaGF0KHBja0luLnJlYWRTdHJpbmcoKSwgaXMoImFja25vd2xlZGdtZW50cyIpKTsKKwkJYXNzZXJ0VGhhdChwY2tJbi5yZWFkU3RyaW5nKCksIGlzKCJOQUsiKSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCB0aGVJbnN0YW5jZShQYWNrZXRMaW5lSW4uRU5EKSk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaFVucmVjb2duaXplZEFyZ3VtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJCXRocm93bi5leHBlY3QoUGFja1Byb3RvY29sRXhjZXB0aW9uLmNsYXNzKTsKKwkJdGhyb3duLmV4cGVjdE1lc3NhZ2UoInVuZXhwZWN0ZWQgaW52YWxpZC1hcmd1bWVudCIpOworCQl1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJpbnZhbGlkLWFyZ3VtZW50XG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJfQorCisJQFRlc3QKKwlwdWJsaWMgdm9pZCB0ZXN0VjJGZXRjaEZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZCbG9iIGJpZyA9IHJlbW90ZS5ibG9iKCJmb29iYXIiKTsKKwkJUmV2QmxvYiBzbWFsbCA9IHJlbW90ZS5ibG9iKCJmb29iYSIpOworCQlSZXZUcmVlIHRyZWUgPSByZW1vdGUudHJlZShyZW1vdGUuZmlsZSgiMSIsIGJpZyksCisJCQkJcmVtb3RlLmZpbGUoIjIiLCBzbWFsbCkpOworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlLmNvbW1pdCh0cmVlKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgY29tbWl0KTsKKworCQlzZXJ2ZXIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIHRydWUpOworCisJCUJ5dGVBcnJheUlucHV0U3RyZWFtIHJlY3ZTdHJlYW0gPSB1cGxvYWRQYWNrVjIoCisJCQkiY29tbWFuZD1mZXRjaFxuIiwKKwkJCVBhY2tldExpbmVJbi5ERUxJTSwKKwkJCSJ3YW50ICIgKyBjb21taXQudG9PYmplY3RJZCgpLmdldE5hbWUoKSArICJcbiIsCisJCQkiZmlsdGVyIGJsb2I6bGltaXQ9NVxuIiwKKwkJCSJkb25lXG4iLAorCQkJUGFja2V0TGluZUluLkVORCk7CisJCVBhY2tldExpbmVJbiBwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmVjdlN0cmVhbSk7CisJCWFzc2VydFRoYXQocGNrSW4ucmVhZFN0cmluZygpLCBpcygicGFja2ZpbGUiKSk7CisJCXBhcnNlUGFjayhyZWN2U3RyZWFtKTsKKworCQlhc3NlcnRGYWxzZShjbGllbnQuaGFzT2JqZWN0KGJpZy50b09iamVjdElkKCkpKTsKKwkJYXNzZXJ0VHJ1ZShjbGllbnQuaGFzT2JqZWN0KHNtYWxsLnRvT2JqZWN0SWQoKSkpOworCX0KKworCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdFYyRmV0Y2hGaWx0ZXJXaGVuTm90QWxsb3dlZCgpIHRocm93cyBFeGNlcHRpb24geworCQlSZXZDb21taXQgY29tbWl0ID0gcmVtb3RlLmNvbW1pdCgpLm1lc3NhZ2UoIjAiKS5jcmVhdGUoKTsKKwkJcmVtb3RlLnVwZGF0ZSgibWFzdGVyIiwgY29tbWl0KTsKKworCQlzZXJ2ZXIuZ2V0Q29uZmlnKCkuc2V0Qm9vbGVhbigidXBsb2FkcGFjayIsIG51bGwsICJhbGxvd2ZpbHRlciIsIGZhbHNlKTsKKworCQl0aHJvd24uZXhwZWN0KFBhY2tQcm90b2NvbEV4Y2VwdGlvbi5jbGFzcyk7CisJCXRocm93bi5leHBlY3RNZXNzYWdlKCJ1bmV4cGVjdGVkIGZpbHRlciBibG9iOmxpbWl0PTUiKTsKKwkJdXBsb2FkUGFja1YyKAorCQkJImNvbW1hbmQ9ZmV0Y2hcbiIsCisJCQlQYWNrZXRMaW5lSW4uREVMSU0sCisJCQkid2FudCAiICsgY29tbWl0LnRvT2JqZWN0SWQoKS5nZXROYW1lKCkgKyAiXG4iLAorCQkJImZpbHRlciBibG9iOmxpbWl0PTVcbiIsCisJCQkiZG9uZVxuIiwKKwkJCVBhY2tldExpbmVJbi5FTkQpOworCX0KKworCXByaXZhdGUgc3RhdGljIGNsYXNzIFJlamVjdEFsbFJlZkZpbHRlciBpbXBsZW1lbnRzIFJlZkZpbHRlciB7CisJCUBPdmVycmlkZQorCQlwdWJsaWMgTWFwPFN0cmluZywgUmVmPiBmaWx0ZXIoTWFwPFN0cmluZywgUmVmPiByZWZzKSB7CisJCQlyZXR1cm4gbmV3IEhhc2hNYXA8PigpOworCQl9CisJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvblRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0VuY3J5cHRpb25UZXN0LmphdmEKaW5kZXggY2IwNGY4My4uMzNlMjUyOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvblRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtFbmNyeXB0aW9uVGVzdC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuV2Fsa0VuY3J5cHRpb25UZXN0LlV0aWwuY3J5cHRvQ2lwaGVyTGlzdFBCRTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuV2Fsa0VuY3J5cHRpb25UZXN0LlV0aWwuY3J5cHRvQ2lwaGVyTGlzdFRyYW5zOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5XYWxrRW5jcnlwdGlvblRlc3QuVXRpbC5mb2xkZXJEZWxldGU7CkBAIC0zNjAsNyArMzYwLDcgQEAgc3RhdGljIGNsYXNzIFV0aWwgewogCQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCQkgKi8KIAkJc3RhdGljIFN0cmluZyB0ZXh0UmVhZChGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24gewotCQkJcmV0dXJuIG5ldyBTdHJpbmcoRmlsZXMucmVhZEFsbEJ5dGVzKGZpbGUudG9QYXRoKCkpLCBVVEZfOCk7CisJCQlyZXR1cm4gbmV3IFN0cmluZyhGaWxlcy5yZWFkQWxsQnl0ZXMoZmlsZS50b1BhdGgoKSksIENIQVJTRVQpOwogCQl9CiAKIAkJLyoqCkBAIC0zNzEsNyArMzcxLDcgQEAgc3RhdGljIFN0cmluZyB0ZXh0UmVhZChGaWxlIGZpbGUpIHRocm93cyBFeGNlcHRpb24gewogCQkgKiBAdGhyb3dzIEV4Y2VwdGlvbgogCQkgKi8KIAkJc3RhdGljIHZvaWQgdGV4dFdyaXRlKEZpbGUgZmlsZSwgU3RyaW5nIHRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkJRmlsZXMud3JpdGUoZmlsZS50b1BhdGgoKSwgdGV4dC5nZXRCeXRlcyhVVEZfOCkpOworCQkJRmlsZXMud3JpdGUoZmlsZS50b1BhdGgoKSwgdGV4dC5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCX0KIAogCQlzdGF0aWMgdm9pZCB2ZXJpZnlGaWxlQ29udGVudChGaWxlIGZpbGVPbmUsIEZpbGUgZmlsZVR3bykKQEAgLTQxOSwxMiArNDE5LDkgQEAgc3RhdGljIFN0cmluZyBwdWJsaWNBZGRyZXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCQkJVVJMQ29ubmVjdGlvbiBjID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7CiAJCQkJYy5zZXRDb25uZWN0VGltZW91dCg1MDApOwogCQkJCWMuc2V0UmVhZFRpbWVvdXQoNTAwKTsKLQkJCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoCi0JCQkJCQluZXcgSW5wdXRTdHJlYW1SZWFkZXIoYy5nZXRJbnB1dFN0cmVhbSgpKSk7Ci0JCQkJdHJ5IHsKKwkJCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcigKKwkJCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcihjLmdldElucHV0U3RyZWFtKCkpKSkgewogCQkJCQlyZXR1cm4gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJcmVhZGVyLmNsb3NlKCk7CiAJCQkJfQogCQkJfSBjYXRjaCAoVW5rbm93bkhvc3RFeGNlcHRpb24gfCBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIGUpIHsKIAkJCQlyZXR1cm4gIkNhbid0IHJlYWNoIGh0dHA6Ly9jaGVja2lwLmFtYXpvbmF3cy5jb20gdG8iCkBAIC02NTQsOSArNjUxLDkgQEAgc3RhdGljIHZvaWQgY29uZmlnQ3JlYXRlKFN0cmluZyBhbGdvcml0aG0pIHRocm93cyBFeGNlcHRpb24gewogCQkJUHJvcGVydGllcyBwcm9wcyA9IFByb3BzLmRpc2NvdmVyKCk7CiAJCQlwcm9wcy5wdXQoQW1hem9uUzMuS2V5cy5QQVNTV09SRCwgSkdJVF9QQVNTKTsKIAkJCXByb3BzLnB1dChBbWF6b25TMy5LZXlzLkNSWVBUT19BTEcsIGFsZ29yaXRobSk7Ci0JCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoSkdJVF9DT05GX0ZJTEUpOwotCQkJcHJvcHMuc3RvcmUod3JpdGVyLCAiSkdJVCBTMyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKLQkJCXdyaXRlci5jbG9zZSgpOworCQkJdHJ5IChQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoSkdJVF9DT05GX0ZJTEUpKSB7CisJCQkJcHJvcHMuc3RvcmUod3JpdGVyLCAiSkdJVCBTMyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKKwkJCX0KIAkJfQogCiAJCS8qKgpAQCAtNjY4LDkgKzY2NSw5IEBAIHN0YXRpYyB2b2lkIGNvbmZpZ0NyZWF0ZShTdHJpbmcgYWxnb3JpdGhtKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJc3RhdGljIHZvaWQgY29uZmlnQ3JlYXRlKFByb3BlcnRpZXMgc291cmNlKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCVByb3BlcnRpZXMgdGFyZ2V0ID0gUHJvcHMuZGlzY292ZXIoKTsKIAkJCXRhcmdldC5wdXRBbGwoc291cmNlKTsKLQkJCVByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihKR0lUX0NPTkZfRklMRSk7Ci0JCQl0YXJnZXQuc3RvcmUod3JpdGVyLCAiSkdJVCBTMyBjb25uZWN0aW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4iKTsKLQkJCXdyaXRlci5jbG9zZSgpOworCQkJdHJ5IChQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIoSkdJVF9DT05GX0ZJTEUpKSB7CisJCQkJdGFyZ2V0LnN0b3JlKHdyaXRlciwgIkpHSVQgUzMgY29ubmVjdGlvbiBjb25maWd1cmF0aW9uIGZpbGUuIik7CisJCQl9CiAJCX0KIAogCQkvKioKQEAgLTc0MSw3ICs3MzgsNyBAQCBzdGF0aWMgdm9pZCByZW1vdGVWZXJpZnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCUFtYXpvblMzIHMzID0gbmV3IEFtYXpvblMzKHByb3BzKTsKIAkJCVN0cmluZyBmaWxlID0gSkdJVF9VU0VSICsgIi0iICsgVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKIAkJCVN0cmluZyBwYXRoID0gSkdJVF9SRU1PVEVfRElSICsgIi8iICsgZmlsZTsKLQkJCXMzLnB1dChidWNrZXQsIHBhdGgsIGZpbGUuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCXMzLnB1dChidWNrZXQsIHBhdGgsIGZpbGUuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQkJczMuZGVsZXRlKGJ1Y2tldCwgcGF0aCk7CiAJCX0KIApAQCAtODM2LDEwICs4MzMsMTAgQEAgc3RhdGljIHZvaWQgdmVyaWZ5Q3J5cHRvKFdhbGtFbmNyeXB0aW9uIGNyeXB0bykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXsKIAkJCQlieXRlW10gb3JpZ2luID0gc291cmNlVGV4dC5nZXRCeXRlcyhjaGFyc2V0KTsKIAkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gdGFyZ2V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCU91dHB1dFN0cmVhbSBzb3VyY2UgPSBjcnlwdG8uZW5jcnlwdCh0YXJnZXQpOwotCQkJCXNvdXJjZS53cml0ZShvcmlnaW4pOwotCQkJCXNvdXJjZS5mbHVzaCgpOwotCQkJCXNvdXJjZS5jbG9zZSgpOworCQkJCXRyeSAoT3V0cHV0U3RyZWFtIHNvdXJjZSA9IGNyeXB0by5lbmNyeXB0KHRhcmdldCkpIHsKKwkJCQkJc291cmNlLndyaXRlKG9yaWdpbik7CisJCQkJCXNvdXJjZS5mbHVzaCgpOworCQkJCX0KIAkJCQljaXBoZXJUZXh0ID0gdGFyZ2V0LnRvQnl0ZUFycmF5KCk7CiAJCQl9CiAJCQl7CkBAIC0xMDc0LDEwICsxMDcxLDEwIEBAIHZvaWQgY3J5cHRvVGVzdChQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlyZW1vdGVDb25maWcudXBkYXRlKGNvbmZpZyk7CiAJCQkJY29uZmlnLnNhdmUoKTsKIAotCQkJCUdpdCBnaXQgPSBHaXQub3BlbihkaXJPbmUpOwotCQkJCWdpdC5jaGVja291dCgpLnNldE5hbWUoIm1hc3RlciIpLmNhbGwoKTsKLQkJCQlnaXQucHVzaCgpLnNldFJlbW90ZShyZW1vdGUpLnNldFJlZlNwZWNzKHNwZWNzKS5jYWxsKCk7Ci0JCQkJZ2l0LmNsb3NlKCk7CisJCQkJdHJ5IChHaXQgZ2l0ID0gR2l0Lm9wZW4oZGlyT25lKSkgeworCQkJCQlnaXQuY2hlY2tvdXQoKS5zZXROYW1lKCJtYXN0ZXIiKS5jYWxsKCk7CisJCQkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKHJlbW90ZSkuc2V0UmVmU3BlY3Moc3BlY3MpLmNhbGwoKTsKKwkJCQl9CiAKIAkJCQlGaWxlIGZpbGVTdGF0aWMgPSBuZXcgRmlsZShkaXJPbmUsIG5hbWVTdGF0aWMpOwogCQkJCWFzc2VydFRydWUoIlByb3ZpZGVkIGJ5IHNldHVwIiwgZmlsZVN0YXRpYy5leGlzdHMoKSk7CkBAIC0xMDg5LDExICsxMDg2LDExIEBAIHZvaWQgY3J5cHRvVGVzdChQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlGaWxlIGZpbGVTdGF0aWMgPSBuZXcgRmlsZShkaXJUd28sIG5hbWVTdGF0aWMpOwogCQkJCWFzc2VydEZhbHNlKCJOb3QgUHJvdmlkZWQgYnkgc2V0dXAiLCBmaWxlU3RhdGljLmV4aXN0cygpKTsKIAotCQkJCUdpdCBnaXQgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCkuc2V0VVJJKHVyaSkuc2V0RGlyZWN0b3J5KGRpclR3bykKLQkJCQkJCS5jYWxsKCk7Ci0JCQkJZ2l0LmNsb3NlKCk7CisJCQkJdHJ5IChHaXQgZ2l0ID0gR2l0LmNsb25lUmVwb3NpdG9yeSgpLnNldFVSSSh1cmkpCisJCQkJCQkuc2V0RGlyZWN0b3J5KGRpclR3bykuY2FsbCgpKSB7CisJCQkJCWFzc2VydFRydWUoIlByb3ZpZGVkIGJ5IGNsb25lIiwgZmlsZVN0YXRpYy5leGlzdHMoKSk7CisJCQkJfQogCi0JCQkJYXNzZXJ0VHJ1ZSgiUHJvdmlkZWQgYnkgY2xvbmUiLCBmaWxlU3RhdGljLmV4aXN0cygpKTsKIAkJCX0KIAogCQkJeyAvLyBWZXJpZnkgc3RhdGljIGZpbGUgY29udGVudC4KQEAgLTExMTEsMTEgKzExMDgsMTEgQEAgdm9pZCBjcnlwdG9UZXN0KFByb3BlcnRpZXMgcHJvcHMpIHRocm93cyBFeGNlcHRpb24gewogCQkJCWFzc2VydFRydWUoIlByb3ZpZGVkIGJ5IGNyZWF0ZSIsIGZpbGVEeW5hbWljLmV4aXN0cygpKTsKIAkJCQlhc3NlcnRUcnVlKCJOZWVkIGNvbnRlbnQgdG8gZW5jcnlwdCIsIGZpbGVEeW5hbWljLmxlbmd0aCgpID4gMCk7CiAKLQkJCQlHaXQgZ2l0ID0gR2l0Lm9wZW4oZGlyT25lKTsKLQkJCQlnaXQuYWRkKCkuYWRkRmlsZXBhdHRlcm4obmFtZUR5bmFtaWMpLmNhbGwoKTsKLQkJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShuYW1lRHluYW1pYykuY2FsbCgpOwotCQkJCWdpdC5wdXNoKCkuc2V0UmVtb3RlKHJlbW90ZSkuc2V0UmVmU3BlY3Moc3BlY3MpLmNhbGwoKTsKLQkJCQlnaXQuY2xvc2UoKTsKKwkJCQl0cnkgKEdpdCBnaXQgPSBHaXQub3BlbihkaXJPbmUpKSB7CisJCQkJCWdpdC5hZGQoKS5hZGRGaWxlcGF0dGVybihuYW1lRHluYW1pYykuY2FsbCgpOworCQkJCQlnaXQuY29tbWl0KCkuc2V0TWVzc2FnZShuYW1lRHluYW1pYykuY2FsbCgpOworCQkJCQlnaXQucHVzaCgpLnNldFJlbW90ZShyZW1vdGUpLnNldFJlZlNwZWNzKHNwZWNzKS5jYWxsKCk7CisJCQkJfQogCiAJCQl9CiAKQEAgLTExMjQsOSArMTEyMSw5IEBAIHZvaWQgY3J5cHRvVGVzdChQcm9wZXJ0aWVzIHByb3BzKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQlGaWxlIGZpbGVEeW5hbWljID0gbmV3IEZpbGUoZGlyVHdvLCBuYW1lRHluYW1pYyk7CiAJCQkJYXNzZXJ0RmFsc2UoIk5vdCBQcm92aWRlZCBieSBzZXR1cCIsIGZpbGVEeW5hbWljLmV4aXN0cygpKTsKIAotCQkJCUdpdCBnaXQgPSBHaXQub3BlbihkaXJUd28pOwotCQkJCWdpdC5wdWxsKCkuY2FsbCgpOwotCQkJCWdpdC5jbG9zZSgpOworCQkJCXRyeSAoR2l0IGdpdCA9IEdpdC5vcGVuKGRpclR3bykpIHsKKwkJCQkJZ2l0LnB1bGwoKS5jYWxsKCk7CisJCQkJfQogCiAJCQkJYXNzZXJ0VHJ1ZSgiUHJvdmlkZWQgYnkgcHVsbCIsIGZpbGVEeW5hbWljLmV4aXN0cygpKTsKIAkJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9DYW5vbmljYWxUcmVlUGFyc2VyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXJUZXN0LmphdmEKaW5kZXggZjVlOTdjMi4uNjE5NWU2NCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Nhbm9uaWNhbFRyZWVQYXJzZXJUZXN0LmphdmEKQEAgLTkxLDkgKzkxLDkgQEAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJCQloYXNoX3NvbWV0cmVlKSwgZW50cnkobTY0NCwgImZvbyIsIGhhc2hfZm9vKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIG1rdHJlZShmaW5hbCBieXRlW10uLi4gZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIG1rdHJlZShieXRlW10uLi4gZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCWZvciAoZmluYWwgYnl0ZVtdIGUgOiBkYXRhKQorCQlmb3IgKGJ5dGVbXSBlIDogZGF0YSkKIAkJCW91dC53cml0ZShlKTsKIAkJcmV0dXJuIG91dC50b0J5dGVBcnJheSgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JUZXN0LmphdmEKaW5kZXggZTM0Y2I5Ny4uMGUwMDliOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JUZXN0LmphdmEKQEAgLTgyMSw3ICs4MjEsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVudHJ5KFN0cmluZyBzaGExc3RyaW5nLCBTdHJpbmcgcGF0aCwgVHJlZVdhbGsgdHcpCiAJCWFzc2VydEVxdWFscyhzaGExc3RyaW5nLCB0dy5nZXRPYmplY3RJZCgxKS5nZXROYW1lKCkgLyogMT1maWxldHJlZSBoZXJlICovKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGkpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZU9mKEFic3RyYWN0VHJlZUl0ZXJhdG9yIGkpIHsKIAkJcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKENvbnN0YW50cy5DSEFSU0VULCBpLnBhdGgsIDAsIGkucGF0aExlbik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JXaXRoVGltZUNvbnRyb2wuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yV2l0aFRpbWVDb250cm9sLmphdmEKaW5kZXggNzE3YTJmMy4uZmM3OWQ0NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3JXaXRoVGltZUNvbnRyb2wuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRmlsZVRyZWVJdGVyYXRvcldpdGhUaW1lQ29udHJvbC5qYXZhCkBAIC05Myw3ICs5Myw3IEBAIHB1YmxpYyBGaWxlVHJlZUl0ZXJhdG9yV2l0aFRpbWVDb250cm9sKEZpbGUgZiwgRlMgZnMsCiAJfQogCiAJQE92ZXJyaWRlCi0JcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKSB7CisJcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKSB7CiAJCXJldHVybiBuZXcgRmlsZVRyZWVJdGVyYXRvcldpdGhUaW1lQ29udHJvbCh0aGlzLAogCQkJCSgoRmlsZUVudHJ5KSBjdXJyZW50KCkpLmdldEZpbGUoKSwgZnMsIG1vZFRpbWVzKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvUG9zdE9yZGVyVHJlZVdhbGtUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvUG9zdE9yZGVyVHJlZVdhbGtUZXN0LmphdmEKaW5kZXggNmFkNDdjMi4uMjMyNDIyZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1Bvc3RPcmRlclRyZWVXYWxrVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Qb3N0T3JkZXJUcmVlV2Fsa1Rlc3QuamF2YQpAQCAtNjAsMTQgKzYwLDE0IEBACiBwdWJsaWMgY2xhc3MgUG9zdE9yZGVyVHJlZVdhbGtUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplX05vUG9zdE9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQlhc3NlcnRGYWxzZSh0dy5pc1Bvc3RPcmRlclRyYXZlcnNhbCgpKTsKIAkJfQogCX0KIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEluaXRpYWxpemVfVG9nZ2xlUG9zdE9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQlhc3NlcnRGYWxzZSh0dy5pc1Bvc3RPcmRlclRyYXZlcnNhbCgpKTsKIAkJCXR3LnNldFBvc3RPcmRlclRyYXZlcnNhbCh0cnVlKTsKIAkJCWFzc2VydFRydWUodHcuaXNQb3N0T3JkZXJUcmF2ZXJzYWwoKSk7CkBAIC03OCw3ICs3OCw3IEBAIHB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplX1RvZ2dsZVBvc3RPcmRlcigpIHRocm93cyBFeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0UmVzZXREb2VzTm90QWZmZWN0UG9zdE9yZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5zZXRQb3N0T3JkZXJUcmF2ZXJzYWwodHJ1ZSk7CiAJCQlhc3NlcnRUcnVlKHR3LmlzUG9zdE9yZGVyVHJhdmVyc2FsKCkpOwogCQkJdHcucmVzZXQoKTsKQEAgLTEwNCw3ICsxMDQsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0Tm9Qb3N0T3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYi5maW5pc2goKTsKIAkJYXNzZXJ0RXF1YWxzKDQsIHRyZWUuZ2V0RW50cnlDb3VudCgpKTsKIAotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuc2V0UG9zdE9yZGVyVHJhdmVyc2FsKGZhbHNlKTsKIAkJCXR3LmFkZFRyZWUobmV3IERpckNhY2hlSXRlcmF0b3IodHJlZSkpOwogCkBAIC0xMzIsNyArMTMyLDcgQEAgcHVibGljIHZvaWQgdGVzdFdpdGhQb3N0T3JkZXJfRW50ZXJTdWJ0cmVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWIuZmluaXNoKCk7CiAJCWFzc2VydEVxdWFscyg0LCB0cmVlLmdldEVudHJ5Q291bnQoKSk7CiAKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LnNldFBvc3RPcmRlclRyYXZlcnNhbCh0cnVlKTsKIAkJCXR3LmFkZFRyZWUobmV3IERpckNhY2hlSXRlcmF0b3IodHJlZSkpOwogCkBAIC0xNjYsNyArMTY2LDcgQEAgcHVibGljIHZvaWQgdGVzdFdpdGhQb3N0T3JkZXJfTm9FbnRlclN1YnRyZWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYi5maW5pc2goKTsKIAkJYXNzZXJ0RXF1YWxzKDQsIHRyZWUuZ2V0RW50cnlDb3VudCgpKTsKIAotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuc2V0UG9zdE9yZGVyVHJhdmVyc2FsKHRydWUpOwogCQkJdHcuYWRkVHJlZShuZXcgRGlyQ2FjaGVJdGVyYXRvcih0cmVlKSk7CiAKQEAgLTE4MCw3ICsxODAsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0V2l0aFBvc3RPcmRlcl9Ob0VudGVyU3VidHJlZSgpIHRocm93cyBFeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSBEaXJDYWNoZUVudHJ5IG1ha2VGaWxlKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIERpckNhY2hlRW50cnkgbWFrZUZpbGUoU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24gewogCQlyZXR1cm4gY3JlYXRlRW50cnkocGF0aCwgUkVHVUxBUl9GSUxFKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQWx3YXlzQ2xvbmVUcmVlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0Fsd2F5c0Nsb25lVHJlZUZpbHRlci5qYXZhCmluZGV4IDhlMmNjYTQuLmQ5Y2ZiNjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQWx3YXlzQ2xvbmVUcmVlRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9BbHdheXNDbG9uZVRyZWVGaWx0ZXIuamF2YQpAQCAtNTIsNyArNTIsNyBAQCBwdWJsaWMgVHJlZUZpbHRlciBjbG9uZSgpIHsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90VHJlZUZpbHRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90VHJlZUZpbHRlclRlc3QuamF2YQppbmRleCBmN2E3ZmI4Li5jNjM4OWZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdFRyZWVGaWx0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RUcmVlRmlsdGVyVGVzdC5qYXZhCkBAIC01NywxMiArNTcsMTMgQEAKIHB1YmxpYyBjbGFzcyBOb3RUcmVlRmlsdGVyVGVzdCBleHRlbmRzIFJlcG9zaXRvcnlUZXN0Q2FzZSB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0V3JhcCgpIHRocm93cyBFeGNlcHRpb24gewotCQlmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYik7Ci0JCWZpbmFsIFRyZWVGaWx0ZXIgYSA9IFRyZWVGaWx0ZXIuQUxMOwotCQlmaW5hbCBUcmVlRmlsdGVyIG4gPSBOb3RUcmVlRmlsdGVyLmNyZWF0ZShhKTsKLQkJYXNzZXJ0Tm90TnVsbChuKTsKLQkJYXNzZXJ0VHJ1ZShhLmluY2x1ZGUodHcpKTsKLQkJYXNzZXJ0RmFsc2Uobi5pbmNsdWRlKHR3KSk7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCQlmaW5hbCBUcmVlRmlsdGVyIGEgPSBUcmVlRmlsdGVyLkFMTDsKKwkJCWZpbmFsIFRyZWVGaWx0ZXIgbiA9IE5vdFRyZWVGaWx0ZXIuY3JlYXRlKGEpOworCQkJYXNzZXJ0Tm90TnVsbChuKTsKKwkJCWFzc2VydFRydWUoYS5pbmNsdWRlKHR3KSk7CisJCQlhc3NlcnRGYWxzZShuLmluY2x1ZGUodHcpKTsKKwkJfQogCX0KIAogCUBUZXN0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXJHcm91cFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwVGVzdC5qYXZhCmluZGV4IGQ5MjFhYWIuLjcxYTJmMzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlckdyb3VwVGVzdC5qYXZhCkBAIC0yNTQsNyArMjU0LDcgQEAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpbmNsdWRlcyhUcmVlRmlsdGVyIGYsIFRyZWVXYWxrIHR3KQogCQl9CiAJfQogCi0JVHJlZVdhbGsgZmFrZVdhbGsoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJVHJlZVdhbGsgZmFrZVdhbGsoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCURpckNhY2hlIGRjID0gRGlyQ2FjaGUubmV3SW5Db3JlKCk7CiAJCURpckNhY2hlRWRpdG9yIGRjZSA9IGRjLmVkaXRvcigpOwogCQlkY2UuYWRkKG5ldyBEaXJDYWNoZUVkaXRvci5QYXRoRWRpdChwYXRoKSB7CkBAIC0yNzQsNyArMjc0LDcgQEAgcHVibGljIHZvaWQgYXBwbHkoRGlyQ2FjaGVFbnRyeSBlbnQpIHsKIAkJcmV0dXJuIHJldDsKIAl9CiAKLQlUcmVlV2FsayBmYWtlV2Fsa0F0U3VidHJlZShmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlUcmVlV2FsayBmYWtlV2Fsa0F0U3VidHJlZShTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJRGlyQ2FjaGUgZGMgPSBEaXJDYWNoZS5uZXdJbkNvcmUoKTsKIAkJRGlyQ2FjaGVFZGl0b3IgZGNlID0gZGMuZWRpdG9yKCk7CiAJCWRjZS5hZGQobmV3IERpckNhY2hlRWRpdG9yLlBhdGhFZGl0KHBhdGggKyAiL1JFQURNRSIpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlclRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlclRlc3QuamF2YQppbmRleCAzOGFkZGEzLi4xNDhkNWFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhTdWZmaXhGaWx0ZXJUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoU3VmZml4RmlsdGVyVGVzdC5qYXZhCkBAIC0xMTMsNyArMTEzLDcgQEAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0TWF0Y2hpbmdQYXRocyhTdHJpbmcgc3VmZml4RmlsdGVyLAogCiAJcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0TWF0Y2hpbmdQYXRocyhTdHJpbmcgc3VmZml4RmlsdGVyLAogCQkJZmluYWwgT2JqZWN0SWQgdHJlZUlkLCBib29sZWFuIHJlY3Vyc2l2ZVdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5zZXRGaWx0ZXIoUGF0aFN1ZmZpeEZpbHRlci5jcmVhdGUoc3VmZml4RmlsdGVyKSk7CiAJCQl0dy5zZXRSZWN1cnNpdmUocmVjdXJzaXZlV2Fsayk7CiAJCQl0dy5hZGRUcmVlKHRyZWVJZCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXJUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXJUZXN0LmphdmEKaW5kZXggYzM0MjNiNi4uODY4NmM0ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9UcmVlRmlsdGVyVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvVHJlZUZpbHRlclRlc3QuamF2YQpAQCAtNTUsNyArNTUsNyBAQAogcHVibGljIGNsYXNzIFRyZWVGaWx0ZXJUZXN0IGV4dGVuZHMgUmVwb3NpdG9yeVRlc3RDYXNlIHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RBTExfSW5jbHVkZXNBbnl0aGluZygpIHRocm93cyBFeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKGRiKSkgewogCQkJdHcuYWRkVHJlZShuZXcgRW1wdHlUcmVlSXRlcmF0b3IoKSk7CiAJCQlhc3NlcnRUcnVlKFRyZWVGaWx0ZXIuQUxMLmluY2x1ZGUodHcpKTsKIAkJfQpAQCAtNzMsNyArNzMsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0QUxMX0lkZW50aXR5Q2xvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE5vdEFMTF9JbmNsdWRlc05vdGhpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhkYikpIHsKIAkJCXR3LmFkZFRyZWUobmV3IEVtcHR5VHJlZUl0ZXJhdG9yKCkpOwogCQkJYXNzZXJ0RmFsc2UoVHJlZUZpbHRlci5BTEwubmVnYXRlKCkuaW5jbHVkZSh0dykpOwogCQl9CkBAIC04MSw3ICs4MSw3IEBAIHB1YmxpYyB2b2lkIHRlc3ROb3RBTExfSW5jbHVkZXNOb3RoaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RBTllfRElGRl9JbmNsdWRlc1NpbmdsZVRyZWVDYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CisJCXRyeSAoVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsoZGIpKSB7CiAJCQl0dy5hZGRUcmVlKG5ldyBFbXB0eVRyZWVJdGVyYXRvcigpKTsKIAkJCWFzc2VydFRydWUoVHJlZUZpbHRlci5BTllfRElGRi5pbmNsdWRlKHR3KSk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0NoYW5nZUlkVXRpbFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0NoYW5nZUlkVXRpbFRlc3QuamF2YQppbmRleCA2ZmVkMjMzLi44MTQ2N2MyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9DaGFuZ2VJZFV0aWxUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQ2hhbmdlSWRVdGlsVGVzdC5qYXZhCkBAIC02ODAsMTUgKzY4MCwxNSBAQCBwdWJsaWMgdm9pZCB0ZXN0SW5kZXhPZkNoYW5nZUlkKCkgewogCQkJCSJcbiIpKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgaG9va0RvZXNOb3RNb2RpZnkoZmluYWwgU3RyaW5nIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgaG9va0RvZXNOb3RNb2RpZnkoU3RyaW5nIGluKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJYXNzZXJ0RXF1YWxzKGluLCBjYWxsKGluKSk7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgY2FsbChmaW5hbCBTdHJpbmcgYm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgY2FsbChTdHJpbmcgYm9keSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCXJldHVybiBjYWxsKGJvZHksIGZhbHNlKTsKIAl9CiAKLQlwcml2YXRlIFN0cmluZyBjYWxsKGZpbmFsIFN0cmluZyBib2R5LCBib29sZWFuIHJlcGxhY2VFeGlzdGluZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgY2FsbChTdHJpbmcgYm9keSwgYm9vbGVhbiByZXBsYWNlRXhpc3RpbmcpIHRocm93cyBFeGNlcHRpb24gewogCQlPYmplY3RJZCBjb21wdXRlQ2hhbmdlSWQgPSBDaGFuZ2VJZFV0aWwuY29tcHV0ZUNoYW5nZUlkKHRyZWVJZDEsCiAJCQkJcGFyZW50SWQxLCBhdXRob3IsIGNvbW1pdHRlciwgYm9keSk7CiAJCWlmIChjb21wdXRlQ2hhbmdlSWQgPT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0hvb2tUZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Ib29rVGVzdC5qYXZhCmluZGV4IGE2ODBlZjkuLmUzNGMzY2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL0hvb2tUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSG9va1Rlc3QuamF2YQpAQCAtMjQxLDcgKzI0MSw3IEBAIHB1YmxpYyB2b2lkIHRlc3RGYWlsZWRQcmVDb21taXRIb29rQmxvY2tDb21taXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgRmlsZSB3cml0ZUhvb2tGaWxlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGF0YSkKKwlwcml2YXRlIEZpbGUgd3JpdGVIb29rRmlsZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRhdGEpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGaWxlIHBhdGggPSBuZXcgRmlsZShkYi5nZXRXb3JrVHJlZSgpICsgIi8uZ2l0L2hvb2tzLyIsIG5hbWUpOwogCQlKR2l0VGVzdFV0aWwud3JpdGUocGF0aCwgZGF0YSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9OQlRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL05CVGVzdC5qYXZhCmluZGV4IGQyZDQ0ZmYuLjgzMGYyMGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL05CVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL05CVGVzdC5qYXZhCkBAIC0zMzgsNyArMzM4LDcgQEAgcHVibGljIHZvaWQgdGVzdEVuY29kZUludDY0KCkgewogCQlhc3NlcnRPdXRwdXQoYigweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmKSwgb3V0LCAzKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByZXBhcmVPdXRwdXQoZmluYWwgYnl0ZVtdIGJ1ZikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgcHJlcGFyZU91dHB1dChieXRlW10gYnVmKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgYnVmLmxlbmd0aDsgaSsrKQogCQkJYnVmW2ldID0gKGJ5dGUpICgweDc3ICsgaSk7CiAJfQpAQCAtMzUzLDExICszNTMsMTEgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRPdXRwdXQoZmluYWwgYnl0ZVtdIGV4cGVjdCwgZmluYWwgYnl0ZVtdIGJ1ZiwKIAkJCWFzc2VydEVxdWFscygoYnl0ZSkgKDB4NzcgKyBpKSwgYnVmW2ldKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gYihmaW5hbCBpbnQgYSwgZmluYWwgaW50IGIpIHsKKwlwcml2YXRlIHN0YXRpYyBieXRlW10gYihpbnQgYSwgaW50IGIpIHsKIAkJcmV0dXJuIG5ldyBieXRlW10geyAoYnl0ZSkgYSwgKGJ5dGUpIGIgfTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gcGFkYihmaW5hbCBpbnQgbGVuLCBmaW5hbCBpbnQgYSwgZmluYWwgaW50IGIpIHsKKwlwcml2YXRlIHN0YXRpYyBieXRlW10gcGFkYihpbnQgbGVuLCBpbnQgYSwgaW50IGIpIHsKIAkJZmluYWwgYnl0ZVtdIHIgPSBuZXcgYnl0ZVtsZW4gKyAyXTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykKIAkJCXJbaV0gPSAoYnl0ZSkgMHhhZjsKQEAgLTM3MCw3ICszNzAsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydE91dHB1dChmaW5hbCBieXRlW10gZXhwZWN0LCBmaW5hbCBieXRlW10gYnVmLAogCQlyZXR1cm4gbmV3IGJ5dGVbXSB7IChieXRlKSBhLCAoYnl0ZSkgYiwgKGJ5dGUpIGMgfTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBieXRlW10gYihmaW5hbCBpbnQgYSwgZmluYWwgaW50IGIsIGZpbmFsIGludCBjLCBmaW5hbCBpbnQgZCkgeworCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBiKGludCBhLCBpbnQgYiwgaW50IGMsIGludCBkKSB7CiAJCXJldHVybiBuZXcgYnl0ZVtdIHsgKGJ5dGUpIGEsIChieXRlKSBiLCAoYnl0ZSkgYywgKGJ5dGUpIGQgfTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0JvdXJuZVN0eWxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lU3R5bGVUZXN0LmphdmEKaW5kZXggNjUwNzg3Ni4uNDlhZDU1ZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lU3R5bGVUZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lU3R5bGVUZXN0LmphdmEKQEAgLTUyLDE0ICs1MiwxNCBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgUXVvdGVkU3RyaW5nQm91cm5lU3R5bGVUZXN0IHsKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFF1b3RlKGZpbmFsIFN0cmluZyBpbiwgZmluYWwgU3RyaW5nIGV4cCkgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UXVvdGUoU3RyaW5nIGluLCBTdHJpbmcgZXhwKSB7CiAJCWZpbmFsIFN0cmluZyByID0gQk9VUk5FLnF1b3RlKGluKTsKIAkJYXNzZXJ0Tm90U2FtZShpbiwgcik7CiAJCWFzc2VydEZhbHNlKGluLmVxdWFscyhyKSk7CiAJCWFzc2VydEVxdWFscygnXCcnICsgZXhwICsgJ1wnJywgcik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnREZXF1b3RlKGZpbmFsIFN0cmluZyBleHAsIGZpbmFsIFN0cmluZyBpbikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RGVxdW90ZShTdHJpbmcgZXhwLCBTdHJpbmcgaW4pIHsKIAkJZmluYWwgYnl0ZVtdIGIgPSBDb25zdGFudHMuZW5jb2RlKCdcJycgKyBpbiArICdcJycpOwogCQlmaW5hbCBTdHJpbmcgciA9IEJPVVJORS5kZXF1b3RlKGIsIDAsIGIubGVuZ3RoKTsKIAkJYXNzZXJ0RXF1YWxzKGV4cCwgcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdCb3VybmVVc2VyUGF0aFN0eWxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nQm91cm5lVXNlclBhdGhTdHlsZVRlc3QuamF2YQppbmRleCA3NDYzNTI4Li4xN2YxYjc3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdCb3VybmVVc2VyUGF0aFN0eWxlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0JvdXJuZVVzZXJQYXRoU3R5bGVUZXN0LmphdmEKQEAgLTUyLDE0ICs1MiwxNCBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgUXVvdGVkU3RyaW5nQm91cm5lVXNlclBhdGhTdHlsZVRlc3QgewotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0UXVvdGUoZmluYWwgU3RyaW5nIGluLCBmaW5hbCBTdHJpbmcgZXhwKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRRdW90ZShTdHJpbmcgaW4sIFN0cmluZyBleHApIHsKIAkJZmluYWwgU3RyaW5nIHIgPSBCT1VSTkVfVVNFUl9QQVRILnF1b3RlKGluKTsKIAkJYXNzZXJ0Tm90U2FtZShpbiwgcik7CiAJCWFzc2VydEZhbHNlKGluLmVxdWFscyhyKSk7CiAJCWFzc2VydEVxdWFscygnXCcnICsgZXhwICsgJ1wnJywgcik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnREZXF1b3RlKGZpbmFsIFN0cmluZyBleHAsIGZpbmFsIFN0cmluZyBpbikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RGVxdW90ZShTdHJpbmcgZXhwLCBTdHJpbmcgaW4pIHsKIAkJZmluYWwgYnl0ZVtdIGIgPSBDb25zdGFudHMuZW5jb2RlKCdcJycgKyBpbiArICdcJycpOwogCQlmaW5hbCBTdHJpbmcgciA9IEJPVVJORV9VU0VSX1BBVEguZGVxdW90ZShiLCAwLCBiLmxlbmd0aCk7CiAJCWFzc2VydEVxdWFscyhleHAsIHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nR2l0UGF0aFN0eWxlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nR2l0UGF0aFN0eWxlVGVzdC5qYXZhCmluZGV4IGE2ZjMzNDUuLjlhMGM5NmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZ0dpdFBhdGhTdHlsZVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmdHaXRQYXRoU3R5bGVUZXN0LmphdmEKQEAgLTU0LDE0ICs1NCwxNCBAQAogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogCiBwdWJsaWMgY2xhc3MgUXVvdGVkU3RyaW5nR2l0UGF0aFN0eWxlVGVzdCB7Ci0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRRdW90ZShmaW5hbCBTdHJpbmcgZXhwLCBmaW5hbCBTdHJpbmcgaW4pIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFF1b3RlKFN0cmluZyBleHAsIFN0cmluZyBpbikgewogCQlmaW5hbCBTdHJpbmcgciA9IEdJVF9QQVRILnF1b3RlKGluKTsKIAkJYXNzZXJ0Tm90U2FtZShpbiwgcik7CiAJCWFzc2VydEZhbHNlKGluLmVxdWFscyhyKSk7CiAJCWFzc2VydEVxdWFscygnIicgKyBleHAgKyAnIicsIHIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RGVxdW90ZShmaW5hbCBTdHJpbmcgZXhwLCBmaW5hbCBTdHJpbmcgaW4pIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydERlcXVvdGUoU3RyaW5nIGV4cCwgU3RyaW5nIGluKSB7CiAJCWZpbmFsIGJ5dGVbXSBiID0gKCciJyArIGluICsgJyInKS5nZXRCeXRlcyhJU09fODg1OV8xKTsKIAkJZmluYWwgU3RyaW5nIHIgPSBHSVRfUEFUSC5kZXF1b3RlKGIsIDAsIGIubGVuZ3RoKTsKIAkJYXNzZXJ0RXF1YWxzKGV4cCwgcik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzX0hleFBhcnNlVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlsc19IZXhQYXJzZVRlc3QuamF2YQppbmRleCBmNWI1NmU3Li5mM2MwNDZkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzX0hleFBhcnNlVGVzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHNfSGV4UGFyc2VUZXN0LmphdmEKQEAgLTgxLDcgKzgxLDcgQEAgcHVibGljIHZvaWQgdGVzdEludDRfMSgpIHsKIAkJYXNzZXJ0Tm90SGV4KCcuJyk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnROb3RIZXgoZmluYWwgY2hhciBjKSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnROb3RIZXgoY2hhciBjKSB7CiAJCXRyeSB7CiAJCQlSYXdQYXJzZVV0aWxzLnBhcnNlSGV4SW50NCgoYnl0ZSkgYyk7CiAJCQlmYWlsKCJJbmNvcnJlY3RseSBhY2NjZXB0ZWQgIiArIGMpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlsc19MaW5lTWFwVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlsc19MaW5lTWFwVGVzdC5qYXZhCmluZGV4IDAyNDM3OTguLjc2MzBjMTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHNfTGluZU1hcFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzX0xpbmVNYXBUZXN0LmphdmEKQEAgLTQ3LDE4ICs0NywyNSBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5CaW5hcnlCbG9iRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKIAogcHVibGljIGNsYXNzIFJhd1BhcnNlVXRpbHNfTGluZU1hcFRlc3QgeworCUBSdWxlCisJcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworCiAJQFRlc3QKLQlwdWJsaWMgdm9pZCB0ZXN0RW1wdHkoKSB7CisJcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEludExpc3QgbWFwID0gUmF3UGFyc2VVdGlscy5saW5lTWFwKG5ldyBieXRlW10ge30sIDAsIDApOwogCQlhc3NlcnROb3ROdWxsKG1hcCk7CiAJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRSwgMH0sIGFzSW50cyhtYXApKTsKIAl9CiAKIAlAVGVzdAotCXB1YmxpYyB2b2lkIHRlc3RPbmVCbGFua0xpbmUoKSB7CisJcHVibGljIHZvaWQgdGVzdE9uZUJsYW5rTGluZSgpIHRocm93cyBFeGNlcHRpb24gIHsKIAkJZmluYWwgSW50TGlzdCBtYXAgPSBSYXdQYXJzZVV0aWxzLmxpbmVNYXAobmV3IGJ5dGVbXSB7ICdcbicgfSwgMCwgMSk7CiAJCWFzc2VydEFycmF5RXF1YWxzKG5ldyBpbnRbXXtJbnRlZ2VyLk1JTl9WQUxVRSwgMCwgMX0sIGFzSW50cyhtYXApKTsKIAl9CkBAIC04NSw2ICs5MiwxMyBAQCBwdWJsaWMgdm9pZCB0ZXN0QmluYXJ5KCkgewogCX0KIAogCUBUZXN0CisJcHVibGljIHZvaWQgdGVzdExpbmVNYXBPckJpbmFyeSgpIHRocm93cyBFeGNlcHRpb24geworCQlmaW5hbCBieXRlW10gYnVmID0gInh4eGZvb1xuYlwwYXIiLmdldEJ5dGVzKElTT184ODU5XzEpOworCQlleGNlcHRpb24uZXhwZWN0KEJpbmFyeUJsb2JFeGNlcHRpb24uY2xhc3MpOworCQlSYXdQYXJzZVV0aWxzLmxpbmVNYXBPckJpbmFyeShidWYsIDMsIGJ1Zi5sZW5ndGgpOworCX0KKworCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEZvdXJMaW5lQmxhbmtzKCkgewogCQlmaW5hbCBieXRlW10gYnVmID0gImZvb1xuXG5cbmJhclxuIi5nZXRCeXRlcyhJU09fODg1OV8xKTsKIAkJZmluYWwgSW50TGlzdCBtYXAgPSBSYXdQYXJzZVV0aWxzLmxpbmVNYXAoYnVmLCAwLCBidWYubGVuZ3RoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1N1YlN0cmluZ1BhdHRlcm5UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdTdWJTdHJpbmdQYXR0ZXJuVGVzdC5qYXZhCmluZGV4IGU4NTY2ZDIuLmE3NDhiNTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1N1YlN0cmluZ1BhdHRlcm5UZXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3U3ViU3RyaW5nUGF0dGVyblRlc3QuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOwogCkBAIC05Myw3ICs5Myw3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0TWF0Y2hSZXN1bHQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyBpbnB1dCwgaW50IHBvc2l0aW9uCiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgUmF3Q2hhclNlcXVlbmNlIHJhdyhTdHJpbmcgdGV4dCkgewotCQlieXRlW10gYnl0ZXMgPSB0ZXh0LmdldEJ5dGVzKFVURl84KTsKKwkJYnl0ZVtdIGJ5dGVzID0gdGV4dC5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJcmV0dXJuIG5ldyBSYXdDaGFyU2VxdWVuY2UoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTGlzdFRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1JlZkxpc3RUZXN0LmphdmEKaW5kZXggNWExNDY4YS4uZDEyNGQ3MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTGlzdFRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SZWZMaXN0VGVzdC5qYXZhCkBAIC00NTYsNyArNDU2LDcgQEAgcHJpdmF0ZSBzdGF0aWMgUmVmTGlzdDxSZWY+IHRvTGlzdChSZWYuLi4gcmVmcykgewogCQlyZXR1cm4gYi50b1JlZkxpc3QoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBSZWYgbmV3UmVmKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHJpdmF0ZSBzdGF0aWMgUmVmIG5ld1JlZihTdHJpbmcgbmFtZSkgewogCQlyZXR1cm4gbmV3IE9iamVjdElkUmVmLlVucGVlbGVkKFJlZi5TdG9yYWdlLkxPT1NFLCBuYW1lLCBJRCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyVGVzdC5qYXZhCmluZGV4IGQ5Nzg4MDQuLmVkY2NlMTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlclRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXJUZXN0LmphdmEKQEAgLTYxLDYgKzYxLDcgQEAKIHB1YmxpYyBjbGFzcyBUZW1wb3JhcnlCdWZmZXJUZXN0IHsKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCXRyeSB7CiAJCQliLmNsb3NlKCk7CkBAIC03NSw2ICs3Niw3IEBAIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RPbmVCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZSB0ZXN0ID0gKGJ5dGUpIG5ldyBUZXN0Um5nKGdldE5hbWUoKSkubmV4dEludCgpOwogCQl0cnkgewpAQCAtODcsMTAgKzg5LDggQEAgcHVibGljIHZvaWQgdGVzdE9uZUJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWFzc2VydEVxdWFscygxLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QsIHJbMF0pOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKDEsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdCwgclswXSk7CkBAIC0xMDIsNiArMTAyLDcgQEAgcHVibGljIHZvaWQgdGVzdE9uZUJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tfQnVsa1dyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpCiAJCQkJLm5leHRCeXRlcyhUZW1wb3JhcnlCdWZmZXIuQmxvY2suU1opOwpAQCAtMTE4LDEwICsxMTksOCBAQCBwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tfQnVsa1dyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKIAkJCX0KLQkJCXsKLQkJCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQliLndyaXRlVG8obywgbnVsbCk7Ci0JCQkJby5jbG9zZSgpOwogCQkJCWZpbmFsIGJ5dGVbXSByID0gby50b0J5dGVBcnJheSgpOwogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwpAQCAtMTMzLDYgKzEzMiw3IEBAIHB1YmxpYyB2b2lkIHRlc3RPbmVCbG9ja19CdWxrV3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tBbmRIYWxmX0J1bGtXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCWZpbmFsIGJ5dGVbXSB0ZXN0ID0gbmV3IFRlc3RSbmcoZ2V0TmFtZSgpKQogCQkJCS5uZXh0Qnl0ZXMoVGVtcG9yYXJ5QnVmZmVyLkJsb2NrLlNaICogMyAvIDIpOwpAQCAtMTQ5LDEwICsxNDksOCBAQCBwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tBbmRIYWxmX0J1bGtXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTE2NCw2ICsxNjIsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tBbmRIYWxmX0J1bGtXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RPbmVCbG9ja0FuZEhhbGZfU2luZ2xlV3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5CbG9jay5TWiAqIDMgLyAyKTsKQEAgLTE3OCwxMCArMTc3LDggQEAgcHVibGljIHZvaWQgdGVzdE9uZUJsb2NrQW5kSGFsZl9TaW5nbGVXcml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTE5Myw2ICsxOTAsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tBbmRIYWxmX1NpbmdsZVdyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdE9uZUJsb2NrQW5kSGFsZl9Db3B5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpCiAJCQkJLm5leHRCeXRlcyhUZW1wb3JhcnlCdWZmZXIuQmxvY2suU1ogKiAzIC8gMik7CkBAIC0yMDgsMTAgKzIwNiw4IEBAIHB1YmxpYyB2b2lkIHRlc3RPbmVCbG9ja0FuZEhhbGZfQ29weSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTIyMyw2ICsyMTksNyBAQCBwdWJsaWMgdm9pZCB0ZXN0T25lQmxvY2tBbmRIYWxmX0NvcHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0TGFyZ2VfU2luZ2xlV3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5ERUZBVUxUX0lOX0NPUkVfTElNSVQgKiAzKTsKQEAgLTIzNiwxMCArMjMzLDggQEAgcHVibGljIHZvaWQgdGVzdExhcmdlX1NpbmdsZVdyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKIAkJCX0KLQkJCXsKLQkJCQlmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKwkJCXRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKIAkJCQliLndyaXRlVG8obywgbnVsbCk7Ci0JCQkJby5jbG9zZSgpOwogCQkJCWZpbmFsIGJ5dGVbXSByID0gby50b0J5dGVBcnJheSgpOwogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwpAQCAtMjUzLDE4ICsyNDgsMTggQEAgcHVibGljIHZvaWQgdGVzdExhcmdlX1NpbmdsZVdyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAlwdWJsaWMgdm9pZCB0ZXN0SW5Db3JlSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBpbnQgY250ID0gMjU2OwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkubmV4dEJ5dGVzKGNudCk7Ci0JCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkhlYXAoY250ICsgNCk7Ci0JCWIud3JpdGUodGVzdCk7Ci0JCWIuY2xvc2UoKTsKLQotCQlJbnB1dFN0cmVhbSBpbiA9IGIub3BlbklucHV0U3RyZWFtKCk7Ci0JCWJ5dGVbXSBhY3QgPSBuZXcgYnl0ZVtjbnRdOwotCQlJTy5yZWFkRnVsbHkoaW4sIGFjdCwgMCwgY250KTsKLQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgYWN0KTsKKwkJdHJ5IChUZW1wb3JhcnlCdWZmZXIuSGVhcCBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5IZWFwKGNudCArIDQpKSB7CisJCQliLndyaXRlKHRlc3QpOworCQkJSW5wdXRTdHJlYW0gaW4gPSBiLm9wZW5JbnB1dFN0cmVhbSgpOworCQkJYnl0ZVtdIGFjdCA9IG5ldyBieXRlW2NudF07CisJCQlJTy5yZWFkRnVsbHkoaW4sIGFjdCwgMCwgY250KTsKKwkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIGFjdCk7CisJCX0KIAl9CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RJbkNvcmVMaW1pdF9Td2l0Y2hPbkFwcGVuZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5ERUZBVUxUX0lOX0NPUkVfTElNSVQgKyAxKTsKQEAgLTI3OSwxMCArMjc0LDggQEAgcHVibGljIHZvaWQgdGVzdEluQ29yZUxpbWl0X1N3aXRjaE9uQXBwZW5kQnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CiAJCQl9Ci0JCQl7Ci0JCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisJCQl0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CiAJCQkJYi53cml0ZVRvKG8sIG51bGwpOwotCQkJCW8uY2xvc2UoKTsKIAkJCQlmaW5hbCBieXRlW10gciA9IG8udG9CeXRlQXJyYXkoKTsKIAkJCQlhc3NlcnRFcXVhbHModGVzdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyh0ZXN0LCByKTsKQEAgLTI5NCw2ICsyODcsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0SW5Db3JlTGltaXRfU3dpdGNoT25BcHBlbmRCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEluQ29yZUxpbWl0X1N3aXRjaEJlZm9yZUFwcGVuZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBieXRlW10gdGVzdCA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKIAkJCQkubmV4dEJ5dGVzKFRlbXBvcmFyeUJ1ZmZlci5ERUZBVUxUX0lOX0NPUkVfTElNSVQgKiAzKTsKQEAgLTMwOCwxMCArMzAyLDggQEAgcHVibGljIHZvaWQgdGVzdEluQ29yZUxpbWl0X1N3aXRjaEJlZm9yZUFwcGVuZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CkBAIC0zMjMsNiArMzE1LDcgQEAgcHVibGljIHZvaWQgdGVzdEluQ29yZUxpbWl0X1N3aXRjaEJlZm9yZUFwcGVuZEJ5dGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0SW5Db3JlTGltaXRfU3dpdGNoT25Db3B5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQnVmZmVyIGlzIGV4cGxpY2l0bHkgZGVzdHJveWVkIGluIGZpbmFsbHkgYmxvY2sKIAkJZmluYWwgVGVtcG9yYXJ5QnVmZmVyIGIgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyLkxvY2FsRmlsZShudWxsKTsKIAkJZmluYWwgYnl0ZVtdIHRlc3QgPSBuZXcgVGVzdFJuZyhnZXROYW1lKCkpCiAJCQkJLm5leHRCeXRlcyhUZW1wb3JhcnlCdWZmZXIuREVGQVVMVF9JTl9DT1JFX0xJTUlUICogMik7CkBAIC0zNDAsMTAgKzMzMyw4IEBAIHB1YmxpYyB2b2lkIHRlc3RJbkNvcmVMaW1pdF9Td2l0Y2hPbkNvcHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWFzc2VydEVxdWFscyh0ZXN0Lmxlbmd0aCwgci5sZW5ndGgpOwogCQkJCWFzc2VydEFycmF5RXF1YWxzKHRlc3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKHRlc3QubGVuZ3RoLCByLmxlbmd0aCk7CiAJCQkJYXNzZXJ0QXJyYXlFcXVhbHModGVzdCwgcik7CkBAIC0zNTUsNyArMzQ2LDcgQEAgcHVibGljIHZvaWQgdGVzdEluQ29yZUxpbWl0X1N3aXRjaE9uQ29weSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3REZXN0cm95V2hpbGVPcGVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIiAvKiBqYXZhIDcgKi8pCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEJ1ZmZlciBpcyBleHBsaWNpdGx5IGRlc3Ryb3llZCBpbiBmaW5hbGx5IGJsb2NrCiAJCWZpbmFsIFRlbXBvcmFyeUJ1ZmZlciBiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUobnVsbCk7CiAJCXRyeSB7CiAJCQliLndyaXRlKG5ldyBUZXN0Um5nKGdldE5hbWUoKSkKQEAgLTM2Nyw2ICszNTgsNyBAQCBwdWJsaWMgdm9pZCB0ZXN0RGVzdHJveVdoaWxlT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlAVGVzdAogCXB1YmxpYyB2b2lkIHRlc3RSYW5kb21Xcml0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBCdWZmZXIgaXMgZXhwbGljaXRseSBkZXN0cm95ZWQgaW4gZmluYWxseSBibG9jawogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuTG9jYWxGaWxlKG51bGwpOwogCQlmaW5hbCBUZXN0Um5nIHJuZyA9IG5ldyBUZXN0Um5nKGdldE5hbWUoKSk7CiAJCWZpbmFsIGludCBtYXggPSBUZW1wb3JhcnlCdWZmZXIuREVGQVVMVF9JTl9DT1JFX0xJTUlUICogMjsKQEAgLTM5OSwxMCArMzkxLDggQEAgcHVibGljIHZvaWQgdGVzdFJhbmRvbVdyaXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyhleHBlY3QsIHIpOwogCQkJfQotCQkJewotCQkJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewogCQkJCWIud3JpdGVUbyhvLCBudWxsKTsKLQkJCQlvLmNsb3NlKCk7CiAJCQkJZmluYWwgYnl0ZVtdIHIgPSBvLnRvQnl0ZUFycmF5KCk7CiAJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdC5sZW5ndGgsIHIubGVuZ3RoKTsKIAkJCQlhc3NlcnRBcnJheUVxdWFscyhleHBlY3QsIHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbVRlc3QuamF2YQppbmRleCBhNzJkMzNjLi4wNjU1ODI3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRk91dHB1dFN0cmVhbVRlc3QuamF2YQpAQCAtOTYsMzIgKzk2LDMxIEBAIHByaXZhdGUgdm9pZCBhc3NlcnROb0NyTGZIZWxwZXIoU3RyaW5nIGV4cGVjdCwgU3RyaW5nIGlucHV0KQogCQlmb3IgKGludCBpID0gLTQ7IGkgPCA1OyArK2kpIHsKIAkJCWludCBzaXplID0gTWF0aC5hYnMoaSk7CiAJCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbc2l6ZV07Ci0JCQlJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbmJ5dGVzKTsKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEF1dG9DUkxGT3V0cHV0U3RyZWFtKGJvcyk7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQlpbnQgbjsKLQkJCQl3aGlsZSAoKG4gPSBpbi5yZWFkKGJ1ZikpID49IDApIHsKLQkJCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbik7CisJCQl0cnkgKElucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGluYnl0ZXMpOworCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEF1dG9DUkxGT3V0cHV0U3RyZWFtKGJvcykpIHsKKwkJCQlpZiAoaSA+IDApIHsKKwkJCQkJaW50IG47CisJCQkJCXdoaWxlICgobiA9IGluLnJlYWQoYnVmKSkgPj0gMCkgeworCQkJCQkJb3V0LndyaXRlKGJ1ZiwgMCwgbik7CisJCQkJCX0KKwkJCQl9IGVsc2UgaWYgKGkgPCAwKSB7CisJCQkJCWludCBuOworCQkJCQl3aGlsZSAoKG4gPSBpbi5yZWFkKGJ1ZikpID49IDApIHsKKwkJCQkJCWJ5dGVbXSBiID0gbmV3IGJ5dGVbbl07CisJCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgMCwgYiwgMCwgbik7CisJCQkJCQlvdXQud3JpdGUoYik7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpbnQgYzsKKwkJCQkJd2hpbGUgKChjID0gaW4ucmVhZCgpKSAhPSAtMSkKKwkJCQkJCW91dC53cml0ZShjKTsKIAkJCQl9Ci0JCQl9IGVsc2UgaWYgKGkgPCAwKSB7Ci0JCQkJaW50IG47Ci0JCQkJd2hpbGUgKChuID0gaW4ucmVhZChidWYpKSA+PSAwKSB7Ci0JCQkJCWJ5dGVbXSBiID0gbmV3IGJ5dGVbbl07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoYnVmLCAwLCBiLCAwLCBuKTsKLQkJCQkJb3V0LndyaXRlKGIpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJaW50IGM7Ci0JCQkJd2hpbGUgKChjID0gaW4ucmVhZCgpKSAhPSAtMSkKLQkJCQkJb3V0LndyaXRlKGMpOworCQkJCW91dC5mbHVzaCgpOworCQkJCWJ5dGVbXSBhY3R1YWxCeXRlcyA9IGJvcy50b0J5dGVBcnJheSgpOworCQkJCUFzc2VydC5hc3NlcnRFcXVhbHMoImJ1ZnNpemU9IiArIHNpemUsIGVuY29kZShleHBlY3RCeXRlcyksCisJCQkJCQllbmNvZGUoYWN0dWFsQnl0ZXMpKTsKIAkJCX0KLQkJCW91dC5mbHVzaCgpOwotCQkJaW4uY2xvc2UoKTsKLQkJCW91dC5jbG9zZSgpOwotCQkJYnl0ZVtdIGFjdHVhbEJ5dGVzID0gYm9zLnRvQnl0ZUFycmF5KCk7Ci0JCQlBc3NlcnQuYXNzZXJ0RXF1YWxzKCJidWZzaXplPSIgKyBzaXplLCBlbmNvZGUoZXhwZWN0Qnl0ZXMpLAotCQkJCQllbmNvZGUoYWN0dWFsQnl0ZXMpKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGSW5wdXRTdHJlYW1UZXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbVRlc3QuamF2YQppbmRleCAzODE5OWQ4Li41MDU4MTY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbVRlc3QuamF2YQpAQCAtNDQsNyArNDQsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pbzsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CkBAIC05NywzOCArOTcsNDEgQEAgcHVibGljIHZvaWQgdGVzdEJpbmFyeURvbnREZXRlY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0KGJ5dGVbXSBpbnB1dCwgYnl0ZVtdIGV4cGVjdGVkLAogCQkJYm9vbGVhbiBkZXRlY3RCaW5hcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIElucHV0U3RyZWFtIGJpczEgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQpOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBjaXMxID0gbmV3IEF1dG9MRklucHV0U3RyZWFtKGJpczEsIGRldGVjdEJpbmFyeSk7Ci0JCWludCBpbmRleDEgPSAwOwotCQlmb3IgKGludCBiID0gY2lzMS5yZWFkKCk7IGIgIT0gLTE7IGIgPSBjaXMxLnJlYWQoKSkgewotCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW2luZGV4MV0sIChieXRlKSBiKTsKLQkJCWluZGV4MSsrOwotCQl9Ci0KLQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmxlbmd0aCwgaW5kZXgxKTsKLQotCQlmb3IgKGludCBidWZmZXJTaXplID0gMTsgYnVmZmVyU2l6ZSA8IDEwOyBidWZmZXJTaXplKyspIHsKLQkJCWZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtidWZmZXJTaXplXTsKLQkJCWZpbmFsIElucHV0U3RyZWFtIGJpczIgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQpOwotCQkJZmluYWwgSW5wdXRTdHJlYW0gY2lzMiA9IG5ldyBBdXRvTEZJbnB1dFN0cmVhbShiaXMyLCBkZXRlY3RCaW5hcnkpOwotCi0JCQlpbnQgcmVhZCA9IDA7Ci0JCQlmb3IgKGludCByZWFkTm93ID0gY2lzMi5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7IHJlYWROb3cgIT0gLTEKLQkJCQkJJiYgcmVhZCA8IGV4cGVjdGVkLmxlbmd0aDsgcmVhZE5vdyA9IGNpczIucmVhZChidWZmZXIsIDAsCi0JCQkJCWJ1ZmZlci5sZW5ndGgpKSB7Ci0JCQkJZm9yIChpbnQgaW5kZXgyID0gMDsgaW5kZXgyIDwgcmVhZE5vdzsgaW5kZXgyKyspIHsKLQkJCQkJYXNzZXJ0RXF1YWxzKGV4cGVjdGVkW3JlYWQgKyBpbmRleDJdLCBidWZmZXJbaW5kZXgyXSk7Ci0JCQkJfQotCQkJCXJlYWQgKz0gcmVhZE5vdzsKKwkJdHJ5IChJbnB1dFN0cmVhbSBiaXMxID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0KTsKKwkJCQlJbnB1dFN0cmVhbSBjaXMxID0gbmV3IEF1dG9MRklucHV0U3RyZWFtKGJpczEsIGRldGVjdEJpbmFyeSkpIHsKKwkJCWludCBpbmRleDEgPSAwOworCQkJZm9yIChpbnQgYiA9IGNpczEucmVhZCgpOyBiICE9IC0xOyBiID0gY2lzMS5yZWFkKCkpIHsKKwkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRbaW5kZXgxXSwgKGJ5dGUpIGIpOworCQkJCWluZGV4MSsrOwogCQkJfQogCi0JCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCByZWFkKTsKLQkJCWNpczIuY2xvc2UoKTsKKwkJCWFzc2VydEVxdWFscyhleHBlY3RlZC5sZW5ndGgsIGluZGV4MSk7CisKKwkJCWZvciAoaW50IGJ1ZmZlclNpemUgPSAxOyBidWZmZXJTaXplIDwgMTA7IGJ1ZmZlclNpemUrKykgeworCQkJCWZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtidWZmZXJTaXplXTsKKwkJCQl0cnkgKElucHV0U3RyZWFtIGJpczIgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQpOworCQkJCQkJSW5wdXRTdHJlYW0gY2lzMiA9IG5ldyBBdXRvTEZJbnB1dFN0cmVhbShiaXMyLAorCQkJCQkJCQlkZXRlY3RCaW5hcnkpKSB7CisKKwkJCQkJaW50IHJlYWQgPSAwOworCQkJCQlmb3IgKGludCByZWFkTm93ID0gY2lzMi5yZWFkKGJ1ZmZlciwgMCwKKwkJCQkJCQlidWZmZXIubGVuZ3RoKTsgcmVhZE5vdyAhPSAtMQorCQkJCQkJCQkJJiYgcmVhZCA8IGV4cGVjdGVkLmxlbmd0aDsgcmVhZE5vdyA9IGNpczIKKwkJCQkJCQkJCQkJLnJlYWQoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKSkgeworCQkJCQkJZm9yIChpbnQgaW5kZXgyID0gMDsgaW5kZXgyIDwgcmVhZE5vdzsgaW5kZXgyKyspIHsKKwkJCQkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWRbcmVhZCArIGluZGV4Ml0sCisJCQkJCQkJCQlidWZmZXJbaW5kZXgyXSk7CisJCQkJCQl9CisJCQkJCQlyZWFkICs9IHJlYWROb3c7CisJCQkJCX0KKworCQkJCQlhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCByZWFkKTsKKwkJCQl9CisJCQl9CiAJCX0KLQkJY2lzMS5jbG9zZSgpOwogCX0KIAogCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBhc0J5dGVzKFN0cmluZyBpbikgewotCQlyZXR1cm4gaW4uZ2V0Qnl0ZXMoVVRGXzgpOworCQlyZXR1cm4gaW4uZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVW5pb25JbnB1dFN0cmVhbVRlc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1VuaW9uSW5wdXRTdHJlYW1UZXN0LmphdmEKaW5kZXggNmI1ZWY3ZS4uYjgyNGZhZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVW5pb25JbnB1dFN0cmVhbVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9VbmlvbklucHV0U3RyZWFtVGVzdC5qYXZhCkBAIC01OCwxMyArNTgsMTMgQEAKIHB1YmxpYyBjbGFzcyBVbmlvbklucHV0U3RyZWFtVGVzdCB7CiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0RW1wdHlTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBVbmlvbklucHV0U3RyZWFtIHUgPSBuZXcgVW5pb25JbnB1dFN0cmVhbSgpOwotCQlhc3NlcnRUcnVlKHUuaXNFbXB0eSgpKTsKLQkJYXNzZXJ0RXF1YWxzKC0xLCB1LnJlYWQoKSk7Ci0JCWFzc2VydEVxdWFscygtMSwgdS5yZWFkKG5ldyBieXRlWzFdLCAwLCAxKSk7Ci0JCWFzc2VydEVxdWFscygwLCB1LmF2YWlsYWJsZSgpKTsKLQkJYXNzZXJ0RXF1YWxzKDAsIHUuc2tpcCgxKSk7Ci0JCXUuY2xvc2UoKTsKKwkJdHJ5IChVbmlvbklucHV0U3RyZWFtIHUgPSBuZXcgVW5pb25JbnB1dFN0cmVhbSgpKSB7CisJCQlhc3NlcnRUcnVlKHUuaXNFbXB0eSgpKTsKKwkJCWFzc2VydEVxdWFscygtMSwgdS5yZWFkKCkpOworCQkJYXNzZXJ0RXF1YWxzKC0xLCB1LnJlYWQobmV3IGJ5dGVbMV0sIDAsIDEpKTsKKwkJCWFzc2VydEVxdWFscygwLCB1LmF2YWlsYWJsZSgpKTsKKwkJCWFzc2VydEVxdWFscygwLCB1LnNraXAoMSkpOworCQl9CiAJfQogCiAJQFRlc3QKQEAgLTIxMSwyNSArMjExLDI0IEBAIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogCiAJQFRlc3QKIAlwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VEdXJpbmdDbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIFVuaW9uSW5wdXRTdHJlYW0gdSA9IG5ldyBVbmlvbklucHV0U3RyZWFtKCk7CiAJCWZpbmFsIGJvb2xlYW4gY2xvc2VkW10gPSBuZXcgYm9vbGVhblsyXTsKLQkJdS5hZGQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAxIH0pIHsKLQkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgY2xvc2UoKSB7Ci0JCQkJY2xvc2VkWzBdID0gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0JCXUuYWRkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgMiB9KSB7Ci0JCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgewotCQkJCWNsb3NlZFsxXSA9IHRydWU7Ci0JCQl9Ci0JCX0pOworCQl0cnkgKFVuaW9uSW5wdXRTdHJlYW0gdSA9IG5ldyBVbmlvbklucHV0U3RyZWFtKCkpIHsKKwkJCXUuYWRkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHsgMSB9KSB7CisJCQkJQE92ZXJyaWRlCisJCQkJcHVibGljIHZvaWQgY2xvc2UoKSB7CisJCQkJCWNsb3NlZFswXSA9IHRydWU7CisJCQkJfQorCQkJfSk7CisJCQl1LmFkZChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbXSB7IDIgfSkgeworCQkJCUBPdmVycmlkZQorCQkJCXB1YmxpYyB2b2lkIGNsb3NlKCkgeworCQkJCQljbG9zZWRbMV0gPSB0cnVlOworCQkJCX0KKwkJCX0pOwogCi0JCWFzc2VydEZhbHNlKGNsb3NlZFswXSk7Ci0JCWFzc2VydEZhbHNlKGNsb3NlZFsxXSk7Ci0KLQkJdS5jbG9zZSgpOworCQkJYXNzZXJ0RmFsc2UoY2xvc2VkWzBdKTsKKwkJCWFzc2VydEZhbHNlKGNsb3NlZFsxXSk7CisJCX0KIAogCQlhc3NlcnRUcnVlKGNsb3NlZFswXSk7CiAJCWFzc2VydFRydWUoY2xvc2VkWzFdKTsKQEAgLTIzNyw2ICsyMzYsNyBAQCBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAogCUBUZXN0CiAJcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbkR1cmluZ0Nsb3NlKCkgeworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBXZSBhcmUgdGVzdGluZyB0aGUgY2xvc2UoKSBtZXRob2QKIAkJZmluYWwgVW5pb25JbnB1dFN0cmVhbSB1ID0gbmV3IFVuaW9uSW5wdXRTdHJlYW0oKTsKIAkJdS5hZGQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10geyAxIH0pIHsKIAkJCUBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvc2hhMS9TSEExVGVzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC50ZXN0L3RzdC9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvc2hhMS9TSEExVGVzdC5qYXZhCmluZGV4IGU2MDQ1YTkuLjNjNjEyZTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudGVzdC90c3Qvb3JnL2VjbGlwc2UvamdpdC91dGlsL3NoYTEvU0hBMVRlc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnRlc3QvdHN0L29yZy9lY2xpcHNlL2pnaXQvdXRpbC9zaGExL1NIQTFUZXN0LmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTsKIAotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7CitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CkBAIC05NSwxNSArOTUsMTUgQEAgcHVibGljIHZvaWQgdGVzdDEoKSB0aHJvd3MgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIHsKIAkJCQkuZnJvbVN0cmluZygiYTk5OTNlMzY0NzA2ODE2YWJhM2UyNTcxNzg1MGMyNmM5Y2QwZDg5ZCIpOwogCiAJCU1lc3NhZ2VEaWdlc3QgbSA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQS0xIik7Ci0JCW0udXBkYXRlKFRFU1QxLmdldEJ5dGVzKFVURl84KSk7CisJCW0udXBkYXRlKFRFU1QxLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJT2JqZWN0SWQgbTEgPSBPYmplY3RJZC5mcm9tUmF3KG0uZGlnZXN0KCkpOwogCiAJCVNIQTEgcyA9IFNIQTEubmV3SW5zdGFuY2UoKTsKLQkJcy51cGRhdGUoVEVTVDEuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJcy51cGRhdGUoVEVTVDEuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlPYmplY3RJZCBzMSA9IE9iamVjdElkLmZyb21SYXcocy5kaWdlc3QoKSk7CiAKIAkJcy5yZXNldCgpOwotCQlzLnVwZGF0ZShURVNUMS5nZXRCeXRlcyhVVEZfOCkpOworCQlzLnVwZGF0ZShURVNUMS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCU9iamVjdElkIHMyID0gcy50b09iamVjdElkKCk7CiAKIAkJYXNzZXJ0RXF1YWxzKG0xLCBzMSk7CkBAIC0xMTcsMTUgKzExNywxNSBAQCBwdWJsaWMgdm9pZCB0ZXN0MigpIHRocm93cyBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gewogCQkJCS5mcm9tU3RyaW5nKCI4NDk4M2U0NDFjM2JkMjZlYmFhZTRhYTFmOTUxMjllNWU1NDY3MGYxIik7CiAKIAkJTWVzc2FnZURpZ2VzdCBtID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiU0hBLTEiKTsKLQkJbS51cGRhdGUoVEVTVDIuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJbS51cGRhdGUoVEVTVDIuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlPYmplY3RJZCBtMSA9IE9iamVjdElkLmZyb21SYXcobS5kaWdlc3QoKSk7CiAKIAkJU0hBMSBzID0gU0hBMS5uZXdJbnN0YW5jZSgpOwotCQlzLnVwZGF0ZShURVNUMi5nZXRCeXRlcyhVVEZfOCkpOworCQlzLnVwZGF0ZShURVNUMi5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCU9iamVjdElkIHMxID0gT2JqZWN0SWQuZnJvbVJhdyhzLmRpZ2VzdCgpKTsKIAogCQlzLnJlc2V0KCk7Ci0JCXMudXBkYXRlKFRFU1QyLmdldEJ5dGVzKFVURl84KSk7CisJCXMudXBkYXRlKFRFU1QyLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJT2JqZWN0SWQgczIgPSBzLnRvT2JqZWN0SWQoKTsKIAogCQlhc3NlcnRFcXVhbHMobTEsIHMxKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDU0YTI2YjkuLjc2NjdhZjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvb3JnLmVjbGlwc2UuamdpdC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtNCwxNCArNCwxNCBAQAogQnVuZGxlLU5hbWU6ICVwbHVnaW5fbmFtZQogQXV0b21hdGljLU1vZHVsZS1OYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnVpCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnVpCi1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDUuMC40LnF1YWxpZmllcgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1SZXF1aXJlZEV4ZWN1dGlvbkVudmlyb25tZW50OiBKYXZhU0UtMS44Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hd3R1aTt2ZXJzaW9uPSI0LjExLjgiCi1JbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmxpYjt2ZXJzaW9uPSJbNC4xMS44LDQuMTIuMCkiLAotIG9yZy5lY2xpcHNlLmpnaXQubmxzO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249Ils0LjExLjgsNC4xMi4wKSIsCi0gb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzQuMTEuOCw0LjEyLjApIgorRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpnaXQuYXd0dWk7dmVyc2lvbj0iNS4wLjQiCitJbXBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5lcnJvcnM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZwbG90O3ZlcnNpb249Ils1LjAuNCw1LjEuMCkiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSJbNS4wLjQsNS4xLjApIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7dmVyc2lvbj0iWzUuMC40LDUuMS4wKSIKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQudWkvcG9tLnhtbCBiL29yZy5lY2xpcHNlLmpnaXQudWkvcG9tLnhtbAppbmRleCBhMDcyNzc4Li43ZDEwYzA5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3BvbS54bWwKKysrIGIvb3JnLmVjbGlwc2UuamdpdC51aS9wb20ueG1sCkBAIC01Miw3ICs1Miw3IEBACiAgIDxwYXJlbnQ+CiAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamdpdDwvZ3JvdXBJZD4KICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj40LjExLjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPHZlcnNpb24+NS4wLjQtU05BUFNIT1Q8L3ZlcnNpb24+CiAgIDwvcGFyZW50PgogCiAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQudWk8L2FydGlmYWN0SWQ+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0FXVFBsb3RSZW5kZXJlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9BV1RQbG90UmVuZGVyZXIuamF2YQppbmRleCBiY2NmMGMwLi5iMWZmZmQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0FXVFBsb3RSZW5kZXJlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvQVdUUGxvdFJlbmRlcmVyLmphdmEKQEAgLTY2LDExICs2NiwxMSBAQCBmaW5hbCBjbGFzcyBBV1RQbG90UmVuZGVyZXIgZXh0ZW5kcyBBYnN0cmFjdFBsb3RSZW5kZXJlcjxTd2luZ0xhbmUsIENvbG9yPgogCiAJdHJhbnNpZW50IEdyYXBoaWNzMkQgZzsKIAotCUFXVFBsb3RSZW5kZXJlcihmaW5hbCBHcmFwaENlbGxSZW5kZXIgYykgeworCUFXVFBsb3RSZW5kZXJlcihHcmFwaENlbGxSZW5kZXIgYykgewogCQljZWxsID0gYzsKIAl9CiAKLQl2b2lkIHBhaW50KGZpbmFsIEdyYXBoaWNzIGluLCBmaW5hbCBQbG90Q29tbWl0PFN3aW5nTGFuZT4gY29tbWl0KSB7CisJdm9pZCBwYWludChHcmFwaGljcyBpbiwgUGxvdENvbW1pdDxTd2luZ0xhbmU+IGNvbW1pdCkgewogCQlnID0gKEdyYXBoaWNzMkQpIGluLmNyZWF0ZSgpOwogCQl0cnkgewogCQkJZmluYWwgaW50IGggPSBjZWxsLmdldEhlaWdodCgpOwpAQCAtMTI1LDcgKzEyNSw3IEBAIHByb3RlY3RlZCB2b2lkIGRyYXdCb3VuZGFyeURvdChmaW5hbCBpbnQgeCwgZmluYWwgaW50IHksIGZpbmFsIGludCB3LAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBkcmF3VGV4dChmaW5hbCBTdHJpbmcgbXNnLCBmaW5hbCBpbnQgeCwgZmluYWwgaW50IHkpIHsKKwlwcm90ZWN0ZWQgdm9pZCBkcmF3VGV4dChTdHJpbmcgbXNnLCBpbnQgeCwgaW50IHkpIHsKIAkJZmluYWwgaW50IHRleHRoID0gZy5nZXRGb250TWV0cmljcygpLmdldEhlaWdodCgpOwogCQlmaW5hbCBpbnQgeTAgPSAoeSAtIHRleHRoKSAvIDIgKyAoY2VsbC5nZXRIZWlnaHQoKSAtIHRleHRoKSAvIDI7CiAJCWcuc2V0Q29sb3IoY2VsbC5nZXRGb3JlZ3JvdW5kKCkpOwpAQCAtMTM0LDExICsxMzQsMTEgQEAgcHJvdGVjdGVkIHZvaWQgZHJhd1RleHQoZmluYWwgU3RyaW5nIG1zZywgZmluYWwgaW50IHgsIGZpbmFsIGludCB5KSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBDb2xvciBsYW5lQ29sb3IoZmluYWwgU3dpbmdMYW5lIG15TGFuZSkgeworCXByb3RlY3RlZCBDb2xvciBsYW5lQ29sb3IoU3dpbmdMYW5lIG15TGFuZSkgewogCQlyZXR1cm4gbXlMYW5lICE9IG51bGwgPyBteUxhbmUuY29sb3IgOiBDb2xvci5ibGFjazsKIAl9CiAKLQl2b2lkIHBhaW50VHJpYW5nbGVEb3duKGZpbmFsIGludCBjeCwgZmluYWwgaW50IHksIGZpbmFsIGludCBoKSB7CisJdm9pZCBwYWludFRyaWFuZ2xlRG93bihpbnQgY3gsIGludCB5LCBpbnQgaCkgewogCQlmaW5hbCBpbnQgdGlwWCA9IGN4OwogCQlmaW5hbCBpbnQgdGlwWSA9IHkgKyBoOwogCQlmaW5hbCBpbnQgYmFzZVgxID0gY3ggLSAxMCAvIDI7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0NvbW1pdEdyYXBoUGFuZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9Db21taXRHcmFwaFBhbmUuamF2YQppbmRleCBkMTIyYTc3Li45NDNhMzI1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL0NvbW1pdEdyYXBoUGFuZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvQ29tbWl0R3JhcGhQYW5lLmphdmEKQEAgLTExNCw3ICsxMTQsNyBAQCBwdWJsaWMgUGxvdENvbW1pdExpc3QgZ2V0Q29tbWl0TGlzdCgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoZmluYWwgVGFibGVNb2RlbCBkYXRhTW9kZWwpIHsKKwlwdWJsaWMgdm9pZCBzZXRNb2RlbChUYWJsZU1vZGVsIGRhdGFNb2RlbCkgewogCQlpZiAoZGF0YU1vZGVsICE9IG51bGwgJiYgIShkYXRhTW9kZWwgaW5zdGFuY2VvZiBDb21taXRUYWJsZU1vZGVsKSkKIAkJCXRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oVUlUZXh0LmdldCgpLm11c3RCZVNwZWNpYWxUYWJsZU1vZGVsKTsKIAkJc3VwZXIuc2V0TW9kZWwoZGF0YU1vZGVsKTsKQEAgLTE2MSw3ICsxNjEsNyBAQCBwdWJsaWMgaW50IGdldFJvd0NvdW50KCkgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChmaW5hbCBpbnQgcm93SW5kZXgsIGZpbmFsIGludCBjb2x1bW5JbmRleCkgeworCQlwdWJsaWMgT2JqZWN0IGdldFZhbHVlQXQoaW50IHJvd0luZGV4LCBpbnQgY29sdW1uSW5kZXgpIHsKIAkJCWZpbmFsIFBsb3RDb21taXQ8U3dpbmdMYW5lPiBjID0gYWxsQ29tbWl0cy5nZXQocm93SW5kZXgpOwogCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewogCQkJY2FzZSAwOgpAQCAtMTc1LDcgKzE3NSw3IEBAIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBdChmaW5hbCBpbnQgcm93SW5kZXgsIGZpbmFsIGludCBjb2x1bW5JbmRleCkgewogCQkJfQogCQl9CiAKLQkJUGVyc29uSWRlbnQgYXV0aG9yRm9yKGZpbmFsIFBsb3RDb21taXQ8U3dpbmdMYW5lPiBjKSB7CisJCVBlcnNvbklkZW50IGF1dGhvckZvcihQbG90Q29tbWl0PFN3aW5nTGFuZT4gYykgewogCQkJaWYgKGMgIT0gbGFzdENvbW1pdCkgewogCQkJCWxhc3RDb21taXQgPSBjOwogCQkJCWxhc3RBdXRob3IgPSBjLmdldEF1dGhvcklkZW50KCk7CkBAIC0yNDQsNyArMjQ0LDcgQEAgcHVibGljIENvbXBvbmVudCBnZXRUYWJsZUNlbGxSZW5kZXJlckNvbXBvbmVudChmaW5hbCBKVGFibGUgdGFibGUsCiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21wb25lbnQoZmluYWwgR3JhcGhpY3MgaW5wdXRHcmFwaGljcykgeworCQlwcm90ZWN0ZWQgdm9pZCBwYWludENvbXBvbmVudChHcmFwaGljcyBpbnB1dEdyYXBoaWNzKSB7CiAJCQlpZiAoaW5wdXRHcmFwaGljcyA9PSBudWxsKQogCQkJCXJldHVybjsKIAkJCXJlbmRlcmVyLnBhaW50KGlucHV0R3JhcGhpY3MsIGNvbW1pdCk7CkBAIC0yNTksNyArMjU5LDcgQEAgcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21wb25lbnQoZmluYWwgR3JhcGhpY3MgaW5wdXRHcmFwaGljcykgewogCQkJc3Ryb2tlQ2FjaGVbaV0gPSBuZXcgQmFzaWNTdHJva2UoaSk7CiAJfQogCi0Jc3RhdGljIFN0cm9rZSBzdHJva2UoZmluYWwgaW50IHdpZHRoKSB7CisJc3RhdGljIFN0cm9rZSBzdHJva2UoaW50IHdpZHRoKSB7CiAJCWlmICh3aWR0aCA8IHN0cm9rZUNhY2hlLmxlbmd0aCkKIAkJCXJldHVybiBzdHJva2VDYWNoZVt3aWR0aF07CiAJCXJldHVybiBuZXcgQmFzaWNTdHJva2Uod2lkdGgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9Td2luZ0NvbW1pdExpc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQudWkvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXd0dWkvU3dpbmdDb21taXRMaXN0LmphdmEKaW5kZXggNzQzZWI3OC4uMTA1MTljYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC51aS9zcmMvb3JnL2VjbGlwc2UvamdpdC9hd3R1aS9Td2luZ0NvbW1pdExpc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0LnVpL3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2F3dHVpL1N3aW5nQ29tbWl0TGlzdC5qYXZhCkBAIC03OSw3ICs3OSw3IEBAIHByb3RlY3RlZCBTd2luZ0xhbmUgY3JlYXRlTGFuZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcmVjeWNsZUxhbmUoZmluYWwgU3dpbmdMYW5lIGxhbmUpIHsKKwlwcm90ZWN0ZWQgdm9pZCByZWN5Y2xlTGFuZShTd2luZ0xhbmUgbGFuZSkgewogCQljb2xvcnMuYWRkKGxhbmUuY29sb3IpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzIGIvb3JnLmVjbGlwc2UuamdpdC8uc2V0dGluZ3MvLmFwaV9maWx0ZXJzCmluZGV4IGNjMGQ3MGQuLmU2YTY5OGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvLnNldHRpbmdzLy5hcGlfZmlsdGVycworKysgYi9vcmcuZWNsaXBzZS5qZ2l0Ly5zZXR0aW5ncy8uYXBpX2ZpbHRlcnMKQEAgLTMsMTcgKzMsOCBAQAogICAgIDxyZXNvdXJjZSBwYXRoPSJNRVRBLUlORi9NQU5JRkVTVC5NRiI+CiAgICAgICAgIDxmaWx0ZXIgaWQ9IjkyNDg0NDAzOSI+CiAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjQuMTEuNyIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI0LjExLjAiLz4KLSAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgIDwvZmlsdGVyPgotICAgIDwvcmVzb3VyY2U+Ci0gICAgPHJlc291cmNlIHBhdGg9InNyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YSIgdHlwZT0ib3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzIj4KLSAgICAgICAgPGZpbHRlciBpZD0iMTE0MTg5OTI2NiI+Ci0gICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudHM+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjQuNyIvPgotICAgICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50IHZhbHVlPSI0LjExIi8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkxPQ0tfU1VGRklYIi8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMC40Ii8+CisgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjUuMC4wIi8+CiAgICAgICAgICAgICA8L21lc3NhZ2VfYXJndW1lbnRzPgogICAgICAgICA8L2ZpbHRlcj4KICAgICA8L3Jlc291cmNlPgpAQCAtMzcsNyArMjgsNyBAQAogICAgICAgICA8ZmlsdGVyIGlkPSIxMTQxODk5MjY2Ij4KICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KICAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNC43Ii8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjQuMTEiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNS4wIi8+CiAgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9ImNyZWF0ZU5ld0ZpbGVBdG9taWMoRmlsZSkiLz4KICAgICAgICAgICAgIDwvbWVzc2FnZV9hcmd1bWVudHM+CiAgICAgICAgIDwvZmlsdGVyPgpAQCAtNTIsNyArNDMsNyBAQAogICAgICAgICA8ZmlsdGVyIGlkPSIxMTQxODk5MjY2Ij4KICAgICAgICAgICAgIDxtZXNzYWdlX2FyZ3VtZW50cz4KICAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNC43Ii8+Ci0gICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IjQuMTEiLz4KKyAgICAgICAgICAgICAgICA8bWVzc2FnZV9hcmd1bWVudCB2YWx1ZT0iNS4wIi8+CiAgICAgICAgICAgICAgICAgPG1lc3NhZ2VfYXJndW1lbnQgdmFsdWU9IkxvY2tUb2tlbiIvPgogICAgICAgICAgICAgPC9tZXNzYWdlX2FyZ3VtZW50cz4KICAgICAgICAgPC9maWx0ZXI+CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL01BTklGRVNULk1GIGIvb3JnLmVjbGlwc2UuamdpdC9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCAyYTU1ZDhhLi5hODExNGQ5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTMsMTIgKzMsMTIgQEAKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luX25hbWUKIEF1dG9tYXRpYy1Nb2R1bGUtTmFtZTogb3JnLmVjbGlwc2UuamdpdAogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuamdpdAotQnVuZGxlLVZlcnNpb246IDQuMTEuOC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiA1LjAuNC5xdWFsaWZpZXIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgogQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyX25hbWUKIEJ1bmRsZS1BY3RpdmF0aW9uUG9saWN5OiBsYXp5Ci1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSI0LjExLjgiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXBpO3ZlcnNpb249IjQuMTEuOCI7CitFeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9uczt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC5hcGk7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYsCkBAIC0yMiw1MiArMjIsNTIgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQuc3VibW9kdWxlLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iNC4xMS44Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMiLAotIG9yZy5lY2xpcHNlLmpnaXQuYXR0cmlidXRlczt2ZXJzaW9uPSI0LjExLjgiLAotIG9yZy5lY2xpcHNlLmpnaXQuYmxhbWU7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnM7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycyIsCisgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmJsYW1lO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmRpZmYiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQuZGlmZjt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnBhdGNoLAogICAgb3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAotIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmRpcmNhY2hlO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzLAogICAgb3JnLmVjbGlwc2UuamdpdC5hdHRyaWJ1dGVzIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmVycm9yczt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2ssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUiLAotIG9yZy5lY2xpcHNlLmpnaXQuZXZlbnRzO3ZlcnNpb249IjQuMTEuOCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmZubWF0Y2g7dmVyc2lvbj0iNC4xMS44IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG87dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmV2ZW50czt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmZubWF0Y2g7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQuZ2l0cmVwbzt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmFwaSwKICAgIG9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLnhtbC5zYXguaGVscGVycywKICAgIG9yZy54bWwuc2F4IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmdpdHJlcG8uaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS44Ijt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iNC4xMS44Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIiLAotIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlO3ZlcnNpb249IjQuMTEuOCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pZ25vcmUuaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS44Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS44Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5odHRwLnRlc3QiLAotIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuZnNjazt2ZXJzaW9uPSI0LjExLjgiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5rZXRjaDt2ZXJzaW9uPSI0LjExLjgiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5naXRyZXBvLmludGVybmFsO3ZlcnNpb249IjUuMC40Ijt4LWludGVybmFsOj10cnVlLAorIG9yZy5lY2xpcHNlLmpnaXQuaG9va3M7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCisgb3JnLmVjbGlwc2UuamdpdC5pZ25vcmU7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQuaWdub3JlLmludGVybmFsO3ZlcnNpb249IjUuMC40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWw7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdCIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5mc2NrO3ZlcnNpb249IjUuMC40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRlc3QiLAorIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwua2V0Y2g7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZGZzO3ZlcnNpb249IjUuMC40IjsKICAgeC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5odHRwLnNlcnZlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQuaHR0cC50ZXN0LAogICAgb3JnLmVjbGlwc2UuamdpdC5sZnMudGVzdCIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGU7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI1LjAuNCI7CiAgIHgtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQudGVzdCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuanVuaXQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0Lmh0dHAsCkBAIC03NSwxMiArNzUsMTIgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQubGZzLAogICAgb3JnLmVjbGlwc2UuamdpdC5wZ20sCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnBnbS50ZXN0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuaW87dmVyc2lvbj0iNC4xMS44Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iNC4xMS44Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmlvO3ZlcnNpb249IjUuMC40Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCisgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iNS4wLjQiO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpnaXQuanVuaXQsb3JnLmVjbGlwc2UuamdpdC50ZXN0LG9yZy5lY2xpcHNlLmpnaXQucGdtIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7dmVyc2lvbj0iNS4wLjQiOwogICB4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmh0dHAudGVzdCxvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRyZWU7dmVyc2lvbj0iNC4xMS44Ijt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qZ2l0Lmp1bml0LG9yZy5lY2xpcHNlLmpnaXQudGVzdCxvcmcuZWNsaXBzZS5qZ2l0LnBnbSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWI7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdHJlZTt2ZXJzaW9uPSI1LjAuNCI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuamdpdC5qdW5pdCxvcmcuZWNsaXBzZS5qZ2l0LnRlc3Qsb3JnLmVjbGlwc2UuamdpdC5wZ20iLAorIG9yZy5lY2xpcHNlLmpnaXQubGliO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC51dGlsLApAQCAtOTAsMzMgKzkwLDMzIEBACiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZSIsCi0gb3JnLmVjbGlwc2UuamdpdC5saWIuaW50ZXJuYWw7dmVyc2lvbj0iNC4xMS44Ijt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2U7dmVyc2lvbj0iNC4xMS44IjsKKyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5pbnRlcm5hbDt2ZXJzaW9uPSI1LjAuNCI7eC1pbnRlcm5hbDo9dHJ1ZSwKKyBvcmcuZWNsaXBzZS5qZ2l0Lm1lcmdlO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlmZiwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmFwaSIsCi0gb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iNC4xMS44IiwKLSBvcmcuZWNsaXBzZS5qZ2l0Lm5vdGVzO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC5ubHM7dmVyc2lvbj0iNS4wLjQiLAorIG9yZy5lY2xpcHNlLmpnaXQubm90ZXM7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLAogICAgb3JnLmVjbGlwc2UuamdpdC5tZXJnZSIsCi0gb3JnLmVjbGlwc2UuamdpdC5wYXRjaDt2ZXJzaW9uPSI0LjExLjgiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LmRpZmYiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSI0LjExLjgiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsiLAotIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsazt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQucGF0Y2g7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LmRpZmYiLAorIG9yZy5lY2xpcHNlLmpnaXQucmV2cGxvdDt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsayIsCisgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmVld2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLAogICAgb3JnLmVjbGlwc2UuamdpdC5kaWZmLAogICAgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlciIsCi0gb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlcjt2ZXJzaW9uPSI0LjExLjgiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssb3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI0LjExLjgiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnV0aWwiLAotIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrO3ZlcnNpb249IjQuMTEuOCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnN1Ym1vZHVsZTt2ZXJzaW9uPSI0LjExLjgiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcixvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXI7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssb3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC51dGlsIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnN0b3JhZ2UuZmlsZTt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQudXRpbCIsCisgb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLnBhY2s7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYiIsCisgb3JnLmVjbGlwc2UuamdpdC5zdWJtb2R1bGU7dmVyc2lvbj0iNS4wLjQiO3VzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LmxpYixvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlcixvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrIiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDt2ZXJzaW9uPSI1LjAuNCI7CiAgIHVzZXM6PSJvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQucmV2d2FsaywKICAgIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5wYWNrLApAQCAtMTI4LDI0ICsxMjgsMjQgQEAKICAgIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0Lmh0dHAsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycywKICAgIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrIiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5odHRwO3ZlcnNpb249IjQuMTEuOCI7dXNlczo9ImphdmF4Lm5ldC5zc2wiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249IjQuMTEuOCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrO3ZlcnNpb249IjQuMTEuOCI7Cisgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cDt2ZXJzaW9uPSI1LjAuNCI7dXNlczo9ImphdmF4Lm5ldC5zc2wiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LnJlc29sdmVyO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQiLAorIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGs7dmVyc2lvbj0iNS4wLjQiOwogICB1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC5saWIsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGssCiAgICBvcmcuZWNsaXBzZS5qZ2l0LmF0dHJpYnV0ZXMsCiAgICBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLmZpbHRlciwKICAgIG9yZy5lY2xpcHNlLmpnaXQudXRpbCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUiLAotIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249IjQuMTEuOCI7dXNlczo9Im9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsiLAotIG9yZy5lY2xpcHNlLmpnaXQudXRpbDt2ZXJzaW9uPSI0LjExLjgiOworIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyO3ZlcnNpb249IjUuMC40Ijt1c2VzOj0ib3JnLmVjbGlwc2UuamdpdC50cmVld2FsayIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsO3ZlcnNpb249IjUuMC40IjsKICAgdXNlczo9Im9yZy5lY2xpcHNlLmpnaXQubGliLAogICAgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cCwKICAgIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5maWxlLAogICAgb3JnLmlldGYuamdzcyIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249IjQuMTEuOCIsCi0gb3JnLmVjbGlwc2UuamdpdC51dGlsLnNoYTE7dmVyc2lvbj0iNC4xMS44IiwKLSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwudGltZTt2ZXJzaW9uPSI0LjExLjgiCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvO3ZlcnNpb249IjUuMC40IiwKKyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuc2hhMTt2ZXJzaW9uPSI1LjAuNCIsCisgb3JnLmVjbGlwc2UuamdpdC51dGlsLnRpbWU7dmVyc2lvbj0iNS4wLjQiCiBCdW5kbGUtUmVxdWlyZWRFeGVjdXRpb25FbnZpcm9ubWVudDogSmF2YVNFLTEuOAogSW1wb3J0LVBhY2thZ2U6IGNvbS5nb29nbGVjb2RlLmphdmFld2FoO3ZlcnNpb249IlsxLjEuNiwyLjAuMCkiLAogIGNvbS5qY3JhZnQuanNjaDt2ZXJzaW9uPSJbMC4xLjM3LDAuMi4wKSIsCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L01FVEEtSU5GL1NPVVJDRS1NQU5JRkVTVC5NRiBiL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCmluZGV4IDQ2YTczZjguLmIyZDY5NGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvTUVUQS1JTkYvU09VUkNFLU1BTklGRVNULk1GCkBAIC0zLDUgKzMsNSBAQAogQnVuZGxlLU5hbWU6IG9yZy5lY2xpcHNlLmpnaXQgLSBTb3VyY2VzCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qZ2l0LnNvdXJjZQogQnVuZGxlLVZlbmRvcjogRWNsaXBzZS5vcmcgLSBKR2l0Ci1CdW5kbGUtVmVyc2lvbjogNC4xMS44LnF1YWxpZmllcgotRWNsaXBzZS1Tb3VyY2VCdW5kbGU6IG9yZy5lY2xpcHNlLmpnaXQ7dmVyc2lvbj0iNC4xMS44LnF1YWxpZmllciI7cm9vdHM9Ii4iCitCdW5kbGUtVmVyc2lvbjogNS4wLjQucXVhbGlmaWVyCitFY2xpcHNlLVNvdXJjZUJ1bmRsZTogb3JnLmVjbGlwc2UuamdpdDt2ZXJzaW9uPSI1LjAuNC5xdWFsaWZpZXIiO3Jvb3RzPSIuIgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9wb20ueG1sIGIvb3JnLmVjbGlwc2UuamdpdC9wb20ueG1sCmluZGV4IGY0NTdjMzguLjJiNTZkMGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvcG9tLnhtbAorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3BvbS54bWwKQEAgLTUzLDcgKzUzLDcgQEAKICAgPHBhcmVudD4KICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLmpnaXQtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjQuMTEuOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KICAgPC9wYXJlbnQ+CiAKICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UuamdpdDwvYXJ0aWZhY3RJZD4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQucHJvcGVydGllcyBiL29yZy5lY2xpcHNlLmpnaXQvcmVzb3VyY2VzL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQucHJvcGVydGllcwppbmRleCA4MTVjNjcyLi4wMTc2NjJkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3Jlc291cmNlcy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LnByb3BlcnRpZXMKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9yZXNvdXJjZXMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5wcm9wZXJ0aWVzCkBAIC0yMjYsNiArMjI2LDggQEAKIGNyZWRlbnRpYWxVc2VybmFtZT1Vc2VybmFtZQogZGFlbW9uQWxyZWFkeVJ1bm5pbmc9RGFlbW9uIGFscmVhZHkgcnVubmluZwogZGF5c0Fnbz17MH0gZGF5cyBhZ28KK2RlZXBlbk5vdFdpdGhEZWVwZW49Q2Fubm90IGNvbWJpbmUgZGVlcGVuIHdpdGggZGVlcGVuLW5vdAorZGVlcGVuU2luY2VXaXRoRGVlcGVuPUNhbm5vdCBjb21iaW5lIGRlZXBlbiB3aXRoIGRlZXBlbi1zaW5jZQogZGVsZXRlQnJhbmNoVW5leHBlY3RlZFJlc3VsdD1EZWxldGUgYnJhbmNoIHJldHVybmVkIHVuZXhwZWN0ZWQgcmVzdWx0IHswfQogZGVsZXRlRmlsZUZhaWxlZD1Db3VsZCBub3QgZGVsZXRlIGZpbGUgezB9CiBkZWxldGVSZXF1aXJlc1plcm9OZXdJZD1EZWxldGUgcmVxdWlyZXMgbmV3IElEIHRvIGJlIHplcm8KQEAgLTMxMSw2ICszMTMsNyBAQAogZmlsZU1vZGVOb3RTZXRGb3JQYXRoPUZpbGVNb2RlIG5vdCBzZXQgZm9yIHBhdGggezB9CiBmaWx0ZXJFeGVjdXRpb25GYWlsZWQ9RXhlY3V0aW9uIG9mIGZpbHRlciBjb21tYW5kICcnezB9Jycgb24gZmlsZSAnJ3sxfScnIGZhaWxlZAogZmlsdGVyRXhlY3V0aW9uRmFpbGVkUmM9RXhlY3V0aW9uIG9mIGZpbHRlciBjb21tYW5kICcnezB9Jycgb24gZmlsZSAnJ3sxfScnIGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICcnezJ9JycsIG1lc3NhZ2Ugb24gc3RkZXJyOiAnJ3szfScnCitmaWx0ZXJSZXF1aXJlc0NhcGFiaWxpdHk9ZmlsdGVyIHJlcXVpcmVzIHNlcnZlciB0byBhZHZlcnRpc2UgdGhhdCBjYXBhYmlsaXR5CiBmaW5kaW5nR2FyYmFnZT1GaW5kaW5nIGdhcmJhZ2UKIGZsYWdJc0Rpc3Bvc2VkPXswfSBpcyBkaXNwb3NlZC4KIGZsYWdOb3RGcm9tVGhpcz17MH0gbm90IGZyb20gdGhpcy4KQEAgLTM2Miw2ICszNjUsNyBAQAogaW52YWxpZERlcHRoPUludmFsaWQgZGVwdGg6IHswfQogaW52YWxpZEVuY3J5cHRpb249SW52YWxpZCBlbmNyeXB0aW9uCiBpbnZhbGlkRXhwYW5kV2lsZGNhcmQ9RXhwYW5kRnJvbVNvdXJjZSBvbiBhIHJlZnNwZWMgdGhhdCBjYW4gaGF2ZSBtaXNtYXRjaGVkIHdpbGRjYXJkcyBkb2VzIG5vdCBtYWtlIHNlbnNlLgoraW52YWxpZEZpbHRlcj1JbnZhbGlkIGZpbHRlcjogezB9CiBpbnZhbGlkR2l0ZGlyUmVmID0gSW52YWxpZCAuZ2l0IHJlZmVyZW5jZSBpbiBmaWxlICcnezB9JycKIGludmFsaWRHaXRNb2R1bGVzPUludmFsaWQgLmdpdG1vZHVsZXMgZmlsZQogaW52YWxpZEdpdFR5cGU9aW52YWxpZCBnaXQgdHlwZTogezB9CkBAIC0zOTgsNiArNDAyLDcgQEAKIGludmFsaWRTeXN0ZW1Qcm9wZXJ0eT1JbnZhbGlkIHN5c3RlbSBwcm9wZXJ0eSAnJ3swfScnOiAnJ3sxfScnOyB1c2luZyBkZWZhdWx0IHZhbHVlIHsyfQogaW52YWxpZFRhZ09wdGlvbj1JbnZhbGlkIHRhZyBvcHRpb246IHswfQogaW52YWxpZFRpbWVvdXQ9SW52YWxpZCB0aW1lb3V0OiB7MH0KK2ludmFsaWRUaW1lc3RhbXA9SW52YWxpZCB0aW1lc3RhbXAgaW4gezB9CiBpbnZhbGlkVGltZVVuaXRWYWx1ZTI9SW52YWxpZCB0aW1lIHVuaXQgdmFsdWU6IHswfS57MX09ezJ9CiBpbnZhbGlkVGltZVVuaXRWYWx1ZTM9SW52YWxpZCB0aW1lIHVuaXQgdmFsdWU6IHswfS57MX0uezJ9PXszfQogaW52YWxpZFRyZWVaZXJvTGVuZ3RoTmFtZT1DYW5ub3QgYXBwZW5kIGEgdHJlZSBlbnRyeSB3aXRoIHplcm8tbGVuZ3RoIG5hbWUKQEAgLTYyOSw2ICs2MzQsNyBAQAogc291cmNlUmVmRG9lc250UmVzb2x2ZVRvQW55T2JqZWN0PVNvdXJjZSByZWYgezB9IGRvZXNuJyd0IHJlc29sdmUgdG8gYW55IG9iamVjdC4KIHNvdXJjZVJlZk5vdFNwZWNpZmllZEZvclJlZnNwZWM9U291cmNlIHJlZiBub3Qgc3BlY2lmaWVkIGZvciByZWZzcGVjOiB7MH0KIHNxdWFzaENvbW1pdE5vdFVwZGF0aW5nSEVBRD1TcXVhc2ggY29tbWl0IC0tIG5vdCB1cGRhdGluZyBIRUFECitzc2hDb21tYW5kRmFpbGVkPUV4ZWN1dGlvbiBvZiBzc2ggY29tbWFuZCAnJ3swfScnIGZhaWxlZCB3aXRoIGVycm9yICcnezF9JycKIHNzaFVzZXJOYW1lRXJyb3I9SnNjaCBlcnJvcjogZmFpbGVkIHRvIHNldCBTU0ggdXNlciBuYW1lIGNvcnJlY3RseSB0byAnJ3swfScnOyB1c2luZyAnJ3sxfScnIHBpY2tlZCB1cCBmcm9tIFNTSCBjb25maWcgZmlsZS4KIHNzbEZhaWx1cmVFeGNlcHRpb25NZXNzYWdlPVNlY3VyZSBjb25uZWN0aW9uIHRvIHswfSBjb3VsZCBub3QgYmUgc3RhYmxpc2hlZCBiZWNhdXNlIG9mIFNTTCBwcm9ibGVtcwogc3NsRmFpbHVyZUluZm89QSBzZWN1cmUgY29ubmVjdGlvbiB0byB7MH1cbmNvdWxkIG5vdCBiZSBlc3RhYmxpc2hlZCBiZWNhdXNlIHRoZSBzZXJ2ZXInJ3MgY2VydGlmaWNhdGUgY291bGQgbm90IGJlIHZhbGlkYXRlZC4KQEAgLTY3Myw2ICs2NzksNyBAQAogdGltZUlzVW5jZXJ0YWluPVRpbWUgaXMgdW5jZXJ0YWluCiB0aW1lckFscmVhZHlUZXJtaW5hdGVkPVRpbWVyIGFscmVhZHkgdGVybWluYXRlZAogdG9vTWFueUNvbW1hbmRzPVRvbyBtYW55IGNvbW1hbmRzCit0b29NYW55RmlsdGVycz1Ub28gbWFueSAiZmlsdGVyIiBsaW5lcyBpbiByZXF1ZXN0CiB0b29NYW55SW5jbHVkZVJlY3Vyc2lvbnM9VG9vIG1hbnkgcmVjdXJzaW9uczsgY2lyY3VsYXIgaW5jbHVkZXMgaW4gY29uZmlnIGZpbGUocyk/CiB0b3BvbG9naWNhbFNvcnRSZXF1aXJlZD1Ub3BvbG9naWNhbCBzb3J0IHJlcXVpcmVkLgogdHJhbnNhY3Rpb25BYm9ydGVkPXRyYW5zYWN0aW9uIGFib3J0ZWQKQEAgLTcxNiw2ICs3MjMsNyBAQAogdW5leHBlY3RlZEVvZkluUGFjaz1VbmV4cGVjdGVkIEVPRiBpbiBwYXJ0aWFsbHkgY3JlYXRlZCBwYWNrCiB1bmV4cGVjdGVkSHVua1RyYWlsZXI9VW5leHBlY3RlZCBodW5rIHRyYWlsZXIKIHVuZXhwZWN0ZWRPZGRSZXN1bHQ9b2RkOiB7MH0gKyB7MX0gLSB7Mn0KK3VuZXhwZWN0ZWRQYWNrZXRMaW5lPXVuZXhwZWN0ZWQgezB9CiB1bmV4cGVjdGVkUmVmUmVwb3J0PXswfTogdW5leHBlY3RlZCByZWYgcmVwb3J0OiB7MX0KIHVuZXhwZWN0ZWRSZXBvcnRMaW5lPXVuZXhwZWN0ZWQgcmVwb3J0IGxpbmU6IHswfQogdW5leHBlY3RlZFJlcG9ydExpbmUyPXswfSB1bmV4cGVjdGVkIHJlcG9ydCBsaW5lOiB7MX0KQEAgLTczMCw2ICs3MzgsNyBAQAogdW5rbm93bk9iamVjdFR5cGUyPXVua25vd24KIHVua25vd25SZXBvc2l0b3J5Rm9ybWF0PVVua25vd24gcmVwb3NpdG9yeSBmb3JtYXQKIHVua25vd25SZXBvc2l0b3J5Rm9ybWF0Mj1Vbmtub3duIHJlcG9zaXRvcnkgZm9ybWF0ICJ7MH0iOyBleHBlY3RlZCAiMCIuCit1bmtub3duVHJhbnNwb3J0Q29tbWFuZD11bmtub3duIGNvbW1hbmQgezB9CiB1bmtub3duWmxpYkVycm9yPVVua25vd24gemxpYiBlcnJvci4KIHVubG9ja0xvY2tGaWxlRmFpbGVkPVVubG9ja2luZyBMb2NrRmlsZSAnJ3swfScnIGZhaWxlZAogdW5tZXJnZWRQYXRoPVVubWVyZ2VkIHBhdGg6IHswfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0FyY2hpdmVDb21tYW5kLmphdmEKaW5kZXggMTAzOTdmOC4uMjdiYjVhOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQXJjaGl2ZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9BcmNoaXZlQ29tbWFuZC5qYXZhCkBAIC0xNTcsMzAgKzE1Nyw2IEBAIFQgY3JlYXRlQXJjaGl2ZU91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gcywgTWFwPFN0cmluZywgT2JqZWN0PiBvKQogCQkgKgogCQkgKiBAcGFyYW0gb3V0CiAJCSAqICAgICAgICAgICAgYXJjaGl2ZSBvYmplY3QgZnJvbSBjcmVhdGVBcmNoaXZlT3V0cHV0U3RyZWFtCi0JCSAqIEBwYXJhbSBwYXRoCi0JCSAqICAgICAgICAgICAgZnVsbCBmaWxlbmFtZSByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgYXJjaGl2ZSAod2l0aAotCQkgKiAgICAgICAgICAgIHRyYWlsaW5nICcvJyBmb3IgZGlyZWN0b3JpZXMpCi0JCSAqIEBwYXJhbSBtb2RlCi0JCSAqICAgICAgICAgICAgbW9kZSAoZm9yIGV4YW1wbGUgRmlsZU1vZGUuUkVHVUxBUl9GSUxFIG9yCi0JCSAqICAgICAgICAgICAgRmlsZU1vZGUuU1lNTElOSykKLQkJICogQHBhcmFtIGxvYWRlcgotCQkgKiAgICAgICAgICAgIGJsb2Igb2JqZWN0IHdpdGggZGF0YSBmb3IgdGhpcyBlbnRyeSAobnVsbCBmb3IKLQkJICogICAgICAgICAgICBkaXJlY3RvcmllcykKLQkJICogQHRocm93cyBJT0V4Y2VwdGlvbgotCQkgKiAgICAgICAgICAgICB0aHJvd24gYnkgdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbSBmb3IgSS9PIGVycm9ycwotCQkgKiBAZGVwcmVjYXRlZCB1c2UKLQkJICogICAgICAgICAgICAge0BsaW5rICNwdXRFbnRyeShDbG9zZWFibGUsIE9iamVjdElkLCBTdHJpbmcsIEZpbGVNb2RlLCBPYmplY3RMb2FkZXIpfQotCQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JCSAqLwotCQlARGVwcmVjYXRlZAotCQl2b2lkIHB1dEVudHJ5KFQgb3V0LCBTdHJpbmcgcGF0aCwgRmlsZU1vZGUgbW9kZSwKLQkJCQkJICBPYmplY3RMb2FkZXIgbG9hZGVyKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkJLyoqCi0JCSAqIFdyaXRlIGFuIGVudHJ5IHRvIGFuIGFyY2hpdmUuCi0JCSAqCi0JCSAqIEBwYXJhbSBvdXQKLQkJICogICAgICAgICAgICBhcmNoaXZlIG9iamVjdCBmcm9tIGNyZWF0ZUFyY2hpdmVPdXRwdXRTdHJlYW0KIAkJICogQHBhcmFtIHRyZWUKIAkJICogICAgICAgICAgICB0aGUgdGFnLCBjb21taXQsIG9yIHRyZWUgb2JqZWN0IHRvIHByb2R1Y2UgYW4gYXJjaGl2ZSBmb3IKIAkJICogQHBhcmFtIHBhdGgKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DaGVycnlQaWNrQ29tbWFuZC5qYXZhCmluZGV4IGY0NWUzOWUuLjY1YjcyZjcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NoZXJyeVBpY2tDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ2hlcnJ5UGlja0NvbW1hbmQuamF2YQpAQCAtMjg4LDcgKzI4OCw3IEBAIHB1YmxpYyBDaGVycnlQaWNrQ29tbWFuZCBzZXRPdXJDb21taXROYW1lKFN0cmluZyBvdXJDb21taXROYW1lKSB7CiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKiBAc2luY2UgMy4xCiAJICovCi0JcHVibGljIENoZXJyeVBpY2tDb21tYW5kIHNldFJlZmxvZ1ByZWZpeChmaW5hbCBTdHJpbmcgcHJlZml4KSB7CisJcHVibGljIENoZXJyeVBpY2tDb21tYW5kIHNldFJlZmxvZ1ByZWZpeChTdHJpbmcgcHJlZml4KSB7CiAJCXRoaXMucmVmbG9nUHJlZml4ID0gcHJlZml4OwogCQlyZXR1cm4gdGhpczsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DbG9uZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Nsb25lQ29tbWFuZC5qYXZhCmluZGV4IDc5YjBlZmIuLjVjMDZiYWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Nsb25lQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Nsb25lQ29tbWFuZC5qYXZhCkBAIC0xOTEsMTIgKzE5MSwxMiBAQCBwdWJsaWMgR2l0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJbnZhbGlkUmVtb3RlRXhjZXB0aW9uLAogCQkJdGhyb3cgbmV3IEludmFsaWRSZW1vdGVFeGNlcHRpb24oCiAJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRVUkwsIHVyaSkpOwogCQl9Ci0JCVJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IG51bGw7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIENsb3NlZCBieSBjYWxsZXIKKwkJUmVwb3NpdG9yeSByZXBvc2l0b3J5ID0gaW5pdCgpOwogCQlGZXRjaFJlc3VsdCBmZXRjaFJlc3VsdCA9IG51bGw7CiAJCVRocmVhZCBjbGVhbnVwSG9vayA9IG5ldyBUaHJlYWQoKCkgLT4gY2xlYW51cCgpKTsKIAkJUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKGNsZWFudXBIb29rKTsKIAkJdHJ5IHsKLQkJCXJlcG9zaXRvcnkgPSBpbml0KCk7CiAJCQlmZXRjaFJlc3VsdCA9IGZldGNoKHJlcG9zaXRvcnksIHUpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKIAkJCWlmIChyZXBvc2l0b3J5ICE9IG51bGwpIHsKQEAgLTMwNiw3ICszMDYsNyBAQCBwcml2YXRlIEZldGNoUmVzdWx0IGZldGNoKFJlcG9zaXRvcnkgY2xvbmVkUmVwbywgVVJJaXNoIHUpCiAJCXJldHVybiBjb21tYW5kLmNhbGwoKTsKIAl9CiAKLQlwcml2YXRlIExpc3Q8UmVmU3BlYz4gY2FsY3VsYXRlUmVmU3BlY3MoZmluYWwgU3RyaW5nIGRzdCkgeworCXByaXZhdGUgTGlzdDxSZWZTcGVjPiBjYWxjdWxhdGVSZWZTcGVjcyhTdHJpbmcgZHN0KSB7CiAJCVJlZlNwZWMgd2NycyA9IG5ldyBSZWZTcGVjKCk7CiAJCXdjcnMgPSB3Y3JzLnNldEZvcmNlVXBkYXRlKHRydWUpOwogCQl3Y3JzID0gd2Nycy5zZXRTb3VyY2VEZXN0aW5hdGlvbihDb25zdGFudHMuUl9IRUFEUyArICIqIiwgZHN0KTsgLy8kTk9OLU5MUy0xJApAQCAtMzE1LDcgKzMxNSw3IEBAIHByaXZhdGUgTGlzdDxSZWZTcGVjPiBjYWxjdWxhdGVSZWZTcGVjcyhmaW5hbCBTdHJpbmcgZHN0KSB7CiAJCQlzcGVjcy5hZGQod2Nycyk7CiAJCWVsc2UgaWYgKGJyYW5jaGVzVG9DbG9uZSAhPSBudWxsCiAJCQkJJiYgYnJhbmNoZXNUb0Nsb25lLnNpemUoKSA+IDApIHsKLQkJCWZvciAoZmluYWwgU3RyaW5nIHNlbGVjdGVkUmVmIDogYnJhbmNoZXNUb0Nsb25lKQorCQkJZm9yIChTdHJpbmcgc2VsZWN0ZWRSZWYgOiBicmFuY2hlc1RvQ2xvbmUpCiAJCQkJaWYgKHdjcnMubWF0Y2hTb3VyY2Uoc2VsZWN0ZWRSZWYpKQogCQkJCQlzcGVjcy5hZGQod2Nycy5leHBhbmRGcm9tU291cmNlKHNlbGVjdGVkUmVmKSk7CiAJCX0KQEAgLTM4NiwxMiArMzg2LDkgQEAgcHJpdmF0ZSB2b2lkIGNsb25lU3VibW9kdWxlcyhSZXBvc2l0b3J5IGNsb25lZFJlcG8pIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJaWYgKCF1cGRhdGUuY2FsbCgpLmlzRW1wdHkoKSkgewogCQkJU3VibW9kdWxlV2FsayB3YWxrID0gU3VibW9kdWxlV2Fsay5mb3JJbmRleChjbG9uZWRSZXBvKTsKIAkJCXdoaWxlICh3YWxrLm5leHQoKSkgewotCQkJCVJlcG9zaXRvcnkgc3ViUmVwbyA9IHdhbGsuZ2V0UmVwb3NpdG9yeSgpOwotCQkJCWlmIChzdWJSZXBvICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKKwkJCQl0cnkgKFJlcG9zaXRvcnkgc3ViUmVwbyA9IHdhbGsuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQkJCWlmIChzdWJSZXBvICE9IG51bGwpIHsKIAkJCQkJCWNsb25lU3VibW9kdWxlcyhzdWJSZXBvKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCXN1YlJlcG8uY2xvc2UoKTsKIAkJCQkJfQogCQkJCX0KIAkJCX0KQEAgLTQxMyw3ICs0MTAsNyBAQCBwcml2YXRlIFJlZiBmaW5kQnJhbmNoVG9DaGVja291dChGZXRjaFJlc3VsdCByZXN1bHQpIHsKIAkJfQogCiAJCVJlZiBmb3VuZEJyYW5jaCA9IG51bGw7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZXN1bHQuZ2V0QWR2ZXJ0aXNlZFJlZnMoKSkgeworCQlmb3IgKFJlZiByIDogcmVzdWx0LmdldEFkdmVydGlzZWRSZWZzKCkpIHsKIAkJCWZpbmFsIFN0cmluZyBuID0gci5nZXROYW1lKCk7CiAJCQlpZiAoIW4uc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUykpCiAJCQkJY29udGludWU7CkBAIC00NDMsMTEgKzQ0MCwxMSBAQCBwcml2YXRlIHZvaWQgYWRkTWVyZ2VDb25maWcoUmVwb3NpdG9yeSBjbG9uZWRSZXBvLCBSZWYgaGVhZCkKIAkJY2xvbmVkUmVwby5nZXRDb25maWcoKS5zYXZlKCk7CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXQgcGFyc2VDb21taXQoZmluYWwgUmVwb3NpdG9yeSBjbG9uZWRSZXBvLCBmaW5hbCBSZWYgcmVmKQorCXByaXZhdGUgUmV2Q29tbWl0IHBhcnNlQ29tbWl0KFJlcG9zaXRvcnkgY2xvbmVkUmVwbywgUmVmIHJlZikKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlmaW5hbCBSZXZDb21taXQgY29tbWl0OwotCQl0cnkgKGZpbmFsIFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhjbG9uZWRSZXBvKSkgeworCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhjbG9uZWRSZXBvKSkgewogCQkJY29tbWl0ID0gcncucGFyc2VDb21taXQocmVmLmdldE9iamVjdElkKCkpOwogCQl9CiAJCXJldHVybiBjb21taXQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Db21taXRDb21tYW5kLmphdmEKaW5kZXggZjI1NzI4My4uZDA3NTMyYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ29tbWl0Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NvbW1pdENvbW1hbmQuamF2YQpAQCAtNTQsNyArNTQsNyBAQAogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkFib3J0ZWRCeUhvb2tFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkNvbmN1cnJlbnRSZWZVcGRhdGVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkVtdHB5Q29tbWl0RXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5FbXB0eUNvbW1pdEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFwaS5lcnJvcnMuR2l0QVBJRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5KR2l0SW50ZXJuYWxFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLk5vRmlsZXBhdHRlcm5FeGNlcHRpb247CkBAIC0yMzgsNyArMjM4LDcgQEAgcHVibGljIFJldkNvbW1pdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgTm9IZWFkRXhjZXB0aW9uLAogCQkJCQlSZXZDb21taXQgaGVhZENvbW1pdCA9IHJ3LnBhcnNlQ29tbWl0KGhlYWRJZCk7CiAJCQkJCWhlYWRDb21taXQuZ2V0VHJlZSgpOwogCQkJCQlpZiAoaW5kZXhUcmVlSWQuZXF1YWxzKGhlYWRDb21taXQuZ2V0VHJlZSgpKSkgewotCQkJCQkJdGhyb3cgbmV3IEVtdHB5Q29tbWl0RXhjZXB0aW9uKAorCQkJCQkJdGhyb3cgbmV3IEVtcHR5Q29tbWl0RXhjZXB0aW9uKAogCQkJCQkJCQlKR2l0VGV4dC5nZXQoKS5lbXB0eUNvbW1pdCk7CiAJCQkJCX0KIAkJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DcmVhdGVCcmFuY2hDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9DcmVhdGVCcmFuY2hDb21tYW5kLmphdmEKaW5kZXggMjliYWY0Yy4uYmE2ZjNmMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvQ3JlYXRlQnJhbmNoQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0NyZWF0ZUJyYW5jaENvbW1hbmQuamF2YQpAQCAtNDMsNiArNDMsOSBAQAogICovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuYXBpOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5IRUFEOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuUl9IRUFEUzsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiAKQEAgLTc4LDcgKzgxLDcgQEAgcHVibGljIGNsYXNzIENyZWF0ZUJyYW5jaENvbW1hbmQgZXh0ZW5kcyBHaXRDb21tYW5kPFJlZj4gewogCiAJcHJpdmF0ZSBTZXR1cFVwc3RyZWFtTW9kZSB1cHN0cmVhbU1vZGU7CiAKLQlwcml2YXRlIFN0cmluZyBzdGFydFBvaW50ID0gQ29uc3RhbnRzLkhFQUQ7CisJcHJpdmF0ZSBTdHJpbmcgc3RhcnRQb2ludCA9IEhFQUQ7CiAKIAlwcml2YXRlIFJldkNvbW1pdCBzdGFydENvbW1pdDsKIApAQCAtMTIxLDcgKzEyNCw3IEBAIHB1YmxpYyBSZWYgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIFJlZkFscmVhZHlFeGlzdHNFeGNlcHRpb24sCiAJCXRyeSAoUmV2V2FsayByZXZXYWxrID0gbmV3IFJldldhbGsocmVwbykpIHsKIAkJCVJlZiByZWZUb0NoZWNrID0gcmVwby5maW5kUmVmKG5hbWUpOwogCQkJYm9vbGVhbiBleGlzdHMgPSByZWZUb0NoZWNrICE9IG51bGwKLQkJCQkJJiYgcmVmVG9DaGVjay5nZXROYW1lKCkuc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUyk7CisJCQkJCSYmIHJlZlRvQ2hlY2suZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoUl9IRUFEUyk7CiAJCQlpZiAoIWZvcmNlICYmIGV4aXN0cykKIAkJCQl0aHJvdyBuZXcgUmVmQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJCUpHaXRUZXh0LmdldCgpLnJlZkFscmVhZHlFeGlzdHMxLCBuYW1lKSk7CkBAIC0xNTMsNyArMTU2LDcgQEAgcHVibGljIFJlZiBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgUmVmQWxyZWFkeUV4aXN0c0V4Y2VwdGlvbiwKIAkJCQllbHNlCiAJCQkJCXJlZkxvZ01lc3NhZ2UgPSAiYnJhbmNoOiBDcmVhdGVkIGZyb20gY29tbWl0ICIgKyBiYXNlQ29tbWl0OyAvLyROT04tTkxTLTEkCiAKLQkJCX0gZWxzZSBpZiAoc3RhcnRQb2ludEZ1bGxOYW1lLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpCisJCQl9IGVsc2UgaWYgKHN0YXJ0UG9pbnRGdWxsTmFtZS5zdGFydHNXaXRoKFJfSEVBRFMpCiAJCQkJCXx8IHN0YXJ0UG9pbnRGdWxsTmFtZS5zdGFydHNXaXRoKENvbnN0YW50cy5SX1JFTU9URVMpKSB7CiAJCQkJYmFzZUJyYW5jaCA9IHN0YXJ0UG9pbnRGdWxsTmFtZTsKIAkJCQlpZiAoZXhpc3RzKQpAQCAtMTcxLDcgKzE3NCw3IEBAIHB1YmxpYyBSZWYgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIFJlZkFscmVhZHlFeGlzdHNFeGNlcHRpb24sCiAJCQkJCQkJKyBzdGFydFBvaW50RnVsbE5hbWU7CiAJCQl9CiAKLQkJCVJlZlVwZGF0ZSB1cGRhdGVSZWYgPSByZXBvLnVwZGF0ZVJlZihDb25zdGFudHMuUl9IRUFEUyArIG5hbWUpOworCQkJUmVmVXBkYXRlIHVwZGF0ZVJlZiA9IHJlcG8udXBkYXRlUmVmKFJfSEVBRFMgKyBuYW1lKTsKIAkJCXVwZGF0ZVJlZi5zZXROZXdPYmplY3RJZChzdGFydEF0KTsKIAkJCXVwZGF0ZVJlZi5zZXRSZWZMb2dNZXNzYWdlKHJlZkxvZ01lc3NhZ2UsIGZhbHNlKTsKIAkJCVJlc3VsdCB1cGRhdGVSZXN1bHQ7CkBAIC0yNzksMTcgKzI4MiwzNCBAQCBwcml2YXRlIE9iamVjdElkIGdldFN0YXJ0UG9pbnRPYmplY3RJZCgpIHRocm93cyBBbWJpZ3VvdXNPYmplY3RFeGNlcHRpb24sCiAJfQogCiAJcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhcnRQb2ludE9ySGVhZCgpIHsKLQkJcmV0dXJuIHN0YXJ0UG9pbnQgIT0gbnVsbCA/IHN0YXJ0UG9pbnQgOiBDb25zdGFudHMuSEVBRDsKKwkJcmV0dXJuIHN0YXJ0UG9pbnQgIT0gbnVsbCA/IHN0YXJ0UG9pbnQgOiBIRUFEOwogCX0KIAogCXByaXZhdGUgdm9pZCBwcm9jZXNzT3B0aW9ucygpIHRocm93cyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbiB7CiAJCWlmIChuYW1lID09IG51bGwKLQkJCQl8fCAhUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZShDb25zdGFudHMuUl9IRUFEUyArIG5hbWUpKQorCQkJCXx8ICFSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKFJfSEVBRFMgKyBuYW1lKQorCQkJCXx8ICFpc1ZhbGlkQnJhbmNoTmFtZShuYW1lKSkKIAkJCXRocm93IG5ldyBJbnZhbGlkUmVmTmFtZUV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dAogCQkJCQkuZ2V0KCkuYnJhbmNoTmFtZUludmFsaWQsIG5hbWUgPT0gbnVsbCA/ICI8bnVsbD4iIDogbmFtZSkpOyAvLyROT04tTkxTLTEkCiAJfQogCiAJLyoqCisJICogQ2hlY2sgaWYgdGhlIGdpdmVuIGJyYW5jaCBuYW1lIGlzIHZhbGlkCisJICoKKwkgKiBAcGFyYW0gYnJhbmNoTmFtZQorCSAqICAgICAgICAgICAgYnJhbmNoIG5hbWUgdG8gY2hlY2sKKwkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgYnJhbmNoIG5hbWUgaXMgdmFsaWQKKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZEJyYW5jaE5hbWUoU3RyaW5nIGJyYW5jaE5hbWUpIHsKKwkJaWYgKEhFQUQuZXF1YWxzKGJyYW5jaE5hbWUpKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwkJcmV0dXJuICFicmFuY2hOYW1lLnN0YXJ0c1dpdGgoIi0iKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgogCSAqIFNldCB0aGUgbmFtZSBvZiB0aGUgbmV3IGJyYW5jaAogCSAqCiAJICogQHBhcmFtIG5hbWUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0Rlc2NyaWJlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKaW5kZXggNWJkOTMyZC4uYTQ4NDc0MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvRGVzY3JpYmVDb21tYW5kLmphdmEKQEAgLTEwNyw2ICsxMDcsMTEgQEAgcHVibGljIGNsYXNzIERlc2NyaWJlQ29tbWFuZCBleHRlbmRzIEdpdENvbW1hbmQ8U3RyaW5nPiB7CiAJcHJpdmF0ZSBMaXN0PElNYXRjaGVyPiBtYXRjaGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCiAJLyoqCisJICogV2hldGhlciB0byB1c2UgYWxsIHRhZ3MgKGluY2wuIGxpZ2h0d2VpZ2h0KSBvciBub3QKKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gdXNlVGFncyA9IGZhbHNlOworCisJLyoqCiAJICogQ29uc3RydWN0b3IgZm9yIERlc2NyaWJlQ29tbWFuZC4KIAkgKgogCSAqIEBwYXJhbSByZXBvCkBAIC0xNzYsNiArMTgxLDIyIEBAIHB1YmxpYyBEZXNjcmliZUNvbW1hbmQgc2V0TG9uZyhib29sZWFuIGxvbmdEZXNjKSB7CiAJCXJldHVybiB0aGlzOwogCX0KIAorCS8qKgorCSAqIEluc3RlYWQgb2YgdXNpbmcgb25seSB0aGUgYW5ub3RhdGVkIHRhZ3MsIHVzZSBhbnkgdGFnIGZvdW5kIGluIHJlZnMvdGFncworCSAqIG5hbWVzcGFjZS4gVGhpcyBvcHRpb24gZW5hYmxlcyBtYXRjaGluZyBsaWdodHdlaWdodCAobm9uLWFubm90YXRlZCkgdGFncworCSAqIG9yIG5vdC4KKwkgKgorCSAqIEBwYXJhbSB0YWdzCisJICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBlbmFibGVzIG1hdGNoaW5nIGxpZ2h0d2VpZ2h0IChub24tYW5ub3RhdGVkKQorCSAqICAgICAgICAgICAgdGFncyBsaWtlIHNldHRpbmcgb3B0aW9uIC0tdGFncyBpbiBjIGdpdAorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBEZXNjcmliZUNvbW1hbmQgc2V0VGFncyhib29sZWFuIHRhZ3MpIHsKKwkJdGhpcy51c2VUYWdzID0gdGFnczsKKwkJcmV0dXJuIHRoaXM7CisJfQorCiAJcHJpdmF0ZSBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uKFJlZiB0YWcsIGludCBkZXB0aCwgT2JqZWN0SWQgdGlwKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIFN0cmluZy5mb3JtYXQoCkBAIC0yNDMsMTIgKzI2NCwxNiBAQCBwcml2YXRlIE9wdGlvbmFsPFJlZj4gZ2V0QmVzdE1hdGNoKExpc3Q8UmVmPiB0YWdzKSB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIE9iamVjdElkIGdldE9iamVjdElkRnJvbVJlZihSZWYgcikgewotCQlPYmplY3RJZCBrZXkgPSByZXBvLnBlZWwocikuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKLQkJaWYgKGtleSA9PSBudWxsKSB7Ci0JCQlrZXkgPSByLmdldE9iamVjdElkKCk7CisJcHJpdmF0ZSBPYmplY3RJZCBnZXRPYmplY3RJZEZyb21SZWYoUmVmIHIpIHRocm93cyBKR2l0SW50ZXJuYWxFeGNlcHRpb24geworCQl0cnkgeworCQkJT2JqZWN0SWQga2V5ID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocikuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKKwkJCWlmIChrZXkgPT0gbnVsbCkgeworCQkJCWtleSA9IHIuZ2V0T2JqZWN0SWQoKTsKKwkJCX0KKwkJCXJldHVybiBrZXk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCXRocm93IG5ldyBKR2l0SW50ZXJuYWxFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwogCQl9Ci0JCXJldHVybiBrZXk7CiAJfQogCiAJLyoqCkBAIC0yNjEsMTIgKzI4NiwxNCBAQCBwcml2YXRlIE9iamVjdElkIGdldE9iamVjdElkRnJvbVJlZihSZWYgcikgewogCXB1YmxpYyBTdHJpbmcgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewogCQl0cnkgewogCQkJY2hlY2tDYWxsYWJsZSgpOwotCi0JCQlpZiAodGFyZ2V0ID09IG51bGwpCisJCQlpZiAodGFyZ2V0ID09IG51bGwpIHsKIAkJCQlzZXRUYXJnZXQoQ29uc3RhbnRzLkhFQUQpOworCQkJfQogCi0JCQlDb2xsZWN0aW9uPFJlZj4gdGFnTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKFJfVEFHUykudmFsdWVzKCk7CisJCQlDb2xsZWN0aW9uPFJlZj4gdGFnTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKQorCQkJCQkuZ2V0UmVmc0J5UHJlZml4KFJfVEFHUyk7CiAJCQlNYXA8T2JqZWN0SWQsIExpc3Q8UmVmPj4gdGFncyA9IHRhZ0xpc3Quc3RyZWFtKCkKKwkJCQkJLmZpbHRlcih0aGlzOjpmaWx0ZXJMaWdodHdlaWdodFRhZ3MpCiAJCQkJCS5jb2xsZWN0KENvbGxlY3RvcnMuZ3JvdXBpbmdCeSh0aGlzOjpnZXRPYmplY3RJZEZyb21SZWYpKTsKIAogCQkJLy8gY29tYmluZWQgZmxhZ3Mgb2YgYWxsIHRoZSBjYW5kaWRhdGUgaW5zdGFuY2VzCkBAIC0zOTAsNCArNDE3LDIyIEBAIHB1YmxpYyBpbnQgY29tcGFyZShDYW5kaWRhdGUgbzEsIENhbmRpZGF0ZSBvMikgewogCQkJdy5jbG9zZSgpOwogCQl9CiAJfQorCisJLyoqCisJICogV2hldGhlciB3ZSB1c2UgbGlnaHR3ZWlnaHQgdGFncyBvciBub3QgZm9yIGRlc2NyaWJlIENhbmRpZGF0ZXMKKwkgKgorCSAqIEBwYXJhbSByZWYKKwkgKiAgICAgICAgICAgIHJlZmVyZW5jZSB1bmRlciBpbnNwZWN0aW9uCisJICogQHJldHVybiB0cnVlIGlmIGl0IHNob3VsZCBiZSB1c2VkIGZvciBkZXNjcmliZSBvciBub3QgcmVnYXJkaW5nCisJICogICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5hcGkuRGVzY3JpYmVDb21tYW5kI3VzZVRhZ3N9CisJICovCisJQFN1cHByZXNzV2FybmluZ3MoIm51bGwiKQorCXByaXZhdGUgYm9vbGVhbiBmaWx0ZXJMaWdodHdlaWdodFRhZ3MoUmVmIHJlZikgeworCQlPYmplY3RJZCBpZCA9IHJlZi5nZXRPYmplY3RJZCgpOworCQl0cnkgeworCQkJcmV0dXJuIHRoaXMudXNlVGFncyB8fCAoaWQgIT0gbnVsbCAmJiAody5wYXJzZVRhZyhpZCkgIT0gbnVsbCkpOworCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisJCQlyZXR1cm4gZmFsc2U7CisJCX0KKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9GZXRjaENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZC5qYXZhCmluZGV4IDVkMTc4YmMuLjczZTkzYTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0ZldGNoQ29tbWFuZC5qYXZhCkBAIC0xMDUsNiArMTA1LDggQEAgcHVibGljIGNsYXNzIEZldGNoQ29tbWFuZCBleHRlbmRzIFRyYW5zcG9ydENvbW1hbmQ8RmV0Y2hDb21tYW5kLCBGZXRjaFJlc3VsdD4gewogCiAJcHJpdmF0ZSBDYWxsYmFjayBjYWxsYmFjazsKIAorCXByaXZhdGUgYm9vbGVhbiBpc0ZvcmNlVXBkYXRlOworCiAJLyoqCiAJICogQ2FsbGJhY2sgZm9yIHN0YXR1cyBvZiBmZXRjaCBvcGVyYXRpb24uCiAJICoKQEAgLTE5OCw3ICsyMDAsOCBAQCBwcml2YXRlIHZvaWQgZmV0Y2hTdWJtb2R1bGVzKEZldGNoUmVzdWx0IHJlc3VsdHMpCiAJCQkJCQkJCS5zZXRUYWdPcHQodGFnT3B0aW9uKQogCQkJCQkJCQkuc2V0Q2hlY2tGZXRjaGVkT2JqZWN0cyhjaGVja0ZldGNoZWRPYmplY3RzKQogCQkJCQkJCQkuc2V0UmVtb3ZlRGVsZXRlZFJlZnMoaXNSZW1vdmVEZWxldGVkUmVmcygpKQotCQkJCQkJCQkuc2V0VGhpbih0aGluKS5zZXRSZWZTcGVjcyhyZWZTcGVjcykKKwkJCQkJCQkJLnNldFRoaW4odGhpbikKKwkJCQkJCQkJLnNldFJlZlNwZWNzKGFwcGx5T3B0aW9ucyhyZWZTcGVjcykpCiAJCQkJCQkJCS5zZXREcnlSdW4oZHJ5UnVuKQogCQkJCQkJCQkuc2V0UmVjdXJzZVN1Ym1vZHVsZXMocmVjdXJzZU1vZGUpOwogCQkJCQkJY29uZmlndXJlKGYpOwpAQCAtMjM3LDggKzI0MCw4IEBAIHB1YmxpYyBGZXRjaFJlc3VsdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgSW52YWxpZFJlbW90ZUV4Y2VwdGlvbiwKIAkJCQl0cmFuc3BvcnQuc2V0VGFnT3B0KHRhZ09wdGlvbik7CiAJCQl0cmFuc3BvcnQuc2V0RmV0Y2hUaGluKHRoaW4pOwogCQkJY29uZmlndXJlKHRyYW5zcG9ydCk7Ci0KLQkJCUZldGNoUmVzdWx0IHJlc3VsdCA9IHRyYW5zcG9ydC5mZXRjaChtb25pdG9yLCByZWZTcGVjcyk7CisJCQlGZXRjaFJlc3VsdCByZXN1bHQgPSB0cmFuc3BvcnQuZmV0Y2gobW9uaXRvciwKKwkJCQkJYXBwbHlPcHRpb25zKHJlZlNwZWNzKSk7CiAJCQlpZiAoIXJlcG8uaXNCYXJlKCkpIHsKIAkJCQlmZXRjaFN1Ym1vZHVsZXMocmVzdWx0KTsKIAkJCX0KQEAgLTI2MSw2ICsyNjQsMTcgQEAgcHVibGljIEZldGNoUmVzdWx0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLCBJbnZhbGlkUmVtb3RlRXhjZXB0aW9uLAogCiAJfQogCisJcHJpdmF0ZSBMaXN0PFJlZlNwZWM+IGFwcGx5T3B0aW9ucyhMaXN0PFJlZlNwZWM+IHJlZlNwZWNzMikgeworCQlpZiAoIWlzRm9yY2VVcGRhdGUoKSkgeworCQkJcmV0dXJuIHJlZlNwZWNzMjsKKwkJfQorCQlMaXN0PFJlZlNwZWM+IHVwZGF0ZWQgPSBuZXcgQXJyYXlMaXN0PD4oMyk7CisJCWZvciAoUmVmU3BlYyByZWZTcGVjIDogcmVmU3BlY3MyKSB7CisJCQl1cGRhdGVkLmFkZChyZWZTcGVjLnNldEZvcmNlVXBkYXRlKHRydWUpKTsKKwkJfQorCQlyZXR1cm4gdXBkYXRlZDsKKwl9CisKIAkvKioKIAkgKiBTZXQgdGhlIG1vZGUgdG8gYmUgdXNlZCBmb3IgcmVjdXJzaW5nIGludG8gc3VibW9kdWxlcy4KIAkgKgpAQCAtNTE3LDQgKzUzMSwyNyBAQCBwdWJsaWMgRmV0Y2hDb21tYW5kIHNldENhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7CiAJCXRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKIAkJcmV0dXJuIHRoaXM7CiAJfQorCisJLyoqCisJICogV2hldGhlciBmZXRjaCAtLWZvcmNlIG9wdGlvbiBpcyBlbmFibGVkCisJICoKKwkgKiBAcmV0dXJuIHdoZXRoZXIgcmVmcyBhZmZlY3RlZCBieSB0aGUgZmV0Y2ggYXJlIHVwZGF0ZWQgZm9yY2VmdWxseQorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgYm9vbGVhbiBpc0ZvcmNlVXBkYXRlKCkgeworCQlyZXR1cm4gdGhpcy5pc0ZvcmNlVXBkYXRlOworCX0KKworCS8qKgorCSAqIFNldCBmZXRjaCAtLWZvcmNlIG9wdGlvbgorCSAqCisJICogQHBhcmFtIGZvcmNlCisJICogICAgICAgICAgICB3aGV0aGVyIHRvIHVwZGF0ZSByZWZzIGFmZmVjdGVkIGJ5IHRoZSBmZXRjaCBmb3JjZWZ1bGx5CisJICogQHJldHVybiB0aGlzIGNvbW1hbmQKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIEZldGNoQ29tbWFuZCBzZXRGb3JjZVVwZGF0ZShib29sZWFuIGZvcmNlKSB7CisJCXRoaXMuaXNGb3JjZVVwZGF0ZSA9IGZvcmNlOworCQlyZXR1cm4gdGhpczsKKwl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0QnJhbmNoQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTGlzdEJyYW5jaENvbW1hbmQuamF2YQppbmRleCBjZGFlNzgyLi4yOGEyN2E5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0QnJhbmNoQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xpc3RCcmFuY2hDb21tYW5kLmphdmEKQEAgLTE4Nyw2ICsxODcsNiBAQCBwdWJsaWMgTGlzdEJyYW5jaENvbW1hbmQgc2V0Q29udGFpbnMoU3RyaW5nIGNvbnRhaW5zQ29tbWl0aXNoKSB7CiAJfQogCiAJcHJpdmF0ZSBDb2xsZWN0aW9uPFJlZj4gZ2V0UmVmcyhTdHJpbmcgcHJlZml4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMocHJlZml4KS52YWx1ZXMoKTsKKwkJcmV0dXJuIHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzQnlQcmVmaXgocHJlZml4KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0VGFnQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTGlzdFRhZ0NvbW1hbmQuamF2YQppbmRleCA5MTYxMjExLi4wMWMxOTkxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9MaXN0VGFnQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xpc3RUYWdDb21tYW5kLmphdmEKQEAgLTQ3LDcgKzQ3LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKQEAgLTc4LDExICs3NywxMSBAQCBwcm90ZWN0ZWQgTGlzdFRhZ0NvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJQE92ZXJyaWRlCiAJcHVibGljIExpc3Q8UmVmPiBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiB7CiAJCWNoZWNrQ2FsbGFibGUoKTsKLQkJTWFwPFN0cmluZywgUmVmPiByZWZMaXN0OwogCQlMaXN0PFJlZj4gdGFncyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQl0cnkgKFJldldhbGsgcmV2V2FsayA9IG5ldyBSZXZXYWxrKHJlcG8pKSB7Ci0JCQlyZWZMaXN0ID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQ29uc3RhbnRzLlJfVEFHUyk7Ci0JCQlmb3IgKFJlZiByZWYgOiByZWZMaXN0LnZhbHVlcygpKSB7CisJCQlMaXN0PFJlZj4gcmVmTGlzdCA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKQorCQkJCQkuZ2V0UmVmc0J5UHJlZml4KENvbnN0YW50cy5SX1RBR1MpOworCQkJZm9yIChSZWYgcmVmIDogcmVmTGlzdCkgewogCQkJCXRhZ3MuYWRkKHJlZik7CiAJCQl9CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL0xvZ0NvbW1hbmQuamF2YQppbmRleCBmZDZjMWZhLi5jZjNkMzVmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9Mb2dDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTG9nQ29tbWFuZC5qYXZhCkBAIC00MiwxMyArNDIsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmFwaTsKIAotaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZEYXRhYmFzZS5BTEw7Ci0KIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudGV4dC5NZXNzYWdlRm9ybWF0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuYXBpLmVycm9ycy5HaXRBUElFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hcGkuZXJyb3JzLkpHaXRJbnRlcm5hbEV4Y2VwdGlvbjsKQEAgLTI3NSwxMCArMjcyLDkgQEAgcHVibGljIExvZ0NvbW1hbmQgYWRkUmFuZ2UoQW55T2JqZWN0SWQgc2luY2UsIEFueU9iamVjdElkIHVudGlsKQogCSAqICAgICAgICAgICAgIHRoZSByZWZlcmVuY2VzIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZAogCSAqLwogCXB1YmxpYyBMb2dDb21tYW5kIGFsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCU1hcDxTdHJpbmcsIFJlZj4gcmVmcyA9IGdldFJlcG9zaXRvcnkoKS5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQUxMKTsKLQkJZm9yIChSZWYgcmVmIDogcmVmcy52YWx1ZXMoKSkgeworCQlmb3IgKFJlZiByZWYgOiBnZXRSZXBvc2l0b3J5KCkuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCkpIHsKIAkJCWlmKCFyZWYuaXNQZWVsZWQoKSkKLQkJCQlyZWYgPSBnZXRSZXBvc2l0b3J5KCkucGVlbChyZWYpOworCQkJCXJlZiA9IGdldFJlcG9zaXRvcnkoKS5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKTsKIAogCQkJT2JqZWN0SWQgb2JqZWN0SWQgPSByZWYuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKIAkJCWlmIChvYmplY3RJZCA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTWVyZ2VDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmQuamF2YQppbmRleCBjZDUwY2FlLi5iOGZhNzRkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9NZXJnZUNvbW1hbmQuamF2YQpAQCAtMTEyLDYgKzExMiw4IEBAIHB1YmxpYyBjbGFzcyBNZXJnZUNvbW1hbmQgZXh0ZW5kcyBHaXRDb21tYW5kPE1lcmdlUmVzdWx0PiB7CiAKIAlwcml2YXRlIFN0cmluZyBtZXNzYWdlOwogCisJcHJpdmF0ZSBib29sZWFuIGluc2VydENoYW5nZUlkOworCiAJcHJpdmF0ZSBQcm9ncmVzc01vbml0b3IgbW9uaXRvciA9IE51bGxQcm9ncmVzc01vbml0b3IuSU5TVEFOQ0U7CiAKIAkvKioKQEAgLTI1Myw3ICsyNTUsNyBAQCBwdWJsaWMgTWVyZ2VSZXN1bHQgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sIE5vSGVhZEV4Y2VwdGlvbiwKIAkJCXJlZkxvZ01lc3NhZ2UuYXBwZW5kKHJlZi5nZXROYW1lKCkpOwogCiAJCQkvLyBoYW5kbGUgYW5ub3RhdGVkIHRhZ3MKLQkJCXJlZiA9IHJlcG8ucGVlbChyZWYpOworCQkJcmVmID0gcmVwby5nZXRSZWZEYXRhYmFzZSgpLnBlZWwocmVmKTsKIAkJCU9iamVjdElkIG9iamVjdElkID0gcmVmLmdldFBlZWxlZE9iamVjdElkKCk7CiAJCQlpZiAob2JqZWN0SWQgPT0gbnVsbCkKIAkJCQlvYmplY3RJZCA9IHJlZi5nZXRPYmplY3RJZCgpOwpAQCAtMzkyLDYgKzM5NCw3IEBAIHB1YmxpYyBNZXJnZVJlc3VsdCBjYWxsKCkgdGhyb3dzIEdpdEFQSUV4Y2VwdGlvbiwgTm9IZWFkRXhjZXB0aW9uLAogCQkJCQkJdHJ5IChHaXQgZ2l0ID0gbmV3IEdpdChnZXRSZXBvc2l0b3J5KCkpKSB7CiAJCQkJCQkJbmV3SGVhZElkID0gZ2l0LmNvbW1pdCgpCiAJCQkJCQkJCQkuc2V0UmVmbG9nQ29tbWVudChyZWZMb2dNZXNzYWdlLnRvU3RyaW5nKCkpCisJCQkJCQkJCQkuc2V0SW5zZXJ0Q2hhbmdlSWQoaW5zZXJ0Q2hhbmdlSWQpCiAJCQkJCQkJCQkuY2FsbCgpLmdldElkKCk7CiAJCQkJCQl9CiAJCQkJCQltZXJnZVN0YXR1cyA9IE1lcmdlU3RhdHVzLk1FUkdFRDsKQEAgLTYxOSw2ICs2MjIsMjMgQEAgcHVibGljIE1lcmdlQ29tbWFuZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CiAJfQogCiAJLyoqCisJICogSWYgc2V0IHRvIHRydWUgYSBjaGFuZ2UgaWQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBjb21taXQgbWVzc2FnZQorCSAqCisJICogQW4gZXhpc3RpbmcgY2hhbmdlIGlkIGlzIG5vdCByZXBsYWNlZC4gQW4gaW5pdGlhbCBjaGFuZ2UgaWQgKEkwMDAuLi4pCisJICogd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgY2hhbmdlIGlkLgorCSAqCisJICogQHBhcmFtIGluc2VydENoYW5nZUlkCisJICogICAgICAgICAgICB3aGV0aGVyIHRvIGluc2VydCBhIGNoYW5nZSBpZAorCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBNZXJnZUNvbW1hbmQgc2V0SW5zZXJ0Q2hhbmdlSWQoYm9vbGVhbiBpbnNlcnRDaGFuZ2VJZCkgeworCQljaGVja0NhbGxhYmxlKCk7CisJCXRoaXMuaW5zZXJ0Q2hhbmdlSWQgPSBpbnNlcnRDaGFuZ2VJZDsKKwkJcmV0dXJuIHRoaXM7CisJfQorCisJLyoqCiAJICogVGhlIHByb2dyZXNzIG1vbml0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaWZmIG9wZXJhdGlvbi4gQnkgZGVmYXVsdCwgdGhpcwogCSAqIGlzIHNldCB0byA8Y29kZT5OdWxsUHJvZ3Jlc3NNb25pdG9yPC9jb2RlPgogCSAqCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9OYW1lUmV2Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvTmFtZVJldkNvbW1hbmQuamF2YQppbmRleCBhOWQ5NzU5Li5hMmIyMDA3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9OYW1lUmV2Q29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL05hbWVSZXZDb21tYW5kLmphdmEKQEAgLTI1MSw4ICsyNTEsNyBAQCBwdWJsaWMgTmFtZVJldkNvbW1hbmQgYWRkKEl0ZXJhYmxlPE9iamVjdElkPiBpZHMpCiAJICogcHJlZml4IGFkZGVkIGJ5IHtAbGluayAjYWRkUHJlZml4KFN0cmluZyl9LgogCSAqCiAJICogQHBhcmFtIHByZWZpeAotCSAqICAgICAgICAgICAgcHJlZml4IHRvIGFkZDsgc2VlCi0JICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UjZ2V0UmVmcyhTdHJpbmcpfQorCSAqICAgICAgICAgICAgcHJlZml4IHRvIGFkZDsgdGhlIHByZWZpeCBtdXN0IGVuZCB3aXRoIGEgc2xhc2gKIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwogCXB1YmxpYyBOYW1lUmV2Q29tbWFuZCBhZGRQcmVmaXgoU3RyaW5nIHByZWZpeCkgewpAQCAtMjc5LDcgKzI3OCw4IEBAIHB1YmxpYyBOYW1lUmV2Q29tbWFuZCBhZGRBbm5vdGF0ZWRUYWdzKCkgewogCQlpZiAocmVmcyA9PSBudWxsKQogCQkJcmVmcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCQl0cnkgewotCQkJZm9yIChSZWYgcmVmIDogcmVwby5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQ29uc3RhbnRzLlJfVEFHUykudmFsdWVzKCkpIHsKKwkJCWZvciAoUmVmIHJlZiA6IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKQorCQkJCQkuZ2V0UmVmc0J5UHJlZml4KENvbnN0YW50cy5SX1RBR1MpKSB7CiAJCQkJT2JqZWN0SWQgaWQgPSByZWYuZ2V0T2JqZWN0SWQoKTsKIAkJCQlpZiAoaWQgIT0gbnVsbCAmJiAod2Fsay5wYXJzZUFueShpZCkgaW5zdGFuY2VvZiBSZXZUYWcpKQogCQkJCQlhZGRSZWYocmVmKTsKQEAgLTMyNSw3ICszMjUsNyBAQCBwcml2YXRlIHZvaWQgYWRkUHJlZml4ZXMoTWFwPE9iamVjdElkLCBTdHJpbmc+IG5vbkNvbW1pdHMsCiAKIAlwcml2YXRlIHZvaWQgYWRkUHJlZml4KFN0cmluZyBwcmVmaXgsIE1hcDxPYmplY3RJZCwgU3RyaW5nPiBub25Db21taXRzLAogCQkJRklGT1JldlF1ZXVlIHBlbmRpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoUmVmIHJlZiA6IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKHByZWZpeCkudmFsdWVzKCkpCisJCWZvciAoUmVmIHJlZiA6IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzQnlQcmVmaXgocHJlZml4KSkKIAkJCWFkZFJlZihyZWYsIG5vbkNvbW1pdHMsIHBlbmRpbmcpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1B1c2hDb21tYW5kLmphdmEKaW5kZXggMTliZGQzNS4uNDU5NDUxZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUHVzaENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9QdXNoQ29tbWFuZC5qYXZhCkBAIC0xNTMsNyArMTUzLDggQEAgcHVibGljIEl0ZXJhYmxlPFB1c2hSZXN1bHQ+IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uLAogCiAJCQlmaW5hbCBMaXN0PFRyYW5zcG9ydD4gdHJhbnNwb3J0czsKIAkJCXRyYW5zcG9ydHMgPSBUcmFuc3BvcnQub3BlbkFsbChyZXBvLCByZW1vdGUsIFRyYW5zcG9ydC5PcGVyYXRpb24uUFVTSCk7Ci0JCQlmb3IgKGZpbmFsIFRyYW5zcG9ydCB0cmFuc3BvcnQgOiB0cmFuc3BvcnRzKSB7CisJCQlmb3IgKEBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEV4cGxpY2l0bHkgY2xvc2VkIGluIGZpbmFsbHkKKwkJCQkJZmluYWwgVHJhbnNwb3J0IHRyYW5zcG9ydCA6IHRyYW5zcG9ydHMpIHsKIAkJCQl0cmFuc3BvcnQuc2V0UHVzaFRoaW4odGhpbik7CiAJCQkJdHJhbnNwb3J0LnNldFB1c2hBdG9taWMoYXRvbWljKTsKIAkJCQlpZiAocmVjZWl2ZVBhY2sgIT0gbnVsbCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlYmFzZUNvbW1hbmQuamF2YQppbmRleCBkYTFmZjA2Li45OGMxNmI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZWJhc2VDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmViYXNlQ29tbWFuZC5qYXZhCkBAIC0xNzM0LDIzICsxNzM0LDE3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgY3JlYXRlRmlsZShGaWxlIHBhcmVudERpciwgU3RyaW5nIG5hbWUsCiAJCQkJU3RyaW5nIGNvbnRlbnQpCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCUZpbGUgZmlsZSA9IG5ldyBGaWxlKHBhcmVudERpciwgbmFtZSk7Ci0JCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQkJdHJ5IHsKKwkJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSkgewogCQkJCWZvcy53cml0ZShjb250ZW50LmdldEJ5dGVzKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKIAkJCQlmb3Mud3JpdGUoJ1xuJyk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZvcy5jbG9zZSgpOwogCQkJfQogCQl9CiAKIAkJcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRUb0ZpbGUoRmlsZSBmaWxlLCBTdHJpbmcgY29udGVudCkKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlLCB0cnVlKTsKLQkJCXRyeSB7CisJCQl0cnkgKEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZSwgdHJ1ZSkpIHsKIAkJCQlmb3Mud3JpdGUoY29udGVudC5nZXRCeXRlcyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJCQkJZm9zLndyaXRlKCdcbicpOwotCQkJfSBmaW5hbGx5IHsKLQkJCQlmb3MuY2xvc2UoKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlbW90ZUFkZENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JlbW90ZUFkZENvbW1hbmQuamF2YQppbmRleCBjNDNjNWM2Li5hOGZkY2QyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZW1vdGVBZGRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVtb3RlQWRkQ29tbWFuZC5qYXZhCkBAIC04Niw5ICs4NiwxMiBAQCBwcm90ZWN0ZWQgUmVtb3RlQWRkQ29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkgKgogCSAqIEBwYXJhbSBuYW1lCiAJICogICAgICAgICAgICBhIHJlbW90ZSBuYW1lCisJICogQHJldHVybiB0aGlzIGluc3RhbmNlCisJICogQHNpbmNlIDUuMAogCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgUmVtb3RlQWRkQ29tbWFuZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CiAJCXRoaXMubmFtZSA9IG5hbWU7CisJCXJldHVybiB0aGlzOwogCX0KIAogCS8qKgpAQCAtOTYsOSArOTksMTIgQEAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewogCSAqCiAJICogQHBhcmFtIHVyaQogCSAqICAgICAgICAgICAgYW4gVVJMIGZvciB0aGUgcmVtb3RlCisJICogQHJldHVybiB0aGlzIGluc3RhbmNlCisJICogQHNpbmNlIDUuMAogCSAqLwotCXB1YmxpYyB2b2lkIHNldFVyaShVUklpc2ggdXJpKSB7CisJcHVibGljIFJlbW90ZUFkZENvbW1hbmQgc2V0VXJpKFVSSWlzaCB1cmkpIHsKIAkJdGhpcy51cmkgPSB1cmk7CisJCXJldHVybiB0aGlzOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUmVzZXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmQuamF2YQppbmRleCBiZTQ0NmY5Li4xM2NlNGU3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9SZXNldENvbW1hbmQuamF2YQpAQCAtMjQ1LDcgKzI0NSw3IEBAIGVsc2UgaWYgKHJlcG8ucmVhZFNxdWFzaENvbW1pdE1zZygpICE9IG51bGwpCiAJCX0KIAl9CiAKLQlwcml2YXRlIFJldkNvbW1pdCBwYXJzZUNvbW1pdChmaW5hbCBPYmplY3RJZCBjb21taXRJZCkgeworCXByaXZhdGUgUmV2Q29tbWl0IHBhcnNlQ29tbWl0KE9iamVjdElkIGNvbW1pdElkKSB7CiAJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHJlcG8pKSB7CiAJCQlyZXR1cm4gcncucGFyc2VDb21taXQoY29tbWl0SWQpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CkBAIC0zNjAsNyArMzYwLDcgQEAgcHVibGljIFJlc2V0Q29tbWFuZCBzZXRQcm9ncmVzc01vbml0b3IoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKIAogCXByaXZhdGUgdm9pZCByZXNldEluZGV4Rm9yUGF0aHMoT2JqZWN0SWQgY29tbWl0VHJlZSkgewogCQlEaXJDYWNoZSBkYyA9IG51bGw7Ci0JCXRyeSAoZmluYWwgVHJlZVdhbGsgdHcgPSBuZXcgVHJlZVdhbGsocmVwbykpIHsKKwkJdHJ5IChUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhyZXBvKSkgewogCQkJZGMgPSByZXBvLmxvY2tEaXJDYWNoZSgpOwogCQkJRGlyQ2FjaGVCdWlsZGVyIGJ1aWxkZXIgPSBkYy5idWlsZGVyKCk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1JtQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUm1Db21tYW5kLmphdmEKaW5kZXggMDg4YWExNS4uZDJmNGJlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUm1Db21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvUm1Db21tYW5kLmphdmEKQEAgLTE1NCw3ICsxNTQsNyBAQCBwdWJsaWMgRGlyQ2FjaGUgY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24sCiAJCURpckNhY2hlIGRjID0gbnVsbDsKIAogCQlMaXN0PFN0cmluZz4gYWN0dWFsbHlEZWxldGVkRmlsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQkJdHJ5IChmaW5hbCBUcmVlV2FsayB0dyA9IG5ldyBUcmVlV2FsayhyZXBvKSkgeworCQl0cnkgKFRyZWVXYWxrIHR3ID0gbmV3IFRyZWVXYWxrKHJlcG8pKSB7CiAJCQlkYyA9IHJlcG8ubG9ja0RpckNhY2hlKCk7CiAJCQlEaXJDYWNoZUJ1aWxkZXIgYnVpbGRlciA9IGRjLmJ1aWxkZXIoKTsKIAkJCXR3LnJlc2V0KCk7IC8vIGRyb3AgdGhlIGZpcnN0IGVtcHR5IHRyZWUsIHdoaWNoIHdlIGRvIG5vdCBuZWVkIGhlcmUKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQXBwbHlDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaEFwcGx5Q29tbWFuZC5qYXZhCmluZGV4IDVmNzkyOGQuLjAxZDA3MGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQXBwbHlDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hBcHBseUNvbW1hbmQuamF2YQpAQCAtMTExLDcgKzExMSw3IEBAIHB1YmxpYyBjbGFzcyBTdGFzaEFwcGx5Q29tbWFuZCBleHRlbmRzIEdpdENvbW1hbmQ8T2JqZWN0SWQ+IHsKIAkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gdG8gYXBwbHkgdGhlIHN0YXNoCiAJICogICAgICAgICAgICB0bwogCSAqLwotCXB1YmxpYyBTdGFzaEFwcGx5Q29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgU3Rhc2hBcHBseUNvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCX0KIApAQCAtMTI1LDcgKzEyNSw3IEBAIHB1YmxpYyBTdGFzaEFwcGx5Q29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKIAkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHN0YXNoIHtAY29kZSBSZWZ9IHRvIGFwcGx5CiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwdWJsaWMgU3Rhc2hBcHBseUNvbW1hbmQgc2V0U3Rhc2hSZWYoZmluYWwgU3RyaW5nIHN0YXNoUmVmKSB7CisJcHVibGljIFN0YXNoQXBwbHlDb21tYW5kIHNldFN0YXNoUmVmKFN0cmluZyBzdGFzaFJlZikgewogCQl0aGlzLnN0YXNoUmVmID0gc3Rhc2hSZWY7CiAJCXJldHVybiB0aGlzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoQ3JlYXRlQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKaW5kZXggMzQ5NWZmOC4uYzMyODkwZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hDcmVhdGVDb21tYW5kLmphdmEKQEAgLTE5NSw3ICsxOTUsNyBAQCBwdWJsaWMgU3Rhc2hDcmVhdGVDb21tYW5kIHNldEluY2x1ZGVVbnRyYWNrZWQoYm9vbGVhbiBpbmNsdWRlVW50cmFja2VkKSB7CiAKIAlwcml2YXRlIFJldkNvbW1pdCBwYXJzZUNvbW1pdChmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyLAogCQkJZmluYWwgT2JqZWN0SWQgaGVhZElkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKHJlYWRlcikpIHsKKwkJdHJ5IChSZXZXYWxrIHdhbGsgPSBuZXcgUmV2V2FsayhyZWFkZXIpKSB7CiAJCQlyZXR1cm4gd2Fsay5wYXJzZUNvbW1pdChoZWFkSWQpOwogCQl9CiAJfQpAQCAtMzAzLDEyICszMDMsOSBAQCBwdWJsaWMgUmV2Q29tbWl0IGNhbGwoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKIAkJCQkJCWVudHJ5LnNldExhc3RNb2RpZmllZCh3dEl0ZXIuZ2V0RW50cnlMYXN0TW9kaWZpZWQoKSk7CiAJCQkJCQllbnRyeS5zZXRGaWxlTW9kZSh3dEl0ZXIuZ2V0RW50cnlGaWxlTW9kZSgpKTsKIAkJCQkJCWxvbmcgY29udGVudExlbmd0aCA9IHd0SXRlci5nZXRFbnRyeUNvbnRlbnRMZW5ndGgoKTsKLQkJCQkJCUlucHV0U3RyZWFtIGluID0gd3RJdGVyLm9wZW5FbnRyeVN0cmVhbSgpOwotCQkJCQkJdHJ5IHsKKwkJCQkJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSB3dEl0ZXIub3BlbkVudHJ5U3RyZWFtKCkpIHsKIAkJCQkJCQllbnRyeS5zZXRPYmplY3RJZChpbnNlcnRlci5pbnNlcnQoCiAJCQkJCQkJCQlDb25zdGFudHMuT0JKX0JMT0IsIGNvbnRlbnRMZW5ndGgsIGluKSk7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCWluLmNsb3NlKCk7CiAJCQkJCQl9CiAKIAkJCQkJCWlmIChpbmRleEl0ZXIgPT0gbnVsbCAmJiBoZWFkSXRlciA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hEcm9wQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hEcm9wQ29tbWFuZC5qYXZhCmluZGV4IGNkOGY4ZTYuLjdmMDJhYWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoRHJvcENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaERyb3BDb21tYW5kLmphdmEKQEAgLTEwNyw3ICsxMDcsNyBAQCBwdWJsaWMgU3Rhc2hEcm9wQ29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkgKiAgICAgICAgICAgIHRoZSAwLWJhc2VkIGluZGV4IG9mIHRoZSBzdGFzaCByZWZlcmVuY2UKIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXB1YmxpYyBTdGFzaERyb3BDb21tYW5kIHNldFN0YXNoUmVmKGZpbmFsIGludCBzdGFzaFJlZikgeworCXB1YmxpYyBTdGFzaERyb3BDb21tYW5kIHNldFN0YXNoUmVmKGludCBzdGFzaFJlZikgewogCQlpZiAoc3Rhc2hSZWYgPCAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwogCkBAIC0xMjQsNyArMTI0LDcgQEAgcHVibGljIFN0YXNoRHJvcENvbW1hbmQgc2V0U3Rhc2hSZWYoZmluYWwgaW50IHN0YXNoUmVmKSB7CiAJICogICAgICAgICAgICB7QGxpbmsgI3NldFN0YXNoUmVmKGludCl9CiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwdWJsaWMgU3Rhc2hEcm9wQ29tbWFuZCBzZXRBbGwoZmluYWwgYm9vbGVhbiBhbGwpIHsKKwlwdWJsaWMgU3Rhc2hEcm9wQ29tbWFuZCBzZXRBbGwoYm9vbGVhbiBhbGwpIHsKIAkJdGhpcy5hbGwgPSBhbGw7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTEzOCw3ICsxMzgsNyBAQCBwcml2YXRlIFJlZiBnZXRSZWYoKSB0aHJvd3MgR2l0QVBJRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgUmVmVXBkYXRlIGNyZWF0ZVJlZlVwZGF0ZShmaW5hbCBSZWYgc3Rhc2hSZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBSZWZVcGRhdGUgY3JlYXRlUmVmVXBkYXRlKFJlZiBzdGFzaFJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJUmVmVXBkYXRlIHVwZGF0ZSA9IHJlcG8udXBkYXRlUmVmKFJfU1RBU0gpOwogCQl1cGRhdGUuZGlzYWJsZVJlZkxvZygpOwogCQl1cGRhdGUuc2V0RXhwZWN0ZWRPbGRPYmplY3RJZChzdGFzaFJlZi5nZXRPYmplY3RJZCgpKTsKQEAgLTE0Niw3ICsxNDYsNyBAQCBwcml2YXRlIFJlZlVwZGF0ZSBjcmVhdGVSZWZVcGRhdGUoZmluYWwgUmVmIHN0YXNoUmVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gdXBkYXRlOwogCX0KIAotCXByaXZhdGUgdm9pZCBkZWxldGVSZWYoZmluYWwgUmVmIHN0YXNoUmVmKSB7CisJcHJpdmF0ZSB2b2lkIGRlbGV0ZVJlZihSZWYgc3Rhc2hSZWYpIHsKIAkJdHJ5IHsKIAkJCVJlc3VsdCByZXN1bHQgPSBjcmVhdGVSZWZVcGRhdGUoc3Rhc2hSZWYpLmRlbGV0ZSgpOwogCQkJaWYgKFJlc3VsdC5GT1JDRUQgIT0gcmVzdWx0KQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hMaXN0Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3Rhc2hMaXN0Q29tbWFuZC5qYXZhCmluZGV4IDY0NTFiNzAuLmYzMTZiMjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N0YXNoTGlzdENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdGFzaExpc3RDb21tYW5kLmphdmEKQEAgLTcyLDcgKzcyLDcgQEAgcHVibGljIGNsYXNzIFN0YXNoTGlzdENvbW1hbmQgZXh0ZW5kcyBHaXRDb21tYW5kPENvbGxlY3Rpb248UmV2Q29tbWl0Pj4gewogCSAqCiAJICogQHBhcmFtIHJlcG8gYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gb2JqZWN0LgogCSAqLwotCXB1YmxpYyBTdGFzaExpc3RDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdGFzaExpc3RDb21tYW5kKFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihyZXBvKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUFkZENvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUFkZENvbW1hbmQuamF2YQppbmRleCA4MWVhMzUwLi45ZDk2MjZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVBZGRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlQWRkQ29tbWFuZC5qYXZhCkBAIC04OSw3ICs4OSw3IEBAIHB1YmxpYyBjbGFzcyBTdWJtb2R1bGVBZGRDb21tYW5kIGV4dGVuZHMKIAkgKiBAcGFyYW0gcmVwbwogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeX0gb2JqZWN0LgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kKFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihyZXBvKTsKIAl9CiAKQEAgLTEwMCw3ICsxMDAsNyBAQCBwdWJsaWMgU3VibW9kdWxlQWRkQ29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKIAkgKiAgICAgICAgICAgICh3aXRoIDxjb2RlPi88L2NvZGU+IGFzIHNlcGFyYXRvcikKIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kIHNldFBhdGgoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwdWJsaWMgU3VibW9kdWxlQWRkQ29tbWFuZCBzZXRQYXRoKFN0cmluZyBwYXRoKSB7CiAJCXRoaXMucGF0aCA9IHBhdGg7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTExMiw3ICsxMTIsNyBAQCBwdWJsaWMgU3VibW9kdWxlQWRkQ29tbWFuZCBzZXRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CiAJICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmxhbmcuU3RyaW5nfSBvYmplY3QuCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlQWRkQ29tbWFuZCBzZXRVUkkoZmluYWwgU3RyaW5nIHVyaSkgeworCXB1YmxpYyBTdWJtb2R1bGVBZGRDb21tYW5kIHNldFVSSShTdHJpbmcgdXJpKSB7CiAJCXRoaXMudXJpID0gdXJpOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC0xMjYsNyArMTI2LDcgQEAgcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQgc2V0VVJJKGZpbmFsIFN0cmluZyB1cmkpIHsKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcn0gb2JqZWN0LgogCSAqIEByZXR1cm4gdGhpcyBjb21tYW5kCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQgc2V0UHJvZ3Jlc3NNb25pdG9yKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CisJcHVibGljIFN1Ym1vZHVsZUFkZENvbW1hbmQgc2V0UHJvZ3Jlc3NNb25pdG9yKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CiAJCXJldHVybiB0aGlzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUluaXRDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVJbml0Q29tbWFuZC5qYXZhCmluZGV4IDZhZjI3ZDcuLjJkYjEyYjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZUluaXRDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlSW5pdENvbW1hbmQuamF2YQpAQCAtNzcsNyArNzcsNyBAQCBwdWJsaWMgY2xhc3MgU3VibW9kdWxlSW5pdENvbW1hbmQgZXh0ZW5kcyBHaXRDb21tYW5kPENvbGxlY3Rpb248U3RyaW5nPj4gewogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZUluaXRDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdWJtb2R1bGVJbml0Q29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJCXBhdGhzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJfQpAQCAtODksNyArODksNyBAQCBwdWJsaWMgU3VibW9kdWxlSW5pdENvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CiAJICogICAgICAgICAgICAod2l0aCA8Y29kZT4vPC9jb2RlPiBhcyBzZXBhcmF0b3IpCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlSW5pdENvbW1hbmQgYWRkUGF0aChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBTdWJtb2R1bGVJbml0Q29tbWFuZCBhZGRQYXRoKFN0cmluZyBwYXRoKSB7CiAJCXBhdGhzLmFkZChwYXRoKTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3RhdHVzQ29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3RhdHVzQ29tbWFuZC5qYXZhCmluZGV4IDk3YWU2NjguLjA2MDZjNWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVN0YXR1c0NvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVTdGF0dXNDb21tYW5kLmphdmEKQEAgLTc3LDcgKzc3LDcgQEAgcHVibGljIGNsYXNzIFN1Ym1vZHVsZVN0YXR1c0NvbW1hbmQgZXh0ZW5kcwogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVN0YXR1c0NvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFN1Ym1vZHVsZVN0YXR1c0NvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCQlwYXRocyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCX0KQEAgLTg5LDcgKzg5LDcgQEAgcHVibGljIFN1Ym1vZHVsZVN0YXR1c0NvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CiAJICogICAgICAgICAgICAod2l0aCA8Y29kZT4vPC9jb2RlPiBhcyBzZXBhcmF0b3IpCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlU3RhdHVzQ29tbWFuZCBhZGRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIFN1Ym1vZHVsZVN0YXR1c0NvbW1hbmQgYWRkUGF0aChTdHJpbmcgcGF0aCkgewogCQlwYXRocy5hZGQocGF0aCk7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTEzMCwxNiArMTMwLDE0IEBAIHByaXZhdGUgU3VibW9kdWxlU3RhdHVzIGdldFN0YXR1cyhTdWJtb2R1bGVXYWxrIGdlbmVyYXRvcikKIAkJCQkJaWQpOwogCiAJCS8vIFJlcG9ydCB1bmluaXRpYWxpemVkIGlmIG5vIHN1Ym1vZHVsZSByZXBvc2l0b3J5Ci0JCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCWlmIChzdWJSZXBvID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN1Ym1vZHVsZVN0YXR1cyhTdWJtb2R1bGVTdGF0dXNUeXBlLlVOSU5JVElBTElaRUQsIHBhdGgsCi0JCQkJCWlkKTsKKwkJT2JqZWN0SWQgaGVhZElkID0gbnVsbDsKKwkJdHJ5IChSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQlpZiAoc3ViUmVwbyA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBTdWJtb2R1bGVTdGF0dXMoU3VibW9kdWxlU3RhdHVzVHlwZS5VTklOSVRJQUxJWkVELAorCQkJCQkJcGF0aCwgaWQpOworCQkJfQogCi0JCU9iamVjdElkIGhlYWRJZDsKLQkJdHJ5IHsKIAkJCWhlYWRJZCA9IHN1YlJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWJSZXBvLmNsb3NlKCk7CiAJCX0KIAogCQkvLyBSZXBvcnQgdW5pbml0aWFsaXplZCBpZiBubyBIRUFEIGNvbW1pdCBpbiBzdWJtb2R1bGUgcmVwb3NpdG9yeQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3luY0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVN5bmNDb21tYW5kLmphdmEKaW5kZXggZDIyZDgyMC4uN2NmNGI3MyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlU3luY0NvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVTeW5jQ29tbWFuZC5qYXZhCkBAIC03OSw3ICs3OSw3IEBAIHB1YmxpYyBjbGFzcyBTdWJtb2R1bGVTeW5jQ29tbWFuZCBleHRlbmRzIEdpdENvbW1hbmQ8TWFwPFN0cmluZywgU3RyaW5nPj4gewogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVN5bmNDb21tYW5kKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBTdWJtb2R1bGVTeW5jQ29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJCXBhdGhzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJfQpAQCAtOTEsNyArOTEsNyBAQCBwdWJsaWMgU3VibW9kdWxlU3luY0NvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CiAJICogICAgICAgICAgICAod2l0aCA8Y29kZT4vPC9jb2RlPiBhcyBzZXBhcmF0b3IpCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlU3luY0NvbW1hbmQgYWRkUGF0aChmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBTdWJtb2R1bGVTeW5jQ29tbWFuZCBhZGRQYXRoKFN0cmluZyBwYXRoKSB7CiAJCXBhdGhzLmFkZChwYXRoKTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpAQCAtMTA0LDcgKzEwNCw3IEBAIHB1YmxpYyBTdWJtb2R1bGVTeW5jQ29tbWFuZCBhZGRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CiAJICogQHJldHVybiBzaG9ydGVuZWQgYnJhbmNoIG5hbWUsIG51bGwgb24gZmFpbHVyZXMKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEhlYWRCcmFuY2goZmluYWwgUmVwb3NpdG9yeSBzdWJSZXBvKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBTdHJpbmcgZ2V0SGVhZEJyYW5jaChSZXBvc2l0b3J5IHN1YlJlcG8pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVJlZiBoZWFkID0gc3ViUmVwby5leGFjdFJlZihDb25zdGFudHMuSEVBRCk7CiAJCWlmIChoZWFkICE9IG51bGwgJiYgaGVhZC5pc1N5bWJvbGljKCkpCiAJCQlyZXR1cm4gUmVwb3NpdG9yeS5zaG9ydGVuUmVmTmFtZShoZWFkLmdldExlYWYoKS5nZXROYW1lKCkpOwpAQCAtMTMyLDMwICsxMzIsMzEgQEAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gY2FsbCgpIHRocm93cyBHaXRBUElFeGNlcHRpb24gewogCQkJCQkJcGF0aCwgQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfVVJMLCByZW1vdGVVcmwpOwogCQkJCXN5bmNlZC5wdXQocGF0aCwgcmVtb3RlVXJsKTsKIAotCQkJCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGdlbmVyYXRvci5nZXRSZXBvc2l0b3J5KCk7Ci0JCQkJaWYgKHN1YlJlcG8gPT0gbnVsbCkKLQkJCQkJY29udGludWU7CisJCQkJdHJ5IChSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpKSB7CisJCQkJCWlmIChzdWJSZXBvID09IG51bGwpIHsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CiAKLQkJCQlTdG9yZWRDb25maWcgc3ViQ29uZmlnOwotCQkJCVN0cmluZyBicmFuY2g7Ci0JCQkJdHJ5IHsKKwkJCQkJU3RvcmVkQ29uZmlnIHN1YkNvbmZpZzsKKwkJCQkJU3RyaW5nIGJyYW5jaDsKKwogCQkJCQlzdWJDb25maWcgPSBzdWJSZXBvLmdldENvbmZpZygpOwogCQkJCQkvLyBHZXQgbmFtZSBvZiByZW1vdGUgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgYnJhbmNoIGFuZAogCQkJCQkvLyBmYWxsIGJhY2sgdG8gZGVmYXVsdCByZW1vdGUgbmFtZSBhcyBsYXN0IHJlc29ydAogCQkJCQlicmFuY2ggPSBnZXRIZWFkQnJhbmNoKHN1YlJlcG8pOwogCQkJCQlTdHJpbmcgcmVtb3RlID0gbnVsbDsKLQkJCQkJaWYgKGJyYW5jaCAhPSBudWxsKQorCQkJCQlpZiAoYnJhbmNoICE9IG51bGwpIHsKIAkJCQkJCXJlbW90ZSA9IHN1YkNvbmZpZy5nZXRTdHJpbmcoCiAJCQkJCQkJCUNvbmZpZ0NvbnN0YW50cy5DT05GSUdfQlJBTkNIX1NFQ1RJT04sIGJyYW5jaCwKIAkJCQkJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfUkVNT1RFKTsKLQkJCQkJaWYgKHJlbW90ZSA9PSBudWxsKQorCQkJCQl9CisJCQkJCWlmIChyZW1vdGUgPT0gbnVsbCkgewogCQkJCQkJcmVtb3RlID0gQ29uc3RhbnRzLkRFRkFVTFRfUkVNT1RFX05BTUU7CisJCQkJCX0KIAogCQkJCQlzdWJDb25maWcuc2V0U3RyaW5nKENvbmZpZ0NvbnN0YW50cy5DT05GSUdfUkVNT1RFX1NFQ1RJT04sCiAJCQkJCQkJcmVtb3RlLCBDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9VUkwsIHJlbW90ZVVybCk7CiAJCQkJCXN1YkNvbmZpZy5zYXZlKCk7Ci0JCQkJfSBmaW5hbGx5IHsKLQkJCQkJc3ViUmVwby5jbG9zZSgpOwogCQkJCX0KIAkJCX0KIAkJCWlmICghc3luY2VkLmlzRW1wdHkoKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1N1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQuamF2YQppbmRleCAzMzYyZDQ2Li4zOThmMjFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9TdWJtb2R1bGVVcGRhdGVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvU3VibW9kdWxlVXBkYXRlQ29tbWFuZC5qYXZhCkBAIC0xMDMsNyArMTAzLDcgQEAgcHVibGljIGNsYXNzIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQgZXh0ZW5kcwogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCQlwYXRocyA9IG5ldyBBcnJheUxpc3Q8PigpOwogCX0KQEAgLTEzMiw3ICsxMzIsNyBAQCBwdWJsaWMgU3VibW9kdWxlVXBkYXRlQ29tbWFuZCBzZXRQcm9ncmVzc01vbml0b3IoCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKiBAc2luY2UgNC45CiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQgc2V0RmV0Y2goZmluYWwgYm9vbGVhbiBmZXRjaCkgeworCXB1YmxpYyBTdWJtb2R1bGVVcGRhdGVDb21tYW5kIHNldEZldGNoKGJvb2xlYW4gZmV0Y2gpIHsKIAkJdGhpcy5mZXRjaCA9IGZldGNoOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC0xNDQsMTEgKzE0NCw0MyBAQCBwdWJsaWMgU3VibW9kdWxlVXBkYXRlQ29tbWFuZCBzZXRGZXRjaChmaW5hbCBib29sZWFuIGZldGNoKSB7CiAJICogICAgICAgICAgICAod2l0aCA8Y29kZT4vPC9jb2RlPiBhcyBzZXBhcmF0b3IpCiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlVXBkYXRlQ29tbWFuZCBhZGRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIFN1Ym1vZHVsZVVwZGF0ZUNvbW1hbmQgYWRkUGF0aChTdHJpbmcgcGF0aCkgewogCQlwYXRocy5hZGQocGF0aCk7CiAJCXJldHVybiB0aGlzOwogCX0KIAorCXByaXZhdGUgUmVwb3NpdG9yeSBnZXRPckNsb25lU3VibW9kdWxlKFN1Ym1vZHVsZVdhbGsgZ2VuZXJhdG9yLCBTdHJpbmcgdXJsKQorCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBHaXRBUElFeGNlcHRpb24geworCQlSZXBvc2l0b3J5IHJlcG9zaXRvcnkgPSBnZW5lcmF0b3IuZ2V0UmVwb3NpdG9yeSgpOworCQlpZiAocmVwb3NpdG9yeSA9PSBudWxsKSB7CisJCQlpZiAoY2FsbGJhY2sgIT0gbnVsbCkgeworCQkJCWNhbGxiYWNrLmNsb25pbmdTdWJtb2R1bGUoZ2VuZXJhdG9yLmdldFBhdGgoKSk7CisJCQl9CisJCQlDbG9uZUNvbW1hbmQgY2xvbmUgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCk7CisJCQljb25maWd1cmUoY2xvbmUpOworCQkJY2xvbmUuc2V0VVJJKHVybCk7CisJCQljbG9uZS5zZXREaXJlY3RvcnkoZ2VuZXJhdG9yLmdldERpcmVjdG9yeSgpKTsKKwkJCWNsb25lLnNldEdpdERpcigKKwkJCQkJbmV3IEZpbGUobmV3IEZpbGUocmVwby5nZXREaXJlY3RvcnkoKSwgQ29uc3RhbnRzLk1PRFVMRVMpLAorCQkJCQkJCWdlbmVyYXRvci5nZXRQYXRoKCkpKTsKKwkJCWlmIChtb25pdG9yICE9IG51bGwpIHsKKwkJCQljbG9uZS5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7CisJCQl9CisJCQlyZXBvc2l0b3J5ID0gY2xvbmUuY2FsbCgpLmdldFJlcG9zaXRvcnkoKTsKKwkJfSBlbHNlIGlmICh0aGlzLmZldGNoKSB7CisJCQlpZiAoZmV0Y2hDYWxsYmFjayAhPSBudWxsKSB7CisJCQkJZmV0Y2hDYWxsYmFjay5mZXRjaGluZ1N1Ym1vZHVsZShnZW5lcmF0b3IuZ2V0UGF0aCgpKTsKKwkJCX0KKwkJCUZldGNoQ29tbWFuZCBmZXRjaENvbW1hbmQgPSBHaXQud3JhcChyZXBvc2l0b3J5KS5mZXRjaCgpOworCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkgeworCQkJCWZldGNoQ29tbWFuZC5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7CisJCQl9CisJCQljb25maWd1cmUoZmV0Y2hDb21tYW5kKTsKKwkJCWZldGNoQ29tbWFuZC5jYWxsKCk7CisJCX0KKwkJcmV0dXJuIHJlcG9zaXRvcnk7CisJfQorCiAJLyoqCiAJICoge0Bpbmhlcml0RG9jfQogCSAqCkBAIC0xNzUsMzQgKzIwNyw4IEBAIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gY2FsbCgpIHRocm93cyBJbnZhbGlkQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKIAkJCQlpZiAodXJsID09IG51bGwpCiAJCQkJCWNvbnRpbnVlOwogCi0JCQkJUmVwb3NpdG9yeSBzdWJtb2R1bGVSZXBvID0gZ2VuZXJhdG9yLmdldFJlcG9zaXRvcnkoKTsKLQkJCQkvLyBDbG9uZSByZXBvc2l0b3J5IGlmIG5vdCBwcmVzZW50Ci0JCQkJaWYgKHN1Ym1vZHVsZVJlcG8gPT0gbnVsbCkgewotCQkJCQlpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotCQkJCQkJY2FsbGJhY2suY2xvbmluZ1N1Ym1vZHVsZShnZW5lcmF0b3IuZ2V0UGF0aCgpKTsKLQkJCQkJfQotCQkJCQlDbG9uZUNvbW1hbmQgY2xvbmUgPSBHaXQuY2xvbmVSZXBvc2l0b3J5KCk7Ci0JCQkJCWNvbmZpZ3VyZShjbG9uZSk7Ci0JCQkJCWNsb25lLnNldFVSSSh1cmwpOwotCQkJCQljbG9uZS5zZXREaXJlY3RvcnkoZ2VuZXJhdG9yLmdldERpcmVjdG9yeSgpKTsKLQkJCQkJY2xvbmUuc2V0R2l0RGlyKG5ldyBGaWxlKG5ldyBGaWxlKHJlcG8uZ2V0RGlyZWN0b3J5KCksCi0JCQkJCQkJQ29uc3RhbnRzLk1PRFVMRVMpLCBnZW5lcmF0b3IuZ2V0UGF0aCgpKSk7Ci0JCQkJCWlmIChtb25pdG9yICE9IG51bGwpCi0JCQkJCQljbG9uZS5zZXRQcm9ncmVzc01vbml0b3IobW9uaXRvcik7Ci0JCQkJCXN1Ym1vZHVsZVJlcG8gPSBjbG9uZS5jYWxsKCkuZ2V0UmVwb3NpdG9yeSgpOwotCQkJCX0gZWxzZSBpZiAodGhpcy5mZXRjaCkgewotCQkJCQlpZiAoZmV0Y2hDYWxsYmFjayAhPSBudWxsKSB7Ci0JCQkJCQlmZXRjaENhbGxiYWNrLmZldGNoaW5nU3VibW9kdWxlKGdlbmVyYXRvci5nZXRQYXRoKCkpOwotCQkJCQl9Ci0JCQkJCUZldGNoQ29tbWFuZCBmZXRjaENvbW1hbmQgPSBHaXQud3JhcChzdWJtb2R1bGVSZXBvKS5mZXRjaCgpOwotCQkJCQlpZiAobW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCQlmZXRjaENvbW1hbmQuc2V0UHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJCWNvbmZpZ3VyZShmZXRjaENvbW1hbmQpOwotCQkJCQlmZXRjaENvbW1hbmQuY2FsbCgpOwotCQkJCX0KLQotCQkJCXRyeSAoUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsoc3VibW9kdWxlUmVwbykpIHsKKwkJCQl0cnkgKFJlcG9zaXRvcnkgc3VibW9kdWxlUmVwbyA9IGdldE9yQ2xvbmVTdWJtb2R1bGUoZ2VuZXJhdG9yLAorCQkJCQkJdXJsKTsgUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsoc3VibW9kdWxlUmVwbykpIHsKIAkJCQkJUmV2Q29tbWl0IGNvbW1pdCA9IHdhbGsKIAkJCQkJCQkucGFyc2VDb21taXQoZ2VuZXJhdG9yLmdldE9iamVjdElkKCkpOwogCkBAIC0yMzcsOCArMjQzLDYgQEAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBjYWxsKCkgdGhyb3dzIEludmFsaWRDb25maWd1cmF0aW9uRXhjZXB0aW9uLAogCQkJCQkJCQkJZ2VuZXJhdG9yLmdldFBhdGgoKSk7CiAJCQkJCQl9CiAJCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlzdWJtb2R1bGVSZXBvLmNsb3NlKCk7CiAJCQkJfQogCQkJCXVwZGF0ZWQuYWRkKGdlbmVyYXRvci5nZXRQYXRoKCkpOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvVHJhbnNwb3J0Q29tbWFuZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvVHJhbnNwb3J0Q29tbWFuZC5qYXZhCmluZGV4IDljOTE1MzcuLmQzNGJiNWQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL1RyYW5zcG9ydENvbW1hbmQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9UcmFuc3BvcnRDb21tYW5kLmphdmEKQEAgLTgwLDcgKzgwLDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zcG9ydENvbW1hbmQ8QyBleHRlbmRzIEdpdENvbW1hbmQsIFQ+IGV4dGVuZHMKIAkgKgogCSAqIEBwYXJhbSByZXBvIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnl9IG9iamVjdC4KIAkgKi8KLQlwcm90ZWN0ZWQgVHJhbnNwb3J0Q29tbWFuZChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwcm90ZWN0ZWQgVHJhbnNwb3J0Q29tbWFuZChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJc3VwZXIocmVwbyk7CiAJCXNldENyZWRlbnRpYWxzUHJvdmlkZXIoQ3JlZGVudGlhbHNQcm92aWRlci5nZXREZWZhdWx0KCkpOwogCX0KQEAgLTE0Nyw3ICsxNDcsNyBAQCBwcm90ZWN0ZWQgZmluYWwgQyBzZWxmKCkgewogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVHJhbnNwb3J0fSBvYmplY3QuCiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwcm90ZWN0ZWQgQyBjb25maWd1cmUoZmluYWwgVHJhbnNwb3J0IHRyYW5zcG9ydCkgeworCXByb3RlY3RlZCBDIGNvbmZpZ3VyZShUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CiAJCWlmIChjcmVkZW50aWFsc1Byb3ZpZGVyICE9IG51bGwpCiAJCQl0cmFuc3BvcnQuc2V0Q3JlZGVudGlhbHNQcm92aWRlcihjcmVkZW50aWFsc1Byb3ZpZGVyKTsKIAkJdHJhbnNwb3J0LnNldFRpbWVvdXQodGltZW91dCk7CkBAIC0xNjQsNyArMTY0LDcgQEAgcHJvdGVjdGVkIEMgY29uZmlndXJlKGZpbmFsIFRyYW5zcG9ydCB0cmFuc3BvcnQpIHsKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQuYXBpLlRyYW5zcG9ydENvbW1hbmR9IG9iamVjdC4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXByb3RlY3RlZCBDIGNvbmZpZ3VyZShmaW5hbCBUcmFuc3BvcnRDb21tYW5kIGNoaWxkQ29tbWFuZCkgeworCXByb3RlY3RlZCBDIGNvbmZpZ3VyZShUcmFuc3BvcnRDb21tYW5kIGNoaWxkQ29tbWFuZCkgewogCQljaGlsZENvbW1hbmQuc2V0Q3JlZGVudGlhbHNQcm92aWRlcihjcmVkZW50aWFsc1Byb3ZpZGVyKTsKIAkJY2hpbGRDb21tYW5kLnNldFRpbWVvdXQodGltZW91dCk7CiAJCWNoaWxkQ29tbWFuZC5zZXRUcmFuc3BvcnRDb25maWdDYWxsYmFjayh0cmFuc3BvcnRDb25maWdDYWxsYmFjayk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvQWJvcnRlZEJ5SG9va0V4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL0Fib3J0ZWRCeUhvb2tFeGNlcHRpb24uamF2YQpvbGQgbW9kZSAxMDA3NTUKbmV3IG1vZGUgMTAwNjQ0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvRW10cHlDb21taXRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9FbXB0eUNvbW1pdEV4Y2VwdGlvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODglCnJlbmFtZSBmcm9tIG9yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9FbXRweUNvbW1pdEV4Y2VwdGlvbi5qYXZhCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvRW1wdHlDb21taXRFeGNlcHRpb24uamF2YQppbmRleCBlYTBlNzE4Li44N2UxYTZhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvRW10cHlDb21taXRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2FwaS9lcnJvcnMvRW1wdHlDb21taXRFeGNlcHRpb24uamF2YQpAQCAtNDAsMzAgKzQwLDMwIEBACiAvKioKICAqIEV4Y2VwdGlvbiB0aHJvd24gd2hlbiBhIG5ld2x5IGNyZWF0ZWQgY29tbWl0IGRvZXMgbm90IGNvbnRhaW4gYW55IGNoYW5nZXMKICAqCi0gKiBAc2luY2UgNC4yCisgKiBAc2luY2UgNS4wCiAgKi8KLXB1YmxpYyBjbGFzcyBFbXRweUNvbW1pdEV4Y2VwdGlvbiBleHRlbmRzIEdpdEFQSUV4Y2VwdGlvbiB7IC8vIFRPRE86IENvcnJlY3Qgc3BlbGxpbmcgb2YgdGhpcyBjbGFzcyBuYW1lIGluIDUuMAorcHVibGljIGNsYXNzIEVtcHR5Q29tbWl0RXhjZXB0aW9uIGV4dGVuZHMgR2l0QVBJRXhjZXB0aW9uIHsKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKIAogCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFbXRweUNvbW1pdEV4Y2VwdGlvbgorCSAqIENvbnN0cnVjdG9yIGZvciBFbXB0eUNvbW1pdEV4Y2VwdGlvbgogCSAqCiAJICogQHBhcmFtIG1lc3NhZ2UKIAkgKiAgICAgICAgICAgIGVycm9yIG1lc3NhZ2UKIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEubGFuZy5UaHJvd2FibGV9CiAJICovCi0JcHVibGljIEVtdHB5Q29tbWl0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgRW1wdHlDb21taXRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7CiAJfQogCiAJLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVtdHB5Q29tbWl0RXhjZXB0aW9uLgorCSAqIENvbnN0cnVjdG9yIGZvciBFbXB0eUNvbW1pdEV4Y2VwdGlvbi4KIAkgKgogCSAqIEBwYXJhbSBtZXNzYWdlCiAJICogICAgICAgICAgICBlcnJvciBtZXNzYWdlCiAJICovCi0JcHVibGljIEVtdHB5Q29tbWl0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisJcHVibGljIEVtcHR5Q29tbWl0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CiAJCXN1cGVyKG1lc3NhZ2UpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYXBpL2Vycm9ycy9TdGFzaEFwcGx5RmFpbHVyZUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL1N0YXNoQXBwbHlGYWlsdXJlRXhjZXB0aW9uLmphdmEKaW5kZXggNTE3YjUxMi4uYjEyYzAzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL1N0YXNoQXBwbHlGYWlsdXJlRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9hcGkvZXJyb3JzL1N0YXNoQXBwbHlGYWlsdXJlRXhjZXB0aW9uLmphdmEKQEAgLTI2LDcgKzI2LDcgQEAgcHVibGljIFN0YXNoQXBwbHlGYWlsdXJlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkgKiBAcGFyYW0gbWVzc2FnZQogCSAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBTdGFzaEFwcGx5RmFpbHVyZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworCXB1YmxpYyBTdGFzaEFwcGx5RmFpbHVyZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewogCQlzdXBlcihtZXNzYWdlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYmxhbWUvUmV2ZXJzZVdhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvYmxhbWUvUmV2ZXJzZVdhbGsuamF2YQppbmRleCAyZWIzMTNmLi4xMDY3Mzc4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2JsYW1lL1JldmVyc2VXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ibGFtZS9SZXZlcnNlV2Fsay5qYXZhCkBAIC0xMDgsNyArMTA4LDcgQEAgaW50IGdldENoaWxkQ291bnQoKSB7CiAJCQlyZXR1cm4gY2hpbGRyZW4ubGVuZ3RoOwogCQl9CiAKLQkJUmV2ZXJzZUNvbW1pdCBnZXRDaGlsZChmaW5hbCBpbnQgbnRoKSB7CisJCVJldmVyc2VDb21taXQgZ2V0Q2hpbGQoaW50IG50aCkgewogCQkJcmV0dXJuIGNoaWxkcmVuW250aF07CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZDb25maWcuamF2YQppbmRleCAwNjNjZWZmLi4yMWRjYTZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkNvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmQ29uZmlnLmphdmEKQEAgLTc2LDcgKzc2LDcgQEAgcHVibGljIHN0YXRpYyBlbnVtIFJlbmFtZURldGVjdGlvblR5cGUgewogCiAJcHJpdmF0ZSBmaW5hbCBpbnQgcmVuYW1lTGltaXQ7CiAKLQlwcml2YXRlIERpZmZDb25maWcoZmluYWwgQ29uZmlnIHJjKSB7CisJcHJpdmF0ZSBEaWZmQ29uZmlnKENvbmZpZyByYykgewogCQlub1ByZWZpeCA9IHJjLmdldEJvb2xlYW4oQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19ESUZGX1NFQ1RJT04sCiAJCQkJQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19LRVlfTk9QUkVGSVgsIGZhbHNlKTsKIAkJcmVuYW1lRGV0ZWN0aW9uVHlwZSA9IHBhcnNlUmVuYW1lRGV0ZWN0aW9uVHlwZShyYy5nZXRTdHJpbmcoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0RpZmZGb3JtYXR0ZXIuamF2YQppbmRleCAyZTI5YjgxLi43YWFhNTAwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRGlmZkZvcm1hdHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9EaWZmRm9ybWF0dGVyLmphdmEKQEAgLTIyMiw3ICsyMjIsNyBAQCBwcml2YXRlIHZvaWQgc2V0UmVhZGVyKE9iamVjdFJlYWRlciByZWFkZXIsIENvbmZpZyBjZmcsIGJvb2xlYW4gY2xvc2VSZWFkZXIpIHsKIAkgKiAgICAgICAgICAgIG1vZGlmaWNhdGlvbiBhbmQgYWZ0ZXIgdGhlIGxhc3QgbW9kaWZpY2F0aW9uIHdpdGhpbiBhIGh1bmsgb2YKIAkgKiAgICAgICAgICAgIHRoZSBtb2RpZmllZCBmaWxlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRleHQoZmluYWwgaW50IGxpbmVDb3VudCkgeworCXB1YmxpYyB2b2lkIHNldENvbnRleHQoaW50IGxpbmVDb3VudCkgewogCQlpZiAobGluZUNvdW50IDwgMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCUpHaXRUZXh0LmdldCgpLmNvbnRleHRNdXN0QmVOb25OZWdhdGl2ZSk7CkBAIC0yMzUsNyArMjM1LDcgQEAgcHVibGljIHZvaWQgc2V0Q29udGV4dChmaW5hbCBpbnQgbGluZUNvdW50KSB7CiAJICogQHBhcmFtIGNvdW50CiAJICogICAgICAgICAgICBudW1iZXIgb2YgZGlnaXRzIHRvIHNob3cgaW4gYW4gT2JqZWN0SWQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWJicmV2aWF0aW9uTGVuZ3RoKGZpbmFsIGludCBjb3VudCkgeworCXB1YmxpYyB2b2lkIHNldEFiYnJldmlhdGlvbkxlbmd0aChpbnQgY291bnQpIHsKIAkJaWYgKGNvdW50IDwgMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCiAJCQkJCUpHaXRUZXh0LmdldCgpLmFiYnJldmlhdGlvbkxlbmd0aE11c3RCZU5vbk5lZ2F0aXZlKTsKQEAgLTc0Miw3ICs3NDIsNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcXVvdGVQYXRoKFN0cmluZyBuYW1lKSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgd3JpdGluZyB0byB0aGUgc3VwcGxpZWQgc3RyZWFtIGZhaWxlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXQoZmluYWwgRmlsZUhlYWRlciBoZWFkLCBmaW5hbCBSYXdUZXh0IGEsIGZpbmFsIFJhd1RleHQgYikKKwlwdWJsaWMgdm9pZCBmb3JtYXQoRmlsZUhlYWRlciBoZWFkLCBSYXdUZXh0IGEsIFJhd1RleHQgYikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCS8vIFJldXNlIHRoZSBleGlzdGluZyBGaWxlSGVhZGVyIGFzLWlzIGJ5IGJsaW5kbHkgY29weWluZyBpdHMKIAkJLy8gaGVhZGVyIGxpbmVzLCBidXQgYXZvaWRpbmcgaXRzIGh1bmtzLiBJbnN0ZWFkIHdlIHJlY3JlYXRlCkBAIC03NjgsNyArNzY4LDcgQEAgcHVibGljIHZvaWQgZm9ybWF0KGZpbmFsIEZpbGVIZWFkZXIgaGVhZCwgZmluYWwgUmF3VGV4dCBhLCBmaW5hbCBSYXdUZXh0IGIpCiAJICogICAgICAgICAgICB0aGUgdGV4dCBCIHdoaWNoIHdhcyBjb21wYXJlZAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdChmaW5hbCBFZGl0TGlzdCBlZGl0cywgZmluYWwgUmF3VGV4dCBhLCBmaW5hbCBSYXdUZXh0IGIpCisJcHVibGljIHZvaWQgZm9ybWF0KEVkaXRMaXN0IGVkaXRzLCBSYXdUZXh0IGEsIFJhd1RleHQgYikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZvciAoaW50IGN1cklkeCA9IDA7IGN1cklkeCA8IGVkaXRzLnNpemUoKTspIHsKIAkJCUVkaXQgY3VyRWRpdCA9IGVkaXRzLmdldChjdXJJZHgpOwpAQCAtODE2LDEyICs4MTYsMTIgQEAgcHVibGljIHZvaWQgZm9ybWF0KGZpbmFsIEVkaXRMaXN0IGVkaXRzLCBmaW5hbCBSYXdUZXh0IGEsIGZpbmFsIFJhd1RleHQgYikKIAkgKiAgICAgICAgICAgIHRoZSBsaW5lIG51bWJlciB3aXRoaW4gdGV4dAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHdyaXRlQ29udGV4dExpbmUoZmluYWwgUmF3VGV4dCB0ZXh0LCBmaW5hbCBpbnQgbGluZSkKKwlwcm90ZWN0ZWQgdm9pZCB3cml0ZUNvbnRleHRMaW5lKFJhd1RleHQgdGV4dCwgaW50IGxpbmUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZUxpbmUoJyAnLCB0ZXh0LCBsaW5lKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRW5kT2ZMaW5lTWlzc2luZyhmaW5hbCBSYXdUZXh0IHRleHQsIGZpbmFsIGludCBsaW5lKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0VuZE9mTGluZU1pc3NpbmcoUmF3VGV4dCB0ZXh0LCBpbnQgbGluZSkgewogCQlyZXR1cm4gbGluZSArIDEgPT0gdGV4dC5zaXplKCkgJiYgdGV4dC5pc01pc3NpbmdOZXdsaW5lQXRFbmQoKTsKIAl9CiAKQEAgLTgzNCw3ICs4MzQsNyBAQCBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRW5kT2ZMaW5lTWlzc2luZyhmaW5hbCBSYXdUZXh0IHRleHQsIGZpbmFsIGludCBsaW5lKSB7CiAJICogICAgICAgICAgICB0aGUgbGluZSBudW1iZXIgd2l0aGluIHRleHQKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB3cml0ZUFkZGVkTGluZShmaW5hbCBSYXdUZXh0IHRleHQsIGZpbmFsIGludCBsaW5lKQorCXByb3RlY3RlZCB2b2lkIHdyaXRlQWRkZWRMaW5lKFJhd1RleHQgdGV4dCwgaW50IGxpbmUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZUxpbmUoJysnLCB0ZXh0LCBsaW5lKTsKIAl9CkBAIC04NDgsNyArODQ4LDcgQEAgcHJvdGVjdGVkIHZvaWQgd3JpdGVBZGRlZExpbmUoZmluYWwgUmF3VGV4dCB0ZXh0LCBmaW5hbCBpbnQgbGluZSkKIAkgKiAgICAgICAgICAgIHRoZSBsaW5lIG51bWJlciB3aXRoaW4gdGV4dAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHdyaXRlUmVtb3ZlZExpbmUoZmluYWwgUmF3VGV4dCB0ZXh0LCBmaW5hbCBpbnQgbGluZSkKKwlwcm90ZWN0ZWQgdm9pZCB3cml0ZVJlbW92ZWRMaW5lKFJhd1RleHQgdGV4dCwgaW50IGxpbmUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3cml0ZUxpbmUoJy0nLCB0ZXh0LCBsaW5lKTsKIAl9CkBAIC04NzgsNyArODc4LDcgQEAgcHJvdGVjdGVkIHZvaWQgd3JpdGVIdW5rSGVhZGVyKGludCBhU3RhcnRMaW5lLCBpbnQgYUVuZExpbmUsCiAJCW91dC53cml0ZSgnXG4nKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgd3JpdGVSYW5nZShmaW5hbCBjaGFyIHByZWZpeCwgZmluYWwgaW50IGJlZ2luLCBmaW5hbCBpbnQgY250KQorCXByaXZhdGUgdm9pZCB3cml0ZVJhbmdlKGNoYXIgcHJlZml4LCBpbnQgYmVnaW4sIGludCBjbnQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvdXQud3JpdGUoJyAnKTsKIAkJb3V0LndyaXRlKHByZWZpeCk7CkBAIC0xMjEzLDcgKzEyMTMsNyBAQCBwcml2YXRlIHZvaWQgZm9ybWF0T2xkTmV3UGF0aHMoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG8sIERpZmZFbnRyeSBlbnQpCiAJCW8ud3JpdGUoZW5jb2RlKCIrKysgIiArIG5ld3AgKyAiXG4iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCX0KIAotCXByaXZhdGUgaW50IGZpbmRDb21iaW5lZEVuZChmaW5hbCBMaXN0PEVkaXQ+IGVkaXRzLCBmaW5hbCBpbnQgaSkgeworCXByaXZhdGUgaW50IGZpbmRDb21iaW5lZEVuZChMaXN0PEVkaXQ+IGVkaXRzLCBpbnQgaSkgewogCQlpbnQgZW5kID0gaSArIDE7CiAJCXdoaWxlIChlbmQgPCBlZGl0cy5zaXplKCkKIAkJCQkmJiAoY29tYmluZUEoZWRpdHMsIGVuZCkgfHwgY29tYmluZUIoZWRpdHMsIGVuZCkpKQpAQCAtMTIyMSwxNSArMTIyMSwxNSBAQCBwcml2YXRlIGludCBmaW5kQ29tYmluZWRFbmQoZmluYWwgTGlzdDxFZGl0PiBlZGl0cywgZmluYWwgaW50IGkpIHsKIAkJcmV0dXJuIGVuZCAtIDE7CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIGNvbWJpbmVBKGZpbmFsIExpc3Q8RWRpdD4gZSwgZmluYWwgaW50IGkpIHsKKwlwcml2YXRlIGJvb2xlYW4gY29tYmluZUEoTGlzdDxFZGl0PiBlLCBpbnQgaSkgewogCQlyZXR1cm4gZS5nZXQoaSkuZ2V0QmVnaW5BKCkgLSBlLmdldChpIC0gMSkuZ2V0RW5kQSgpIDw9IDIgKiBjb250ZXh0OwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBjb21iaW5lQihmaW5hbCBMaXN0PEVkaXQ+IGUsIGZpbmFsIGludCBpKSB7CisJcHJpdmF0ZSBib29sZWFuIGNvbWJpbmVCKExpc3Q8RWRpdD4gZSwgaW50IGkpIHsKIAkJcmV0dXJuIGUuZ2V0KGkpLmdldEJlZ2luQigpIC0gZS5nZXQoaSAtIDEpLmdldEVuZEIoKSA8PSAyICogY29udGV4dDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuZChmaW5hbCBFZGl0IGVkaXQsIGZpbmFsIGludCBhLCBmaW5hbCBpbnQgYikgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5kKEVkaXQgZWRpdCwgaW50IGEsIGludCBiKSB7CiAJCXJldHVybiBlZGl0LmdldEVuZEEoKSA8PSBhICYmIGVkaXQuZ2V0RW5kQigpIDw9IGI7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0VkaXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9FZGl0LmphdmEKaW5kZXggNzc1ZDExYS4uNWM4NzZlOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0VkaXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvRWRpdC5qYXZhCkBAIC05NCw3ICs5NCw3IEBAIHB1YmxpYyBzdGF0aWMgZW51bSBUeXBlIHsKIAkgKiBAcGFyYW0gYnMKIAkgKiAgICAgICAgICAgIGJlZ2luQjogc3RhcnQgYW5kIGVuZCBvZiByZWdpb24gaW4gc2VxdWVuY2UgQjsgMCBiYXNlZC4KIAkgKi8KLQlwdWJsaWMgRWRpdChmaW5hbCBpbnQgYXMsIGZpbmFsIGludCBicykgeworCXB1YmxpYyBFZGl0KGludCBhcywgaW50IGJzKSB7CiAJCXRoaXMoYXMsIGFzLCBicywgYnMpOwogCX0KIApAQCAtMTEwLDcgKzExMCw3IEBAIHB1YmxpYyBFZGl0KGZpbmFsIGludCBhcywgZmluYWwgaW50IGJzKSB7CiAJICogQHBhcmFtIGJlCiAJICogICAgICAgICAgICBlbmRCOiBlbmQgb2YgcmVnaW9uIGluIHNlcXVlbmNlIEI7IG11c3QgYmUgJmd0OyA9IGJzLgogCSAqLwotCXB1YmxpYyBFZGl0KGZpbmFsIGludCBhcywgZmluYWwgaW50IGFlLCBmaW5hbCBpbnQgYnMsIGZpbmFsIGludCBiZSkgeworCXB1YmxpYyBFZGl0KGludCBhcywgaW50IGFlLCBpbnQgYnMsIGludCBiZSkgewogCQliZWdpbkEgPSBhczsKIAkJZW5kQSA9IGFlOwogCkBAIC0yNzksNyArMjc5LDcgQEAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCWlmIChvIGluc3RhbmNlb2YgRWRpdCkgewogCQkJZmluYWwgRWRpdCBlID0gKEVkaXQpIG87CiAJCQlyZXR1cm4gdGhpcy5iZWdpbkEgPT0gZS5iZWdpbkEgJiYgdGhpcy5lbmRBID09IGUuZW5kQQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0hpc3RvZ3JhbURpZmZJbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL0hpc3RvZ3JhbURpZmZJbmRleC5qYXZhCmluZGV4IDA0Yzc5ZmMuLjNmODEzZDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9IaXN0b2dyYW1EaWZmSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvSGlzdG9ncmFtRGlmZkluZGV4LmphdmEKQEAgLTIzMCw3ICsyMzAsNyBAQCBwcml2YXRlIGJvb2xlYW4gc2NhbkEoKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgaW50IHRyeUxvbmdlc3RDb21tb25TZXF1ZW5jZShmaW5hbCBpbnQgYlB0cikgeworCXByaXZhdGUgaW50IHRyeUxvbmdlc3RDb21tb25TZXF1ZW5jZShpbnQgYlB0cikgewogCQlpbnQgYk5leHQgPSBiUHRyICsgMTsKIAkJaW50IHJJZHggPSB0YWJsZVtoYXNoKGIsIGJQdHIpXTsKIAkJZm9yIChsb25nIHJlYzsgcklkeCAhPSAwOyBySWR4ID0gcmVjTmV4dChyZWMpKSB7CkBAIC0zMjgsNyArMzI4LDcgQEAgcHJpdmF0ZSBzdGF0aWMgaW50IHJlY0NudChsb25nIHJlYykgewogCQlyZXR1cm4gKChpbnQpIHJlYykgJiBSRUNfQ05UX01BU0s7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlQml0cyhmaW5hbCBpbnQgc3opIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVCaXRzKGludCBzeikgewogCQlpbnQgYml0cyA9IDMxIC0gSW50ZWdlci5udW1iZXJPZkxlYWRpbmdaZXJvcyhzeik7CiAJCWlmIChiaXRzID09IDApCiAJCQliaXRzID0gMTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9NeWVyc0RpZmYuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9NeWVyc0RpZmYuamF2YQppbmRleCA2NDZmMjY0Li5jYWFmZmUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvTXllcnNEaWZmLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL015ZXJzRGlmZi5qYXZhCkBAIC0zNTksNyArMzU5LDcgQEAgdm9pZCBpbml0aWFsaXplKGludCBrLCBpbnQgeCwgaW50IG1pbkssIGludCBtYXhLKSB7CiAJCQlhYnN0cmFjdCBpbnQgZ2V0TGVmdChpbnQgeCk7CiAJCQlhYnN0cmFjdCBpbnQgZ2V0UmlnaHQoaW50IHgpOwogCQkJYWJzdHJhY3QgYm9vbGVhbiBpc0JldHRlcihpbnQgbGVmdCwgaW50IHJpZ2h0KTsKLQkJCWFic3RyYWN0IHZvaWQgYWRqdXN0TWluTWF4SyhmaW5hbCBpbnQgaywgZmluYWwgaW50IHgpOworCQkJYWJzdHJhY3Qgdm9pZCBhZGp1c3RNaW5NYXhLKGludCBrLCBpbnQgeCk7CiAJCQlhYnN0cmFjdCBib29sZWFuIG1lZXRzKGludCBkLCBpbnQgaywgaW50IHgsIGxvbmcgc25ha2UpOwogCiAJCQlmaW5hbCBsb25nIG5ld1NuYWtlKGludCBrLCBpbnQgeCkgewpAQCAtNDY5LDIyICs0NjksMjIgQEAgZmluYWwgaW50IHNuYWtlKGludCBrLCBpbnQgeCkgewogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGludCBnZXRMZWZ0KGZpbmFsIGludCB4KSB7CisJCQlmaW5hbCBpbnQgZ2V0TGVmdChpbnQgeCkgewogCQkJCXJldHVybiB4OwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGludCBnZXRSaWdodChmaW5hbCBpbnQgeCkgeworCQkJZmluYWwgaW50IGdldFJpZ2h0KGludCB4KSB7CiAJCQkJcmV0dXJuIHggKyAxOwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGJvb2xlYW4gaXNCZXR0ZXIoZmluYWwgaW50IGxlZnQsIGZpbmFsIGludCByaWdodCkgeworCQkJZmluYWwgYm9vbGVhbiBpc0JldHRlcihpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CiAJCQkJcmV0dXJuIGxlZnQgPiByaWdodDsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlmaW5hbCB2b2lkIGFkanVzdE1pbk1heEsoZmluYWwgaW50IGssIGZpbmFsIGludCB4KSB7CisJCQlmaW5hbCB2b2lkIGFkanVzdE1pbk1heEsoaW50IGssIGludCB4KSB7CiAJCQkJaWYgKHggPj0gZW5kQSB8fCBrICsgeCA+PSBlbmRCKSB7CiAJCQkJCWlmIChrID4gYmFja3dhcmQubWlkZGxlSykKIAkJCQkJCW1heEsgPSBrOwpAQCAtNTE3LDIyICs1MTcsMjIgQEAgZmluYWwgaW50IHNuYWtlKGludCBrLCBpbnQgeCkgewogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGludCBnZXRMZWZ0KGZpbmFsIGludCB4KSB7CisJCQlmaW5hbCBpbnQgZ2V0TGVmdChpbnQgeCkgewogCQkJCXJldHVybiB4IC0gMTsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlmaW5hbCBpbnQgZ2V0UmlnaHQoZmluYWwgaW50IHgpIHsKKwkJCWZpbmFsIGludCBnZXRSaWdodChpbnQgeCkgewogCQkJCXJldHVybiB4OwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCWZpbmFsIGJvb2xlYW4gaXNCZXR0ZXIoZmluYWwgaW50IGxlZnQsIGZpbmFsIGludCByaWdodCkgeworCQkJZmluYWwgYm9vbGVhbiBpc0JldHRlcihpbnQgbGVmdCwgaW50IHJpZ2h0KSB7CiAJCQkJcmV0dXJuIGxlZnQgPCByaWdodDsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlmaW5hbCB2b2lkIGFkanVzdE1pbk1heEsoZmluYWwgaW50IGssIGZpbmFsIGludCB4KSB7CisJCQlmaW5hbCB2b2lkIGFkanVzdE1pbk1heEsoaW50IGssIGludCB4KSB7CiAJCQkJaWYgKHggPD0gYmVnaW5BIHx8IGsgKyB4IDw9IGJlZ2luQikgewogCQkJCQlpZiAoayA+IGZvcndhcmQubWlkZGxlSykKIAkJCQkJCW1heEsgPSBrOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0LmphdmEKaW5kZXggZWM4OGNlNC4uYmQ0MWQ5MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvUmF3VGV4dC5qYXZhCkBAIC04OCwxMiArODgsMjkgQEAgcHVibGljIGNsYXNzIFJhd1RleHQgZXh0ZW5kcyBTZXF1ZW5jZSB7CiAJICogVGhlIGVudGlyZSBhcnJheSAoaW5kZXhlcyAwIHRocm91Z2ggbGVuZ3RoLTEpIGlzIHVzZWQgYXMgdGhlIGNvbnRlbnQuCiAJICoKIAkgKiBAcGFyYW0gaW5wdXQKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50IGFycmF5LiBUaGUgYXJyYXkgaXMgbmV2ZXIgbW9kaWZpZWQsIHNvIHBhc3NpbmcKLQkgKiAgICAgICAgICAgIHRocm91Z2ggY2FjaGVkIGFycmF5cyBpcyBzYWZlLgorCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgYXJyYXkuIFRoZSBvYmplY3QgcmV0YWlucyBhIHJlZmVyZW5jZSB0byB0aGlzCisJICogICAgICAgICAgICBhcnJheSwgc28gaXQgc2hvdWxkIGJlIGltbXV0YWJsZS4KIAkgKi8KLQlwdWJsaWMgUmF3VGV4dChmaW5hbCBieXRlW10gaW5wdXQpIHsKKwlwdWJsaWMgUmF3VGV4dChieXRlW10gaW5wdXQpIHsKKwkJdGhpcyhpbnB1dCwgUmF3UGFyc2VVdGlscy5saW5lTWFwKGlucHV0LCAwLCBpbnB1dC5sZW5ndGgpKTsKKwl9CisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgc2VxdWVuY2UgZnJvbSB0aGUgZXhpc3RpbmcgY29udGVudCBieXRlIGFycmF5IGFuZCB0aGUgbGluZQorCSAqIG1hcCBpbmRpY2F0aW5nIGxpbmUgYm91bmRhcmllcy4KKwkgKgorCSAqIEBwYXJhbSBpbnB1dAorCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgYXJyYXkuIFRoZSBvYmplY3QgcmV0YWlucyBhIHJlZmVyZW5jZSB0byB0aGlzCisJICogICAgICAgICAgICBhcnJheSwgc28gaXQgc2hvdWxkIGJlIGltbXV0YWJsZS4KKwkgKiBAcGFyYW0gbGluZU1hcAorCSAqICAgICAgICAgICAgYW4gYXJyYXkgd2l0aCAxLWJhc2VkIG9mZnNldHMgZm9yIHRoZSBzdGFydCBvZiBlYWNoIGxpbmUuCisJICogICAgICAgICAgICBUaGUgZmlyc3QgYW5kIGxhc3QgZW50cmllcyBzaG91bGQgYmUge0BsaW5rIEludGVnZXIjTUlOX1ZBTFVFfQorCSAqICAgICAgICAgICAgYW5kIGFuIG9mZnNldCBvbmUgcGFzdCB0aGUgZW5kIG9mIHRoZSBsYXN0IGxpbmUsIHJlc3BlY3RpdmVseS4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIFJhd1RleHQoYnl0ZVtdIGlucHV0LCBJbnRMaXN0IGxpbmVNYXApIHsKIAkJY29udGVudCA9IGlucHV0OwotCQlsaW5lcyA9IFJhd1BhcnNlVXRpbHMubGluZU1hcChjb250ZW50LCAwLCBjb250ZW50Lmxlbmd0aCk7CisJCWxpbmVzID0gbGluZU1hcDsKIAl9CiAKIAkvKioKQEAgLTE0Nyw3ICsxNjQsNyBAQCBwdWJsaWMgaW50IHNpemUoKSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSB3cml0ZSBvcGVyYXRpb24gZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlTGluZShmaW5hbCBPdXRwdXRTdHJlYW0gb3V0LCBmaW5hbCBpbnQgaSkKKwlwdWJsaWMgdm9pZCB3cml0ZUxpbmUoT3V0cHV0U3RyZWFtIG91dCwgaW50IGkpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpbnQgc3RhcnQgPSBnZXRTdGFydChpKTsKIAkJaW50IGVuZCA9IGdldEVuZChpKTsKQEAgLTIyMSwxMSArMjM4LDExIEBAIHByb3RlY3RlZCBTdHJpbmcgZGVjb2RlKGludCBzdGFydCwgaW50IGVuZCkgewogCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUoY29udGVudCwgc3RhcnQsIGVuZCk7CiAJfQogCi0JcHJpdmF0ZSBpbnQgZ2V0U3RhcnQoZmluYWwgaW50IGkpIHsKKwlwcml2YXRlIGludCBnZXRTdGFydChpbnQgaSkgewogCQlyZXR1cm4gbGluZXMuZ2V0KGkgKyAxKTsKIAl9CiAKLQlwcml2YXRlIGludCBnZXRFbmQoZmluYWwgaW50IGkpIHsKKwlwcml2YXRlIGludCBnZXRFbmQoaW50IGkpIHsKIAkJcmV0dXJuIGxpbmVzLmdldChpICsgMik7CiAJfQogCkBAIC0zMjUsNyArMzQyLDggQEAgcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKCkgewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIHRoZSBpbnB1dCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJhd1RleHQgbG9hZChPYmplY3RMb2FkZXIgbGRyLCBpbnQgdGhyZXNob2xkKSB0aHJvd3MgSU9FeGNlcHRpb24sIEJpbmFyeUJsb2JFeGNlcHRpb24geworCXB1YmxpYyBzdGF0aWMgUmF3VGV4dCBsb2FkKE9iamVjdExvYWRlciBsZHIsIGludCB0aHJlc2hvbGQpCisJCQl0aHJvd3MgSU9FeGNlcHRpb24sIEJpbmFyeUJsb2JFeGNlcHRpb24gewogCQlsb25nIHN6ID0gbGRyLmdldFNpemUoKTsKIAogCQlpZiAoc3ogPiB0aHJlc2hvbGQpIHsKQEAgLTM2OSw3ICszODcsNyBAQCBwdWJsaWMgc3RhdGljIFJhd1RleHQgbG9hZChPYmplY3RMb2FkZXIgbGRyLCBpbnQgdGhyZXNob2xkKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAKIAkJCVN5c3RlbS5hcnJheWNvcHkoaGVhZCwgMCwgZGF0YSwgMCwgaGVhZC5sZW5ndGgpOwogCQkJSU8ucmVhZEZ1bGx5KHN0cmVhbSwgZGF0YSwgb2ZmLCAoaW50KSAoc3otb2ZmKSk7Ci0JCQlyZXR1cm4gbmV3IFJhd1RleHQoZGF0YSk7CisJCQlyZXR1cm4gbmV3IFJhd1RleHQoZGF0YSwgUmF3UGFyc2VVdGlscy5saW5lTWFwT3JCaW5hcnkoZGF0YSwgMCwgKGludCkgc3opKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9SYXdUZXh0Q29tcGFyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRDb21wYXJhdG9yLmphdmEKaW5kZXggZWQyZWViYi4uMWU2OGMyZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRDb21wYXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1Jhd1RleHRDb21wYXJhdG9yLmphdmEKQEAgLTc3LDcgKzc3LDcgQEAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFJhd1RleHQgYSwgaW50IGFpLCBSYXdUZXh0IGIsIGludCBiaSkgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBpbnQgaGFzaFJlZ2lvbihmaW5hbCBieXRlW10gcmF3LCBpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CisJCXByb3RlY3RlZCBpbnQgaGFzaFJlZ2lvbihieXRlW10gcmF3LCBpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCQlpbnQgaGFzaCA9IDUzODE7CiAJCQlmb3IgKDsgcHRyIDwgZW5kOyBwdHIrKykKIAkJCQloYXNoID0gKChoYXNoIDw8IDUpICsgaGFzaCkgKyAocmF3W3B0cl0gJiAweGZmKTsKQEAgLTE2NCw3ICsxNjQsNyBAQCBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoUmF3VGV4dCBhLCBpbnQgYWksIFJhd1RleHQgYiwgaW50IGJpKSB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIGludCBoYXNoUmVnaW9uKGZpbmFsIGJ5dGVbXSByYXcsIGludCBwdHIsIGludCBlbmQpIHsKKwkJcHJvdGVjdGVkIGludCBoYXNoUmVnaW9uKGJ5dGVbXSByYXcsIGludCBwdHIsIGludCBlbmQpIHsKIAkJCWludCBoYXNoID0gNTM4MTsKIAkJCXB0ciA9IHRyaW1MZWFkaW5nV2hpdGVzcGFjZShyYXcsIHB0ciwgZW5kKTsKIAkJCWZvciAoOyBwdHIgPCBlbmQ7IHB0cisrKQpAQCAtMTk5LDcgKzE5OSw3IEBAIHB1YmxpYyBib29sZWFuIGVxdWFscyhSYXdUZXh0IGEsIGludCBhaSwgUmF3VGV4dCBiLCBpbnQgYmkpIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oZmluYWwgYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgeworCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgewogCQkJaW50IGhhc2ggPSA1MzgxOwogCQkJZW5kID0gdHJpbVRyYWlsaW5nV2hpdGVzcGFjZShyYXcsIHB0ciwgZW5kKTsKIAkJCWZvciAoOyBwdHIgPCBlbmQ7IHB0cisrKQpAQCAtMjQ0LDcgKzI0NCw3IEBAIHB1YmxpYyBib29sZWFuIGVxdWFscyhSYXdUZXh0IGEsIGludCBhaSwgUmF3VGV4dCBiLCBpbnQgYmkpIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oZmluYWwgYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgeworCQlwcm90ZWN0ZWQgaW50IGhhc2hSZWdpb24oYnl0ZVtdIHJhdywgaW50IHB0ciwgaW50IGVuZCkgewogCQkJaW50IGhhc2ggPSA1MzgxOwogCQkJZW5kID0gdHJpbVRyYWlsaW5nV2hpdGVzcGFjZShyYXcsIHB0ciwgZW5kKTsKIAkJCXdoaWxlIChwdHIgPCBlbmQpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9TaW1pbGFyaXR5SW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlmZi9TaW1pbGFyaXR5SW5kZXguamF2YQppbmRleCA4YjRkMmVjLi41ODk3ZmZiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpZmYvU2ltaWxhcml0eUluZGV4LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaWZmL1NpbWlsYXJpdHlJbmRleC5qYXZhCkBAIC0xNDcsMjMgKzE0NywxNyBAQCB2b2lkIGhhc2goT2JqZWN0TG9hZGVyIG9iaikgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uLAogCiAJcHJpdmF0ZSB2b2lkIGhhc2hMYXJnZU9iamVjdChPYmplY3RMb2FkZXIgb2JqKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlUYWJsZUZ1bGxFeGNlcHRpb24gewotCQlPYmplY3RTdHJlYW0gaW4xID0gb2JqLm9wZW5TdHJlYW0oKTsKIAkJYm9vbGVhbiB0ZXh0OwotCQl0cnkgeworCQl0cnkgKE9iamVjdFN0cmVhbSBpbjEgPSBvYmoub3BlblN0cmVhbSgpKSB7CiAJCQl0ZXh0ID0gIVJhd1RleHQuaXNCaW5hcnkoaW4xKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWluMS5jbG9zZSgpOwogCQl9CiAKLQkJT2JqZWN0U3RyZWFtIGluMiA9IG9iai5vcGVuU3RyZWFtKCk7Ci0JCXRyeSB7CisJCXRyeSAoT2JqZWN0U3RyZWFtIGluMiA9IG9iai5vcGVuU3RyZWFtKCkpIHsKIAkJCWhhc2goaW4yLCBpbjIuZ2V0U2l6ZSgpLCB0ZXh0KTsKLQkJfSBmaW5hbGx5IHsKLQkJCWluMi5jbG9zZSgpOwogCQl9CiAJfQogCi0Jdm9pZCBoYXNoKGJ5dGVbXSByYXcsIGludCBwdHIsIGZpbmFsIGludCBlbmQpIHRocm93cyBUYWJsZUZ1bGxFeGNlcHRpb24geworCXZvaWQgaGFzaChieXRlW10gcmF3LCBpbnQgcHRyLCBpbnQgZW5kKSB0aHJvd3MgVGFibGVGdWxsRXhjZXB0aW9uIHsKIAkJZmluYWwgYm9vbGVhbiB0ZXh0ID0gIVJhd1RleHQuaXNCaW5hcnkocmF3KTsKIAkJaGFzaGVkQ250ID0gMDsKIAkJd2hpbGUgKHB0ciA8IGVuZCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9CYXNlRGlyQ2FjaGVFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvQmFzZURpckNhY2hlRWRpdG9yLmphdmEKaW5kZXggMDIyOGY0ZC4uYWEyMjlmNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9CYXNlRGlyQ2FjaGVFZGl0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0Jhc2VEaXJDYWNoZUVkaXRvci5qYXZhCkBAIC04NSw3ICs4NSw3IEBAIGFic3RyYWN0IGNsYXNzIEJhc2VEaXJDYWNoZUVkaXRvciB7CiAJICogICAgICAgICAgICBlc3RpbWF0ZWQgbnVtYmVyIG9mIGVudHJpZXMgdGhlIGVkaXRvciB3aWxsIGhhdmUgdXBvbgogCSAqICAgICAgICAgICAgY29tcGxldGlvbi4gVGhpcyBzaXplcyB0aGUgaW5pdGlhbCBlbnRyeSB0YWJsZS4KIAkgKi8KLQlwcm90ZWN0ZWQgQmFzZURpckNhY2hlRWRpdG9yKGZpbmFsIERpckNhY2hlIGRjLCBmaW5hbCBpbnQgZWNudCkgeworCXByb3RlY3RlZCBCYXNlRGlyQ2FjaGVFZGl0b3IoRGlyQ2FjaGUgZGMsIGludCBlY250KSB7CiAJCWNhY2hlID0gZGM7CiAJCWVudHJpZXMgPSBuZXcgRGlyQ2FjaGVFbnRyeVtlY250XTsKIAl9CkBAIC0xMTEsNyArMTExLDcgQEAgcHVibGljIERpckNhY2hlIGdldERpckNhY2hlKCkgewogCSAqIEBwYXJhbSBuZXdFbnRyeQogCSAqICAgICAgICAgICAgdGhlIG5ldyBlbnRyeSB0byBhZGQuCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZmFzdEFkZChmaW5hbCBEaXJDYWNoZUVudHJ5IG5ld0VudHJ5KSB7CisJcHJvdGVjdGVkIHZvaWQgZmFzdEFkZChEaXJDYWNoZUVudHJ5IG5ld0VudHJ5KSB7CiAJCWlmIChlbnRyaWVzLmxlbmd0aCA9PSBlbnRyeUNudCkgewogCQkJZmluYWwgRGlyQ2FjaGVFbnRyeVtdIG4gPSBuZXcgRGlyQ2FjaGVFbnRyeVsoZW50cnlDbnQgKyAxNikgKiAzIC8gMl07CiAJCQlTeXN0ZW0uYXJyYXljb3B5KGVudHJpZXMsIDAsIG4sIDAsIGVudHJ5Q250KTsKQEAgLTE0MCw3ICsxNDAsNyBAQCBwcm90ZWN0ZWQgdm9pZCBmYXN0QWRkKGZpbmFsIERpckNhY2hlRW50cnkgbmV3RW50cnkpIHsKIAkgKiBAcGFyYW0gY250CiAJICogICAgICAgICAgICBudW1iZXIgb2YgZW50cmllcyB0byBjb3B5LgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGZhc3RLZWVwKGZpbmFsIGludCBwb3MsIGludCBjbnQpIHsKKwlwcm90ZWN0ZWQgdm9pZCBmYXN0S2VlcChpbnQgcG9zLCBpbnQgY250KSB7CiAJCWlmIChlbnRyeUNudCArIGNudCA+IGVudHJpZXMubGVuZ3RoKSB7CiAJCQlmaW5hbCBpbnQgbTEgPSAoZW50cnlDbnQgKyAxNikgKiAzIC8gMjsKIAkJCWZpbmFsIGludCBtMiA9IGVudHJ5Q250ICsgY250OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZS5qYXZhCmluZGV4IGNjNDMxZGIuLjE0NjUzZmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlLmphdmEKQEAgLTQ1LDE2ICs0NSwxNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGU7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLklTT184ODU5XzE7CisKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkRpZ2VzdE91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC04Nyw2ICs4Nyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLk11dGFibGVJbnRlZ2VyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5OQjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuVGVtcG9yYXJ5QnVmZmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5TaWxlbnRGaWxlSW5wdXRTdHJlYW07CiAKIC8qKgogICogU3VwcG9ydCBmb3IgdGhlIEdpdCBkaXJjYWNoZSAoYWthIGluZGV4IGZpbGUpLgpAQCAtMTEyLDcgKzExMyw3IEBAIHB1YmxpYyBjbGFzcyBEaXJDYWNoZSB7CiAKIAlzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxEaXJDYWNoZUVudHJ5PiBFTlRfQ01QID0gbmV3IENvbXBhcmF0b3I8RGlyQ2FjaGVFbnRyeT4oKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgRGlyQ2FjaGVFbnRyeSBvMSwgZmluYWwgRGlyQ2FjaGVFbnRyeSBvMikgeworCQlwdWJsaWMgaW50IGNvbXBhcmUoRGlyQ2FjaGVFbnRyeSBvMSwgRGlyQ2FjaGVFbnRyeSBvMikgewogCQkJZmluYWwgaW50IGNyID0gY21wKG8xLCBvMik7CiAJCQlpZiAoY3IgIT0gMCkKIAkJCQlyZXR1cm4gY3I7CkBAIC0xMjAsMTEgKzEyMSwxMSBAQCBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgRGlyQ2FjaGVFbnRyeSBvMSwgZmluYWwgRGlyQ2FjaGVFbnRyeSBvMikgewogCQl9CiAJfTsKIAotCXN0YXRpYyBpbnQgY21wKGZpbmFsIERpckNhY2hlRW50cnkgYSwgZmluYWwgRGlyQ2FjaGVFbnRyeSBiKSB7CisJc3RhdGljIGludCBjbXAoRGlyQ2FjaGVFbnRyeSBhLCBEaXJDYWNoZUVudHJ5IGIpIHsKIAkJcmV0dXJuIGNtcChhLnBhdGgsIGEucGF0aC5sZW5ndGgsIGIpOwogCX0KIAotCXN0YXRpYyBpbnQgY21wKGZpbmFsIGJ5dGVbXSBhUGF0aCwgZmluYWwgaW50IGFMZW4sIGZpbmFsIERpckNhY2hlRW50cnkgYikgeworCXN0YXRpYyBpbnQgY21wKGJ5dGVbXSBhUGF0aCwgaW50IGFMZW4sIERpckNhY2hlRW50cnkgYikgewogCQlyZXR1cm4gY21wKGFQYXRoLCBhTGVuLCBiLnBhdGgsIGIucGF0aC5sZW5ndGgpOwogCX0KIApAQCAtMTg4LDcgKzE4OSw3IEBAIHB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgcmVhZChPYmplY3RSZWFkZXIgcmVhZGVyLCBBbnlPYmplY3RJZCB0cmVlSWQpCiAJICogICAgICAgICAgICAgdGhlIGluZGV4IGZpbGUgaXMgdXNpbmcgYSBmb3JtYXQgb3IgZXh0ZW5zaW9uIHRoYXQgdGhpcwogCSAqICAgICAgICAgICAgIGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIERpckNhY2hlIHJlYWQoZmluYWwgUmVwb3NpdG9yeSByZXBvc2l0b3J5KQorCXB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgcmVhZChSZXBvc2l0b3J5IHJlcG9zaXRvcnkpCiAJCQl0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlmaW5hbCBEaXJDYWNoZSBjID0gcmVhZChyZXBvc2l0b3J5LmdldEluZGV4RmlsZSgpLCByZXBvc2l0b3J5LmdldEZTKCkpOwogCQljLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5OwpAQCAtMjE1LDcgKzIxNiw3IEBAIHB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgcmVhZChmaW5hbCBSZXBvc2l0b3J5IHJlcG9zaXRvcnkpCiAJICogICAgICAgICAgICAgdGhlIGluZGV4IGZpbGUgaXMgdXNpbmcgYSBmb3JtYXQgb3IgZXh0ZW5zaW9uIHRoYXQgdGhpcwogCSAqICAgICAgICAgICAgIGxpYnJhcnkgZG9lcyBub3Qgc3VwcG9ydC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIERpckNhY2hlIHJlYWQoZmluYWwgRmlsZSBpbmRleExvY2F0aW9uLCBmaW5hbCBGUyBmcykKKwlwdWJsaWMgc3RhdGljIERpckNhY2hlIHJlYWQoRmlsZSBpbmRleExvY2F0aW9uLCBGUyBmcykKIAkJCXRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIERpckNhY2hlIGMgPSBuZXcgRGlyQ2FjaGUoaW5kZXhMb2NhdGlvbiwgZnMpOwogCQljLnJlYWQoKTsKQEAgLTI0NCw3ICsyNDUsNyBAQCBwdWJsaWMgc3RhdGljIERpckNhY2hlIHJlYWQoZmluYWwgRmlsZSBpbmRleExvY2F0aW9uLCBmaW5hbCBGUyBmcykKIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggZmlsZSBpcyB1c2luZyBhIGZvcm1hdCBvciBleHRlbnNpb24gdGhhdCB0aGlzCiAJICogICAgICAgICAgICAgbGlicmFyeSBkb2VzIG5vdCBzdXBwb3J0LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgbG9jayhmaW5hbCBGaWxlIGluZGV4TG9jYXRpb24sIGZpbmFsIEZTIGZzKQorCXB1YmxpYyBzdGF0aWMgRGlyQ2FjaGUgbG9jayhGaWxlIGluZGV4TG9jYXRpb24sIEZTIGZzKQogCQkJdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgRGlyQ2FjaGUgYyA9IG5ldyBEaXJDYWNoZShpbmRleExvY2F0aW9uLCBmcyk7CiAJCWlmICghYy5sb2NrKCkpCkBAIC0zNzIsNyArMzczLDcgQEAgcHVibGljIHN0YXRpYyBEaXJDYWNoZSBsb2NrKGZpbmFsIEZpbGUgaW5kZXhMb2NhdGlvbiwgZmluYWwgRlMgZnMsCiAJICogICAgICAgICAgICB0aGUgZmlsZSBzeXN0ZW0gYWJzdHJhY3Rpb24gd2hpY2ggd2lsbCBiZSBuZWNlc3NhcnkgdG8gcGVyZm9ybQogCSAqICAgICAgICAgICAgY2VydGFpbiBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZShmaW5hbCBGaWxlIGluZGV4TG9jYXRpb24sIGZpbmFsIEZTIGZzKSB7CisJcHVibGljIERpckNhY2hlKEZpbGUgaW5kZXhMb2NhdGlvbiwgRlMgZnMpIHsKIAkJbGl2ZUZpbGUgPSBpbmRleExvY2F0aW9uOwogCQljbGVhcigpOwogCX0KQEAgLTQwMyw3ICs0MDQsNyBAQCBwdWJsaWMgRGlyQ2FjaGVFZGl0b3IgZWRpdG9yKCkgewogCQlyZXR1cm4gbmV3IERpckNhY2hlRWRpdG9yKHRoaXMsIGVudHJ5Q250ICsgMTYpOwogCX0KIAotCXZvaWQgcmVwbGFjZShmaW5hbCBEaXJDYWNoZUVudHJ5W10gZSwgZmluYWwgaW50IGNudCkgeworCXZvaWQgcmVwbGFjZShEaXJDYWNoZUVudHJ5W10gZSwgaW50IGNudCkgewogCQlzb3J0ZWRFbnRyaWVzID0gZTsKIAkJZW50cnlDbnQgPSBjbnQ7CiAJCXRyZWUgPSBudWxsOwpAQCAtNDI5LDE4ICs0MzAsMTAgQEAgcHVibGljIHZvaWQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCWlmICghbGl2ZUZpbGUuZXhpc3RzKCkpCiAJCQljbGVhcigpOwogCQllbHNlIGlmIChzbmFwc2hvdCA9PSBudWxsIHx8IHNuYXBzaG90LmlzTW9kaWZpZWQobGl2ZUZpbGUpKSB7Ci0JCQl0cnkgewotCQkJCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0obGl2ZUZpbGUpOwotCQkJCXRyeSB7Ci0JCQkJCWNsZWFyKCk7Ci0JCQkJCXJlYWRGcm9tKGluU3RyZWFtKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJaW5TdHJlYW0uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyMikgewotCQkJCQkJLy8gSWdub3JlIGFueSBjbG9zZSBmYWlsdXJlcy4KLQkJCQkJfQotCQkJCX0KKwkJCXRyeSAoU2lsZW50RmlsZUlucHV0U3RyZWFtIGluU3RyZWFtID0gbmV3IFNpbGVudEZpbGVJbnB1dFN0cmVhbSgKKwkJCQkJbGl2ZUZpbGUpKSB7CisJCQkJY2xlYXIoKTsKKwkJCQlyZWFkRnJvbShpblN0cmVhbSk7CiAJCQl9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewogCQkJCWlmIChsaXZlRmlsZS5leGlzdHMoKSkgewogCQkJCQkvLyBQYW5pYzogdGhlIGluZGV4IGZpbGUgZXhpc3RzIGJ1dCB3ZSBjYW4ndCByZWFkIGl0CkBAIC00ODAsNyArNDczLDcgQEAgcHVibGljIHZvaWQgY2xlYXIoKSB7CiAJCXJlYWRJbmRleENoZWNrc3VtID0gTk9fQ0hFQ0tTVU07CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlYWRGcm9tKGZpbmFsIElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJcHJpdmF0ZSB2b2lkIHJlYWRGcm9tKElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJZmluYWwgQnVmZmVyZWRJbnB1dFN0cmVhbSBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGluU3RyZWFtKTsKIAkJZmluYWwgTWVzc2FnZURpZ2VzdCBtZCA9IENvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCk7CkBAIC01ODgsMTIgKzU4MSwxMSBAQCBwcml2YXRlIHZvaWQgc2tpcE9wdGlvbmFsRXh0ZW5zaW9uKGZpbmFsIElucHV0U3RyZWFtIGluLAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdEV4dGVuc2lvbk5hbWUoZmluYWwgYnl0ZVtdIGhkcikKLQkJCXRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQkJcmV0dXJuICInIiArIG5ldyBTdHJpbmcoaGRyLCAwLCA0LCAiSVNPLTg4NTktMSIpICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAorCXByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRFeHRlbnNpb25OYW1lKGJ5dGVbXSBoZHIpIHsKKwkJcmV0dXJuICInIiArIG5ldyBTdHJpbmcoaGRyLCAwLCA0LCBJU09fODg1OV8xKSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc19ESVJDKGZpbmFsIGJ5dGVbXSBoZHIpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzX0RJUkMoYnl0ZVtdIGhkcikgewogCQlpZiAoaGRyLmxlbmd0aCA8IFNJR19ESVJDLmxlbmd0aCkKIAkJCXJldHVybiBmYWxzZTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBTSUdfRElSQy5sZW5ndGg7IGkrKykKQEAgLTY1Niw3ICs2NDgsNyBAQCBwdWJsaWMgdm9pZCB3cml0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQl2b2lkIHdyaXRlVG8oRmlsZSBkaXIsIGZpbmFsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIHdyaXRlVG8oRmlsZSBkaXIsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgTWVzc2FnZURpZ2VzdCBmb290ID0gQ29uc3RhbnRzLm5ld01lc3NhZ2VEaWdlc3QoKTsKIAkJZmluYWwgRGlnZXN0T3V0cHV0U3RyZWFtIGRvcyA9IG5ldyBEaWdlc3RPdXRwdXRTdHJlYW0ob3MsIGZvb3QpOwogCkBAIC03MTAsNiArNzAyLDggQEAgdm9pZCB3cml0ZVRvKEZpbGUgZGlyLCBmaW5hbCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAogCQlpZiAod3JpdGVUcmVlKSB7CisJCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBFeHBsaWNpdGx5IGNsb3NlZCBpbiB0cnkgYmxvY2ssIGFuZAorCQkJCQkJCQkJCQkvLyBkZXN0cm95ZWQgaW4gZmluYWxseQogCQkJVGVtcG9yYXJ5QnVmZmVyIGJiID0gbmV3IFRlbXBvcmFyeUJ1ZmZlci5Mb2NhbEZpbGUoZGlyLCA1IDw8IDIwKTsKIAkJCXRyeSB7CiAJCQkJdHJlZS53cml0ZSh0bXAsIGJiKTsKQEAgLTc0MywxNiArNzM3LDE4IEBAIHB1YmxpYyBib29sZWFuIGNvbW1pdCgpIHsKIAkJZmluYWwgTG9ja0ZpbGUgdG1wID0gbXlMb2NrOwogCQlyZXF1aXJlTG9ja2VkKHRtcCk7CiAJCW15TG9jayA9IG51bGw7Ci0JCWlmICghdG1wLmNvbW1pdCgpKQorCQlpZiAoIXRtcC5jb21taXQoKSkgewogCQkJcmV0dXJuIGZhbHNlOworCQl9CiAJCXNuYXBzaG90ID0gdG1wLmdldENvbW1pdFNuYXBzaG90KCk7CiAJCWlmIChpbmRleENoYW5nZWRMaXN0ZW5lciAhPSBudWxsCi0JCQkJJiYgIUFycmF5cy5lcXVhbHMocmVhZEluZGV4Q2hlY2tzdW0sIHdyaXRlSW5kZXhDaGVja3N1bSkpCi0JCQlpbmRleENoYW5nZWRMaXN0ZW5lci5vbkluZGV4Q2hhbmdlZChuZXcgSW5kZXhDaGFuZ2VkRXZlbnQoKSk7CisJCQkJJiYgIUFycmF5cy5lcXVhbHMocmVhZEluZGV4Q2hlY2tzdW0sIHdyaXRlSW5kZXhDaGVja3N1bSkpIHsKKwkJCWluZGV4Q2hhbmdlZExpc3RlbmVyLm9uSW5kZXhDaGFuZ2VkKG5ldyBJbmRleENoYW5nZWRFdmVudCh0cnVlKSk7CisJCX0KIAkJcmV0dXJuIHRydWU7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlcXVpcmVMb2NrZWQoZmluYWwgTG9ja0ZpbGUgdG1wKSB7CisJcHJpdmF0ZSB2b2lkIHJlcXVpcmVMb2NrZWQoTG9ja0ZpbGUgdG1wKSB7CiAJCWlmIChsaXZlRmlsZSA9PSBudWxsKQogCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5kaXJDYWNoZUlzTm90TG9ja2VkKTsKIAkJaWYgKHRtcCA9PSBudWxsKQpAQCAtNzgzLDcgKzc3OSw3IEBAIHB1YmxpYyB2b2lkIHVubG9jaygpIHsKIAkgKiAgICAgICAgIHRoZSBpbmRleDsgcGFzcyB0byB7QGxpbmsgI2dldEVudHJ5KGludCl9IHRvIG9idGFpbiB0aGUgZW50cnkKIAkgKiAgICAgICAgIGluZm9ybWF0aW9uLiBJZiAmbHQ7IDAgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBpbmRleC4KIAkgKi8KLQlwdWJsaWMgaW50IGZpbmRFbnRyeShmaW5hbCBTdHJpbmcgcGF0aCkgeworCXB1YmxpYyBpbnQgZmluZEVudHJ5KFN0cmluZyBwYXRoKSB7CiAJCWZpbmFsIGJ5dGVbXSBwID0gQ29uc3RhbnRzLmVuY29kZShwYXRoKTsKIAkJcmV0dXJuIGZpbmRFbnRyeShwLCBwLmxlbmd0aCk7CiAJfQpAQCAtODM5LDcgKzgzNSw3IEBAIGVsc2UgaWYgKGNtcCA9PSAwKSB7CiAJICogICAgICAgICAgICBlbnRyeSBwb3NpdGlvbiBvZiB0aGUgcGF0aCB0aGF0IHNob3VsZCBiZSBza2lwcGVkLgogCSAqIEByZXR1cm4gcG9zaXRpb24gb2YgdGhlIG5leHQgZW50cnkgd2hvc2UgcGF0aCBpcyBhZnRlciB0aGUgaW5wdXQuCiAJICovCi0JcHVibGljIGludCBuZXh0RW50cnkoZmluYWwgaW50IHBvc2l0aW9uKSB7CisJcHVibGljIGludCBuZXh0RW50cnkoaW50IHBvc2l0aW9uKSB7CiAJCURpckNhY2hlRW50cnkgbGFzdCA9IHNvcnRlZEVudHJpZXNbcG9zaXRpb25dOwogCQlpbnQgbmV4dElkeCA9IHBvc2l0aW9uICsgMTsKIAkJd2hpbGUgKG5leHRJZHggPCBlbnRyeUNudCkgewpAQCAtODUyLDcgKzg0OCw3IEBAIHB1YmxpYyBpbnQgbmV4dEVudHJ5KGZpbmFsIGludCBwb3NpdGlvbikgewogCQlyZXR1cm4gbmV4dElkeDsKIAl9CiAKLQlpbnQgbmV4dEVudHJ5KGZpbmFsIGJ5dGVbXSBwLCBmaW5hbCBpbnQgcExlbiwgaW50IG5leHRJZHgpIHsKKwlpbnQgbmV4dEVudHJ5KGJ5dGVbXSBwLCBpbnQgcExlbiwgaW50IG5leHRJZHgpIHsKIAkJd2hpbGUgKG5leHRJZHggPCBlbnRyeUNudCkgewogCQkJZmluYWwgRGlyQ2FjaGVFbnRyeSBuZXh0ID0gc29ydGVkRW50cmllc1tuZXh0SWR4XTsKIAkJCWlmICghRGlyQ2FjaGVUcmVlLnBlcShwLCBuZXh0LnBhdGgsIHBMZW4pKQpAQCAtODg2LDcgKzg4Miw3IEBAIHB1YmxpYyBpbnQgZ2V0RW50cnlDb3VudCgpIHsKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIG9mIHRoZSBlbnRyeSB0byBnZXQuCiAJICogQHJldHVybiB0aGUgZW50cnkgYXQgcG9zaXRpb24gPGNvZGU+aTwvY29kZT4uCiAJICovCi0JcHVibGljIERpckNhY2hlRW50cnkgZ2V0RW50cnkoZmluYWwgaW50IGkpIHsKKwlwdWJsaWMgRGlyQ2FjaGVFbnRyeSBnZXRFbnRyeShpbnQgaSkgewogCQlyZXR1cm4gc29ydGVkRW50cmllc1tpXTsKIAl9CiAKQEAgLTg5Nyw3ICs4OTMsNyBAQCBwdWJsaWMgRGlyQ2FjaGVFbnRyeSBnZXRFbnRyeShmaW5hbCBpbnQgaSkgewogCSAqICAgICAgICAgICAgdGhlIHBhdGggdG8gc2VhcmNoIGZvci4KIAkgKiBAcmV0dXJuIHRoZSBlbnRyeSBmb3IgdGhlIGdpdmVuIDxjb2RlPnBhdGg8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZUVudHJ5IGdldEVudHJ5KGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIERpckNhY2hlRW50cnkgZ2V0RW50cnkoU3RyaW5nIHBhdGgpIHsKIAkJZmluYWwgaW50IGkgPSBmaW5kRW50cnkocGF0aCk7CiAJCXJldHVybiBpIDwgMCA/IG51bGwgOiBzb3J0ZWRFbnRyaWVzW2ldOwogCX0KQEAgLTk0Niw3ICs5NDIsNyBAQCB2b2lkIHRvQXJyYXkoZmluYWwgaW50IGksIGZpbmFsIERpckNhY2hlRW50cnlbXSBkc3QsIGZpbmFsIGludCBvZmYsCiAJICogQHJldHVybiB0aGUgY2FjaGUgdHJlZTsgbnVsbCBpZiB0aGVyZSBpcyBubyBjdXJyZW50IGNhY2hlIHRyZWUgYXZhaWxhYmxlCiAJICogICAgICAgICBhbmQgPGNvZGU+YnVpbGQ8L2NvZGU+IHdhcyBmYWxzZS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVUcmVlIGdldENhY2hlVHJlZShmaW5hbCBib29sZWFuIGJ1aWxkKSB7CisJcHVibGljIERpckNhY2hlVHJlZSBnZXRDYWNoZVRyZWUoYm9vbGVhbiBidWlsZCkgewogCQlpZiAoYnVpbGQpIHsKIAkJCWlmICh0cmVlID09IG51bGwpCiAJCQkJdHJlZSA9IG5ldyBEaXJDYWNoZVRyZWUoKTsKQEAgLTk3Miw3ICs5NjgsNyBAQCBwdWJsaWMgRGlyQ2FjaGVUcmVlIGdldENhY2hlVHJlZShmaW5hbCBib29sZWFuIGJ1aWxkKSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3cml0aW5nIHRvIHRoZSBvYmplY3Qgc3RvcmUuCiAJICovCi0JcHVibGljIE9iamVjdElkIHdyaXRlVHJlZShmaW5hbCBPYmplY3RJbnNlcnRlciBvdykKKwlwdWJsaWMgT2JqZWN0SWQgd3JpdGVUcmVlKE9iamVjdEluc2VydGVyIG93KQogCQkJdGhyb3dzIFVubWVyZ2VkUGF0aEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gZ2V0Q2FjaGVUcmVlKHRydWUpLndyaXRlVHJlZShzb3J0ZWRFbnRyaWVzLCAwLCAwLCBvdyk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZEl0ZXJhdG9yLmphdmEKaW5kZXggNmUzNjgyYS4uZTgwNTQ0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkSXRlcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRJdGVyYXRvci5qYXZhCkBAIC05Niw3ICs5Niw3IEBAIHB1YmxpYyBjbGFzcyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IgZXh0ZW5kcyBEaXJDYWNoZUl0ZXJhdG9yIHsKIAkgKiAgICAgICAgICAgIHRoZSBjYWNoZSBidWlsZGVyIGZvciB0aGUgY2FjaGUgdG8gd2Fsay4gVGhlIGNhY2hlIG11c3QgYmUKIAkgKiAgICAgICAgICAgIGFscmVhZHkgbG9hZGVkIGludG8gbWVtb3J5LgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IoZmluYWwgRGlyQ2FjaGVCdWlsZGVyIGRjYikgeworCXB1YmxpYyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IoRGlyQ2FjaGVCdWlsZGVyIGRjYikgewogCQlzdXBlcihkY2IuZ2V0RGlyQ2FjaGUoKSk7CiAJCWJ1aWxkZXIgPSBkY2I7CiAJfQpAQCAtMTA5LDcgKzEwOSw3IEBAIHB1YmxpYyBEaXJDYWNoZUJ1aWxkSXRlcmF0b3IoZmluYWwgRGlyQ2FjaGVCdWlsZGVyIGRjYikgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpCisJcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKGN1cnJlbnRTdWJ0cmVlID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbihnZXRFbnRyeU9iamVjdElkKCksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUJ1aWxkZXIuamF2YQppbmRleCAyZmY3YmI5Li5jNWZmOWFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlQnVpbGRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVCdWlsZGVyLmphdmEKQEAgLTgzLDcgKzgzLDcgQEAgcHVibGljIGNsYXNzIERpckNhY2hlQnVpbGRlciBleHRlbmRzIEJhc2VEaXJDYWNoZUVkaXRvciB7CiAJICogICAgICAgICAgICBlc3RpbWF0ZWQgbnVtYmVyIG9mIGVudHJpZXMgdGhlIGJ1aWxkZXIgd2lsbCBoYXZlIHVwb24KIAkgKiAgICAgICAgICAgIGNvbXBsZXRpb24uIFRoaXMgc2l6ZXMgdGhlIGluaXRpYWwgZW50cnkgdGFibGUuCiAJICovCi0JcHJvdGVjdGVkIERpckNhY2hlQnVpbGRlcihmaW5hbCBEaXJDYWNoZSBkYywgZmluYWwgaW50IGVjbnQpIHsKKwlwcm90ZWN0ZWQgRGlyQ2FjaGVCdWlsZGVyKERpckNhY2hlIGRjLCBpbnQgZWNudCkgewogCQlzdXBlcihkYywgZWNudCk7CiAJfQogCkBAIC0xMDIsNyArMTAyLDcgQEAgcHJvdGVjdGVkIERpckNhY2hlQnVpbGRlcihmaW5hbCBEaXJDYWNoZSBkYywgZmluYWwgaW50IGVjbnQpIHsKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBJZiB0aGUgRmlsZU1vZGUgb2YgdGhlIGVudHJ5IHdhcyBub3Qgc2V0IGJ5IHRoZSBjYWxsZXIuCiAJICovCi0JcHVibGljIHZvaWQgYWRkKGZpbmFsIERpckNhY2hlRW50cnkgbmV3RW50cnkpIHsKKwlwdWJsaWMgdm9pZCBhZGQoRGlyQ2FjaGVFbnRyeSBuZXdFbnRyeSkgewogCQlpZiAobmV3RW50cnkuZ2V0UmF3TW9kZSgpID09IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS5maWxlTW9kZU5vdFNldEZvclBhdGgsCkBAIC0xMzEsNyArMTMxLDcgQEAgcHVibGljIHZvaWQgYWRkKGZpbmFsIERpckNhY2hlRW50cnkgbmV3RW50cnkpIHsKIAkgKiBAcGFyYW0gY250CiAJICogICAgICAgICAgICBudW1iZXIgb2YgZW50cmllcyB0byBjb3B5LgogCSAqLwotCXB1YmxpYyB2b2lkIGtlZXAoZmluYWwgaW50IHBvcywgaW50IGNudCkgeworCXB1YmxpYyB2b2lkIGtlZXAoaW50IHBvcywgaW50IGNudCkgewogCQliZWZvcmVBZGQoY2FjaGUuZ2V0RW50cnkocG9zKSk7CiAJCWZhc3RLZWVwKHBvcywgY250KTsKIAl9CkBAIC0yMjcsNyArMjI3LDcgQEAgcHVibGljIHZvaWQgZmluaXNoKCkgewogCQlyZXBsYWNlKCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGJlZm9yZUFkZChmaW5hbCBEaXJDYWNoZUVudHJ5IG5ld0VudHJ5KSB7CisJcHJpdmF0ZSB2b2lkIGJlZm9yZUFkZChEaXJDYWNoZUVudHJ5IG5ld0VudHJ5KSB7CiAJCWlmIChzb3J0ZWQgJiYgZW50cnlDbnQgPiAwKSB7CiAJCQlmaW5hbCBEaXJDYWNoZUVudHJ5IGxhc3RFbnRyeSA9IGVudHJpZXNbZW50cnlDbnQgLSAxXTsKIAkJCWZpbmFsIGludCBjciA9IERpckNhY2hlLmNtcChsYXN0RW50cnksIG5ld0VudHJ5KTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFZGl0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFZGl0b3IuamF2YQppbmRleCAzMGUzYTNjLi43NGJhOTdmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlRWRpdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVkaXRvci5qYXZhCkBAIC03Nyw3ICs3Nyw3IEBACiBwdWJsaWMgY2xhc3MgRGlyQ2FjaGVFZGl0b3IgZXh0ZW5kcyBCYXNlRGlyQ2FjaGVFZGl0b3IgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8UGF0aEVkaXQ+IEVESVRfQ01QID0gbmV3IENvbXBhcmF0b3I8UGF0aEVkaXQ+KCkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBjb21wYXJlKGZpbmFsIFBhdGhFZGl0IG8xLCBmaW5hbCBQYXRoRWRpdCBvMikgeworCQlwdWJsaWMgaW50IGNvbXBhcmUoUGF0aEVkaXQgbzEsIFBhdGhFZGl0IG8yKSB7CiAJCQlmaW5hbCBieXRlW10gYSA9IG8xLnBhdGg7CiAJCQlmaW5hbCBieXRlW10gYiA9IG8yLnBhdGg7CiAJCQlyZXR1cm4gY21wKGEsIGEubGVuZ3RoLCBiLCBiLmxlbmd0aCk7CkBAIC05Niw3ICs5Niw3IEBAIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBQYXRoRWRpdCBvMSwgZmluYWwgUGF0aEVkaXQgbzIpIHsKIAkgKiAgICAgICAgICAgIGVzdGltYXRlZCBudW1iZXIgb2YgZW50cmllcyB0aGUgZWRpdG9yIHdpbGwgaGF2ZSB1cG9uCiAJICogICAgICAgICAgICBjb21wbGV0aW9uLiBUaGlzIHNpemVzIHRoZSBpbml0aWFsIGVudHJ5IHRhYmxlLgogCSAqLwotCXByb3RlY3RlZCBEaXJDYWNoZUVkaXRvcihmaW5hbCBEaXJDYWNoZSBkYywgZmluYWwgaW50IGVjbnQpIHsKKwlwcm90ZWN0ZWQgRGlyQ2FjaGVFZGl0b3IoRGlyQ2FjaGUgZGMsIGludCBlY250KSB7CiAJCXN1cGVyKGRjLCBlY250KTsKIAkJZWRpdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAl9CkBAIC0xMTEsNyArMTExLDcgQEAgcHJvdGVjdGVkIERpckNhY2hlRWRpdG9yKGZpbmFsIERpckNhY2hlIGRjLCBmaW5hbCBpbnQgZWNudCkgewogCSAqIEBwYXJhbSBlZGl0CiAJICogICAgICAgICAgICBhbm90aGVyIGVkaXQgY29tbWFuZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgUGF0aEVkaXQgZWRpdCkgeworCXB1YmxpYyB2b2lkIGFkZChQYXRoRWRpdCBlZGl0KSB7CiAJCWVkaXRzLmFkZChlZGl0KTsKIAl9CiAKQEAgLTMwNCw3ICszMDQsNyBAQCBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFBhdGhFZGl0IHsKIAkJICogQHBhcmFtIGVudHJ5UGF0aAogCQkgKiAgICAgICAgICAgIHBhdGggb2YgdGhlIGZpbGUgd2l0aGluIHRoZSByZXBvc2l0b3J5LgogCQkgKi8KLQkJcHVibGljIFBhdGhFZGl0KGZpbmFsIFN0cmluZyBlbnRyeVBhdGgpIHsKKwkJcHVibGljIFBhdGhFZGl0KFN0cmluZyBlbnRyeVBhdGgpIHsKIAkJCXBhdGggPSBDb25zdGFudHMuZW5jb2RlKGVudHJ5UGF0aCk7CiAJCX0KIApAQCAtMzE5LDcgKzMxOSw3IEBAIHB1YmxpYyBQYXRoRWRpdChmaW5hbCBTdHJpbmcgZW50cnlQYXRoKSB7CiAJCSAqICAgICAgICAgICAgZW50cnkgaW5zdGFuY2UgdG8gbWF0Y2ggcGF0aCBvZi4gT25seSB0aGUgcGF0aCBvZiB0aGlzCiAJCSAqICAgICAgICAgICAgZW50cnkgaXMgYWN0dWFsbHkgY29uc2lkZXJlZCBkdXJpbmcgY29tbWFuZCBldmFsdWF0aW9uLgogCQkgKi8KLQkJcHVibGljIFBhdGhFZGl0KGZpbmFsIERpckNhY2hlRW50cnkgZW50KSB7CisJCXB1YmxpYyBQYXRoRWRpdChEaXJDYWNoZUVudHJ5IGVudCkgewogCQkJcGF0aCA9IGVudC5wYXRoOwogCQl9CiAKQEAgLTM3NCw3ICszNzQsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIERlbGV0ZVBhdGggZXh0ZW5kcyBQYXRoRWRpdCB7CiAJCSAqIEBwYXJhbSBlbnRyeVBhdGgKIAkJICogICAgICAgICAgICBwYXRoIG9mIHRoZSBmaWxlIHdpdGhpbiB0aGUgcmVwb3NpdG9yeS4KIAkJICovCi0JCXB1YmxpYyBEZWxldGVQYXRoKGZpbmFsIFN0cmluZyBlbnRyeVBhdGgpIHsKKwkJcHVibGljIERlbGV0ZVBhdGgoU3RyaW5nIGVudHJ5UGF0aCkgewogCQkJc3VwZXIoZW50cnlQYXRoKTsKIAkJfQogCkBAIC0zODUsMTIgKzM4NSwxMiBAQCBwdWJsaWMgRGVsZXRlUGF0aChmaW5hbCBTdHJpbmcgZW50cnlQYXRoKSB7CiAJCSAqICAgICAgICAgICAgZW50cnkgaW5zdGFuY2UgdG8gcmVtb3ZlLiBPbmx5IHRoZSBwYXRoIG9mIHRoaXMgZW50cnkgaXMKIAkJICogICAgICAgICAgICBhY3R1YWxseSBjb25zaWRlcmVkIGR1cmluZyBjb21tYW5kIGV2YWx1YXRpb24uCiAJCSAqLwotCQlwdWJsaWMgRGVsZXRlUGF0aChmaW5hbCBEaXJDYWNoZUVudHJ5IGVudCkgeworCQlwdWJsaWMgRGVsZXRlUGF0aChEaXJDYWNoZUVudHJ5IGVudCkgewogCQkJc3VwZXIoZW50KTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBhcHBseShmaW5hbCBEaXJDYWNoZUVudHJ5IGVudCkgeworCQlwdWJsaWMgdm9pZCBhcHBseShEaXJDYWNoZUVudHJ5IGVudCkgewogCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLm5vQXBwbHlJbkRlbGV0ZSk7CiAJCX0KIAl9CkBAIC00NDAsNyArNDQwLDcgQEAgcHVibGljIERlbGV0ZVRyZWUoU3RyaW5nIGVudHJ5UGF0aCkgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIGFwcGx5KGZpbmFsIERpckNhY2hlRW50cnkgZW50KSB7CisJCXB1YmxpYyB2b2lkIGFwcGx5KERpckNhY2hlRW50cnkgZW50KSB7CiAJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkubm9BcHBseUluRGVsZXRlKTsKIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVFbnRyeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVudHJ5LmphdmEKaW5kZXggN2MwM2M2NC4uZmVlOWY1MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVudHJ5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZUVudHJ5LmphdmEKQEAgLTIyNyw3ICsyMjcsNyBAQCBwdWJsaWMgY2xhc3MgRGlyQ2FjaGVFbnRyeSB7CiAJICogICAgICAgICAgICAgIlwwIi4gVGhlc2Ugc2VxdWVuY2VzIGFyZSBub3QgcGVybWl0dGVkIGluIGEgZ2l0IHRyZWUgb2JqZWN0CiAJICogICAgICAgICAgICAgb3IgRGlyQ2FjaGUgZmlsZS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVFbnRyeShmaW5hbCBTdHJpbmcgbmV3UGF0aCkgeworCXB1YmxpYyBEaXJDYWNoZUVudHJ5KFN0cmluZyBuZXdQYXRoKSB7CiAJCXRoaXMoQ29uc3RhbnRzLmVuY29kZShuZXdQYXRoKSwgU1RBR0VfMCk7CiAJfQogCkBAIC0yNDQsNyArMjQ0LDcgQEAgcHVibGljIERpckNhY2hlRW50cnkoZmluYWwgU3RyaW5nIG5ld1BhdGgpIHsKIAkgKiAgICAgICAgICAgICBvciBEaXJDYWNoZSBmaWxlLiAgT3IgaWYge0Bjb2RlIHN0YWdlfSBpcyBvdXRzaWRlIG9mIHRoZQogCSAqICAgICAgICAgICAgIHJhbmdlIDAuLjMsIGluY2x1c2l2ZS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVFbnRyeShmaW5hbCBTdHJpbmcgbmV3UGF0aCwgZmluYWwgaW50IHN0YWdlKSB7CisJcHVibGljIERpckNhY2hlRW50cnkoU3RyaW5nIG5ld1BhdGgsIGludCBzdGFnZSkgewogCQl0aGlzKENvbnN0YW50cy5lbmNvZGUobmV3UGF0aCksIHN0YWdlKTsKIAl9CiAKQEAgLTI1OCw3ICsyNTgsNyBAQCBwdWJsaWMgRGlyQ2FjaGVFbnRyeShmaW5hbCBTdHJpbmcgbmV3UGF0aCwgZmluYWwgaW50IHN0YWdlKSB7CiAJICogICAgICAgICAgICAgIlwwIi4gVGhlc2Ugc2VxdWVuY2VzIGFyZSBub3QgcGVybWl0dGVkIGluIGEgZ2l0IHRyZWUgb2JqZWN0CiAJICogICAgICAgICAgICAgb3IgRGlyQ2FjaGUgZmlsZS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVFbnRyeShmaW5hbCBieXRlW10gbmV3UGF0aCkgeworCXB1YmxpYyBEaXJDYWNoZUVudHJ5KGJ5dGVbXSBuZXdQYXRoKSB7CiAJCXRoaXMobmV3UGF0aCwgU1RBR0VfMCk7CiAJfQogCkBAIC0yNzYsNyArMjc2LDcgQEAgcHVibGljIERpckNhY2hlRW50cnkoZmluYWwgYnl0ZVtdIG5ld1BhdGgpIHsKIAkgKiAgICAgICAgICAgICByYW5nZSAwLi4zLCBpbmNsdXNpdmUuCiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoImJveGluZyIpCi0JcHVibGljIERpckNhY2hlRW50cnkoYnl0ZVtdIHBhdGgsIGZpbmFsIGludCBzdGFnZSkgeworCXB1YmxpYyBEaXJDYWNoZUVudHJ5KGJ5dGVbXSBwYXRoLCBpbnQgc3RhZ2UpIHsKIAkJY2hlY2tQYXRoKHBhdGgpOwogCQlpZiAoc3RhZ2UgPCAwIHx8IDMgPCBzdGFnZSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCkBAIC0zMTIsNyArMzEyLDcgQEAgcHVibGljIERpckNhY2hlRW50cnkoRGlyQ2FjaGVFbnRyeSBzcmMpIHsKIAkJU3lzdGVtLmFycmF5Y29weShzcmMuaW5mbywgc3JjLmluZm9PZmZzZXQsIGluZm8sIDAsIElORk9fTEVOKTsKIAl9CiAKLQl2b2lkIHdyaXRlKGZpbmFsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIHdyaXRlKE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IGxlbiA9IGlzRXh0ZW5kZWQoKSA/IElORk9fTEVOX0VYVEVOREVEIDogSU5GT19MRU47CiAJCWZpbmFsIGludCBwYXRoTGVuID0gcGF0aC5sZW5ndGg7CiAJCW9zLndyaXRlKGluZm8sIGluZm9PZmZzZXQsIGxlbik7CkBAIC0zNDMsNyArMzQzLDcgQEAgdm9pZCB3cml0ZShmaW5hbCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICBuYW5vc2Vjb25kcyBjb21wb25lbnQgb2YgdGhlIGluZGV4J3MgbGFzdCBtb2RpZmllZCB0aW1lLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiBleHRyYSBjYXJlZnVsIGNoZWNrcyBzaG91bGQgYmUgdXNlZC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBtaWdodEJlUmFjaWx5Q2xlYW4oZmluYWwgaW50IHNtdWRnZV9zLCBmaW5hbCBpbnQgc211ZGdlX25zKSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gbWlnaHRCZVJhY2lseUNsZWFuKGludCBzbXVkZ2VfcywgaW50IHNtdWRnZV9ucykgewogCQkvLyBJZiB0aGUgaW5kZXggaGFzIGEgbW9kaWZpY2F0aW9uIHRpbWUgdGhlbiBpdCBjYW1lIGZyb20gZGlzawogCQkvLyBhbmQgd2FzIG5vdCBnZW5lcmF0ZWQgZnJvbSBzY3JhdGNoIGluIG1lbW9yeS4gSW4gc3VjaCBjYXNlcwogCQkvLyB0aGUgZW50cnkgaXMgJ3JhY2lseSBjbGVhbicgaWYgdGhlIGVudHJ5J3MgY2FjaGVkIG1vZGlmaWNhdGlvbgpAQCAtNDIwLDcgKzQyMCw3IEBAIHB1YmxpYyBib29sZWFuIGlzQXNzdW1lVmFsaWQoKSB7CiAJICogICAgICAgICAgICB0cnVlIHRvIGlnbm9yZSBhcHBhcmVudCBtb2RpZmljYXRpb25zOyBmYWxzZSB0byBsb29rIGF0IGxhc3QKIAkgKiAgICAgICAgICAgIG1vZGlmaWVkIHRvIGRldGVjdCBmaWxlIG1vZGlmaWNhdGlvbnMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QXNzdW1lVmFsaWQoZmluYWwgYm9vbGVhbiBhc3N1bWUpIHsKKwlwdWJsaWMgdm9pZCBzZXRBc3N1bWVWYWxpZChib29sZWFuIGFzc3VtZSkgewogCQlpZiAoYXNzdW1lKQogCQkJaW5mb1tpbmZvT2Zmc2V0ICsgUF9GTEFHU10gfD0gQVNTVU1FX1ZBTElEOwogCQllbHNlCkBAIC01MTgsNyArNTE4LDcgQEAgcHVibGljIEZpbGVNb2RlIGdldEZpbGVNb2RlKCkgewogCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZSNUUkVFfSwgb3IgYW55IG90aGVyIHR5cGUKIAkgKiAgICAgICAgICAgICBjb2RlIG5vdCBwZXJtaXR0ZWQgaW4gYSB0cmVlIG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGaWxlTW9kZShmaW5hbCBGaWxlTW9kZSBtb2RlKSB7CisJcHVibGljIHZvaWQgc2V0RmlsZU1vZGUoRmlsZU1vZGUgbW9kZSkgewogCQlzd2l0Y2ggKG1vZGUuZ2V0Qml0cygpICYgRmlsZU1vZGUuVFlQRV9NQVNLKSB7CiAJCWNhc2UgRmlsZU1vZGUuVFlQRV9NSVNTSU5HOgogCQljYXNlIEZpbGVNb2RlLlRZUEVfVFJFRToKQEAgLTU0OCw3ICs1NDgsNyBAQCBwdWJsaWMgbG9uZyBnZXRDcmVhdGlvblRpbWUoKSB7CiAJICogQHBhcmFtIHdoZW4KIAkgKiAgICAgICAgICAgIG5ldyBjYWNoZWQgY3JlYXRpb24gdGltZSBvZiB0aGUgZmlsZSwgaW4gbWlsbGlzZWNvbmRzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldENyZWF0aW9uVGltZShmaW5hbCBsb25nIHdoZW4pIHsKKwlwdWJsaWMgdm9pZCBzZXRDcmVhdGlvblRpbWUobG9uZyB3aGVuKSB7CiAJCWVuY29kZVRTKFBfQ1RJTUUsIHdoZW4pOwogCX0KIApAQCAtNTcyLDcgKzU3Miw3IEBAIHB1YmxpYyBsb25nIGdldExhc3RNb2RpZmllZCgpIHsKIAkgKiBAcGFyYW0gd2hlbgogCSAqICAgICAgICAgICAgbmV3IGNhY2hlZCBtb2RpZmljYXRpb24gZGF0ZSBvZiB0aGUgZmlsZSwgaW4gbWlsbGlzZWNvbmRzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldExhc3RNb2RpZmllZChmaW5hbCBsb25nIHdoZW4pIHsKKwlwdWJsaWMgdm9pZCBzZXRMYXN0TW9kaWZpZWQobG9uZyB3aGVuKSB7CiAJCWVuY29kZVRTKFBfTVRJTUUsIHdoZW4pOwogCX0KIApAQCAtNjA0LDcgKzYwNCw3IEBAIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewogCSAqICAgICAgICAgICAgbmV3IGNhY2hlZCBzaXplIG9mIHRoZSBmaWxlLCBhcyBieXRlcy4gSWYgdGhlIGZpbGUgaXMgbGFyZ2VyCiAJICogICAgICAgICAgICB0aGFuIDJHLCBjYXN0IGl0IHRvIChpbnQpIGJlZm9yZSBjYWxsaW5nIHRoaXMgbWV0aG9kLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChmaW5hbCBpbnQgc3opIHsKKwlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IHN6KSB7CiAJCU5CLmVuY29kZUludDMyKGluZm8sIGluZm9PZmZzZXQgKyBQX1NJWkUsIHN6KTsKIAl9CiAKQEAgLTYxNCw3ICs2MTQsNyBAQCBwdWJsaWMgdm9pZCBzZXRMZW5ndGgoZmluYWwgaW50IHN6KSB7CiAJICogQHBhcmFtIHN6CiAJICogICAgICAgICAgICBuZXcgY2FjaGVkIHNpemUgb2YgdGhlIGZpbGUsIGFzIGJ5dGVzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChmaW5hbCBsb25nIHN6KSB7CisJcHVibGljIHZvaWQgc2V0TGVuZ3RoKGxvbmcgc3opIHsKIAkJc2V0TGVuZ3RoKChpbnQpIHN6KTsKIAl9CiAKQEAgLTYzOCw3ICs2MzgsNyBAQCBwdWJsaWMgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoKSB7CiAJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0SWQjemVyb0lkKCl9IHRvIHJlbW92ZSB0aGUKIAkgKiAgICAgICAgICAgIGN1cnJlbnQgaWRlbnRpZmllci4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RJZChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyB2b2lkIHNldE9iamVjdElkKEFueU9iamVjdElkIGlkKSB7CiAJCWlkLmNvcHlSYXdUbyhpZEJ1ZmZlcigpLCBpZE9mZnNldCgpKTsKIAl9CiAKQEAgLTY1MSw3ICs2NTEsNyBAQCBwdWJsaWMgdm9pZCBzZXRPYmplY3RJZChmaW5hbCBBbnlPYmplY3RJZCBpZCkgewogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBieXRlIG9mIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPYmplY3RJZEZyb21SYXcoZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyB2b2lkIHNldE9iamVjdElkRnJvbVJhdyhieXRlW10gYnMsIGludCBwKSB7CiAJCWZpbmFsIGludCBuID0gQ29uc3RhbnRzLk9CSkVDVF9JRF9MRU5HVEg7CiAJCVN5c3RlbS5hcnJheWNvcHkoYnMsIHAsIGlkQnVmZmVyKCksIGlkT2Zmc2V0KCksIG4pOwogCX0KQEAgLTcwNCw3ICs3MDQsNyBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCSAqIEBwYXJhbSBzcmMKIAkgKiAgICAgICAgICAgIHRoZSBlbnRyeSB0byBjb3B5IE9iamVjdElkIGFuZCBtZXRhIGZpZWxkcyBmcm9tLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlNZXRhRGF0YShmaW5hbCBEaXJDYWNoZUVudHJ5IHNyYykgeworCXB1YmxpYyB2b2lkIGNvcHlNZXRhRGF0YShEaXJDYWNoZUVudHJ5IHNyYykgewogCQljb3B5TWV0YURhdGEoc3JjLCBmYWxzZSk7CiAJfQogCkBAIC03MTksNyArNzE5LDcgQEAgcHVibGljIHZvaWQgY29weU1ldGFEYXRhKGZpbmFsIERpckNhY2hlRW50cnkgc3JjKSB7CiAJICogQHBhcmFtIGtlZXBTdGFnZQogCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgdGhlIHN0YWdlIGF0dHJpYnV0ZSB3aWxsIG5vdCBiZSBjb3BpZWQKIAkgKi8KLQl2b2lkIGNvcHlNZXRhRGF0YShmaW5hbCBEaXJDYWNoZUVudHJ5IHNyYywgYm9vbGVhbiBrZWVwU3RhZ2UpIHsKKwl2b2lkIGNvcHlNZXRhRGF0YShEaXJDYWNoZUVudHJ5IHNyYywgYm9vbGVhbiBrZWVwU3RhZ2UpIHsKIAkJaW50IG9yaWdmbGFncyA9IE5CLmRlY29kZVVJbnQxNihpbmZvLCBpbmZvT2Zmc2V0ICsgUF9GTEFHUyk7CiAJCWludCBuZXdmbGFncyA9IE5CLmRlY29kZVVJbnQxNihzcmMuaW5mbywgc3JjLmluZm9PZmZzZXQgKyBQX0ZMQUdTKTsKIAkJU3lzdGVtLmFycmF5Y29weShzcmMuaW5mbywgc3JjLmluZm9PZmZzZXQsIGluZm8sIGluZm9PZmZzZXQsIElORk9fTEVOKTsKQEAgLTc0MSwxNCArNzQxLDE0IEBAIGJvb2xlYW4gaXNFeHRlbmRlZCgpIHsKIAkJcmV0dXJuIChpbmZvW2luZm9PZmZzZXQgKyBQX0ZMQUdTXSAmIEVYVEVOREVEKSAhPSAwOwogCX0KIAotCXByaXZhdGUgbG9uZyBkZWNvZGVUUyhmaW5hbCBpbnQgcElkeCkgeworCXByaXZhdGUgbG9uZyBkZWNvZGVUUyhpbnQgcElkeCkgewogCQlmaW5hbCBpbnQgYmFzZSA9IGluZm9PZmZzZXQgKyBwSWR4OwogCQlmaW5hbCBpbnQgc2VjID0gTkIuZGVjb2RlSW50MzIoaW5mbywgYmFzZSk7CiAJCWZpbmFsIGludCBtcyA9IE5CLmRlY29kZUludDMyKGluZm8sIGJhc2UgKyA0KSAvIDEwMDAwMDA7CiAJCXJldHVybiAxMDAwTCAqIHNlYyArIG1zOwogCX0KIAotCXByaXZhdGUgdm9pZCBlbmNvZGVUUyhmaW5hbCBpbnQgcElkeCwgZmluYWwgbG9uZyB3aGVuKSB7CisJcHJpdmF0ZSB2b2lkIGVuY29kZVRTKGludCBwSWR4LCBsb25nIHdoZW4pIHsKIAkJZmluYWwgaW50IGJhc2UgPSBpbmZvT2Zmc2V0ICsgcElkeDsKIAkJTkIuZW5jb2RlSW50MzIoaW5mbywgYmFzZSwgKGludCkgKHdoZW4gLyAxMDAwKSk7CiAJCU5CLmVuY29kZUludDMyKGluZm8sIGJhc2UgKyA0LCAoKGludCkgKHdoZW4gJSAxMDAwKSkgKiAxMDAwMDAwKTsKQEAgLTc3MSw3ICs3NzEsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUGF0aChieXRlW10gcGF0aCkgewogCQl9CiAJfQogCi0Jc3RhdGljIFN0cmluZyB0b1N0cmluZyhmaW5hbCBieXRlW10gcGF0aCkgeworCXN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoYnl0ZVtdIHBhdGgpIHsKIAkJcmV0dXJuIENvbnN0YW50cy5DSEFSU0VULmRlY29kZShCeXRlQnVmZmVyLndyYXAocGF0aCkpLnRvU3RyaW5nKCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvci5qYXZhCmluZGV4IGQ3NjgyMTYuLjE5YzkxNmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVJdGVyYXRvci5qYXZhCkBAIC0xMTQsNyArMTE0LDcgQEAgcHVibGljIGNsYXNzIERpckNhY2hlSXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVyYXRvciB7CiAJICogQHBhcmFtIGRjCiAJICogICAgICAgICAgICB0aGUgY2FjaGUgdG8gd2Fsay4gSXQgbXVzdCBiZSBhbHJlYWR5IGxvYWRlZCBpbnRvIG1lbW9yeS4KIAkgKi8KLQlwdWJsaWMgRGlyQ2FjaGVJdGVyYXRvcihmaW5hbCBEaXJDYWNoZSBkYykgeworCXB1YmxpYyBEaXJDYWNoZUl0ZXJhdG9yKERpckNhY2hlIGRjKSB7CiAJCWNhY2hlID0gZGM7CiAJCXRyZWUgPSBkYy5nZXRDYWNoZVRyZWUodHJ1ZSk7CiAJCXRyZWVTdGFydCA9IDA7CkBAIC0xMjQsNyArMTI0LDcgQEAgcHVibGljIERpckNhY2hlSXRlcmF0b3IoZmluYWwgRGlyQ2FjaGUgZGMpIHsKIAkJCXBhcnNlRW50cnkoKTsKIAl9CiAKLQlEaXJDYWNoZUl0ZXJhdG9yKGZpbmFsIERpckNhY2hlSXRlcmF0b3IgcCwgZmluYWwgRGlyQ2FjaGVUcmVlIGRjdCkgeworCURpckNhY2hlSXRlcmF0b3IoRGlyQ2FjaGVJdGVyYXRvciBwLCBEaXJDYWNoZVRyZWUgZGN0KSB7CiAJCXN1cGVyKHAsIHAucGF0aCwgcC5wYXRoTGVuICsgMSk7CiAJCWNhY2hlID0gcC5jYWNoZTsKIAkJdHJlZSA9IGRjdDsKQEAgLTEzNyw3ICsxMzcsNyBAQCBwdWJsaWMgRGlyQ2FjaGVJdGVyYXRvcihmaW5hbCBEaXJDYWNoZSBkYykgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpCisJcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKGN1cnJlbnRTdWJ0cmVlID09IG51bGwpCiAJCQl0aHJvdyBuZXcgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbihnZXRFbnRyeU9iamVjdElkKCksCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlVHJlZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9kaXJjYWNoZS9EaXJDYWNoZVRyZWUuamF2YQppbmRleCBkYzgyNWQ0Li5iNjA1ZjNjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2RpcmNhY2hlL0RpckNhY2hlVHJlZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZGlyY2FjaGUvRGlyQ2FjaGVUcmVlLmphdmEKQEAgLTgyLDcgKzgyLDcgQEAgcHVibGljIGNsYXNzIERpckNhY2hlVHJlZSB7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPERpckNhY2hlVHJlZT4gVFJFRV9DTVAgPSBuZXcgQ29tcGFyYXRvcjxEaXJDYWNoZVRyZWU+KCkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGludCBjb21wYXJlKGZpbmFsIERpckNhY2hlVHJlZSBvMSwgZmluYWwgRGlyQ2FjaGVUcmVlIG8yKSB7CisJCXB1YmxpYyBpbnQgY29tcGFyZShEaXJDYWNoZVRyZWUgbzEsIERpckNhY2hlVHJlZSBvMikgewogCQkJZmluYWwgYnl0ZVtdIGEgPSBvMS5lbmNvZGVkTmFtZTsKIAkJCWZpbmFsIGJ5dGVbXSBiID0gbzIuZW5jb2RlZE5hbWU7CiAJCQlmaW5hbCBpbnQgYUxlbiA9IGEubGVuZ3RoOwpAQCAtMTg1LDcgKzE4NSw3IEBAIHByaXZhdGUgRGlyQ2FjaGVUcmVlKGZpbmFsIERpckNhY2hlVHJlZSBteVBhcmVudCwgZmluYWwgYnl0ZVtdIHBhdGgsCiAJCWNoaWxkQ250ID0gc3ViY250OwogCX0KIAotCXZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIHRtcCwgZmluYWwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgd3JpdGUoYnl0ZVtdIHRtcCwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpbnQgcHRyID0gdG1wLmxlbmd0aDsKIAkJdG1wWy0tcHRyXSA9ICdcbic7CiAJCXB0ciA9IFJhd1BhcnNlVXRpbHMuZm9ybWF0QmFzZTEwKHRtcCwgcHRyLCBjaGlsZENudCk7CkBAIC0yNDgsNyArMjQ4LDcgQEAgcHVibGljIGludCBnZXRDaGlsZENvdW50KCkgewogCSAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIGNoaWxkIHRvIG9idGFpbi4KIAkgKiBAcmV0dXJuIHRoZSBjaGlsZCB0cmVlLgogCSAqLwotCXB1YmxpYyBEaXJDYWNoZVRyZWUgZ2V0Q2hpbGQoZmluYWwgaW50IGkpIHsKKwlwdWJsaWMgRGlyQ2FjaGVUcmVlIGdldENoaWxkKGludCBpKSB7CiAJCXJldHVybiBjaGlsZHJlbltpXTsKIAl9CiAKQEAgLTM4OSw3ICszODksNyBAQCBwcml2YXRlIGludCBjb21wdXRlU2l6ZShmaW5hbCBEaXJDYWNoZUVudHJ5W10gY2FjaGUsIGludCBjSWR4LAogCQlyZXR1cm4gc2l6ZTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYXBwZW5kTmFtZShmaW5hbCBTdHJpbmdCdWlsZGVyIHIpIHsKKwlwcml2YXRlIHZvaWQgYXBwZW5kTmFtZShTdHJpbmdCdWlsZGVyIHIpIHsKIAkJaWYgKHBhcmVudCAhPSBudWxsKSB7CiAJCQlwYXJlbnQuYXBwZW5kTmFtZShyKTsKIAkJCXIuYXBwZW5kKGdldE5hbWVTdHJpbmcoKSk7CkBAIC00MDQsNyArNDA0LDcgQEAgZmluYWwgaW50IG5hbWVMZW5ndGgoKSB7CiAJCXJldHVybiBlbmNvZGVkTmFtZS5sZW5ndGg7CiAJfQogCi0JZmluYWwgYm9vbGVhbiBjb250YWlucyhmaW5hbCBieXRlW10gYSwgaW50IGFPZmYsIGZpbmFsIGludCBhTGVuKSB7CisJZmluYWwgYm9vbGVhbiBjb250YWlucyhieXRlW10gYSwgaW50IGFPZmYsIGludCBhTGVuKSB7CiAJCWZpbmFsIGJ5dGVbXSBlID0gZW5jb2RlZE5hbWU7CiAJCWZpbmFsIGludCBlTGVuID0gZS5sZW5ndGg7CiAJCWZvciAoaW50IGVPZmYgPSAwOyBlT2ZmIDwgZUxlbiAmJiBhT2ZmIDwgYUxlbjsgZU9mZisrLCBhT2ZmKyspCkBAIC01MDMsNyArNTAzLDcgQEAgdm9pZCB2YWxpZGF0ZShmaW5hbCBEaXJDYWNoZUVudHJ5W10gY2FjaGUsIGZpbmFsIGludCBjQ250LCBpbnQgY0lkeCwKIAkJCXJlbW92ZUNoaWxkKGNoaWxkQ250IC0gMSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluc2VydENoaWxkKGZpbmFsIGludCBzdElkeCwgZmluYWwgRGlyQ2FjaGVUcmVlIHN0KSB7CisJcHJpdmF0ZSB2b2lkIGluc2VydENoaWxkKGludCBzdElkeCwgRGlyQ2FjaGVUcmVlIHN0KSB7CiAJCWZpbmFsIERpckNhY2hlVHJlZVtdIGMgPSBjaGlsZHJlbjsKIAkJaWYgKGNoaWxkQ250ICsgMSA8PSBjLmxlbmd0aCkgewogCQkJaWYgKHN0SWR4IDwgY2hpbGRDbnQpCkBAIC01MjQsMTQgKzUyNCwxNCBAQCBwcml2YXRlIHZvaWQgaW5zZXJ0Q2hpbGQoZmluYWwgaW50IHN0SWR4LCBmaW5hbCBEaXJDYWNoZVRyZWUgc3QpIHsKIAkJY2hpbGRDbnQrKzsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVtb3ZlQ2hpbGQoZmluYWwgaW50IHN0SWR4KSB7CisJcHJpdmF0ZSB2b2lkIHJlbW92ZUNoaWxkKGludCBzdElkeCkgewogCQlmaW5hbCBpbnQgbiA9IC0tY2hpbGRDbnQ7CiAJCWlmIChzdElkeCA8IG4pCiAJCQlTeXN0ZW0uYXJyYXljb3B5KGNoaWxkcmVuLCBzdElkeCArIDEsIGNoaWxkcmVuLCBzdElkeCwgbiAtIHN0SWR4KTsKIAkJY2hpbGRyZW5bbl0gPSBudWxsOwogCX0KIAotCXN0YXRpYyBib29sZWFuIHBlcShmaW5hbCBieXRlW10gYSwgZmluYWwgYnl0ZVtdIGIsIGludCBhTGVuKSB7CisJc3RhdGljIGJvb2xlYW4gcGVxKGJ5dGVbXSBhLCBieXRlW10gYiwgaW50IGFMZW4pIHsKIAkJaWYgKGIubGVuZ3RoIDwgYUxlbikKIAkJCXJldHVybiBmYWxzZTsKIAkJZm9yIChhTGVuLS07IGFMZW4gPj0gMDsgYUxlbi0tKQpAQCAtNTQwLDcgKzU0MCw3IEBAIHN0YXRpYyBib29sZWFuIHBlcShmaW5hbCBieXRlW10gYSwgZmluYWwgYnl0ZVtdIGIsIGludCBhTGVuKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCBuYW1lY21wKGZpbmFsIGJ5dGVbXSBhLCBpbnQgYVBvcywgZmluYWwgRGlyQ2FjaGVUcmVlIGN0KSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IG5hbWVjbXAoYnl0ZVtdIGEsIGludCBhUG9zLCBEaXJDYWNoZVRyZWUgY3QpIHsKIAkJaWYgKGN0ID09IG51bGwpCiAJCQlyZXR1cm4gLTE7CiAJCWZpbmFsIGJ5dGVbXSBiID0gY3QuZW5jb2RlZE5hbWU7CkBAIC01NTcsNyArNTU3LDcgQEAgcHJpdmF0ZSBzdGF0aWMgaW50IG5hbWVjbXAoZmluYWwgYnl0ZVtdIGEsIGludCBhUG9zLCBmaW5hbCBEaXJDYWNoZVRyZWUgY3QpIHsKIAkJcmV0dXJuIGFMZW4gLSBiTGVuOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCBzbGFzaChmaW5hbCBieXRlW10gYSwgaW50IGFQb3MpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgc2xhc2goYnl0ZVtdIGEsIGludCBhUG9zKSB7CiAJCWZpbmFsIGludCBhTGVuID0gYS5sZW5ndGg7CiAJCWZvciAoOyBhUG9zIDwgYUxlbjsgYVBvcysrKQogCQkJaWYgKGFbYVBvc10gPT0gJy8nKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvQ29tcG91bmRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0NvbXBvdW5kRXhjZXB0aW9uLmphdmEKaW5kZXggNjJmZjk5MC4uMWRmNzBlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvQ29tcG91bmRFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Db21wb3VuZEV4Y2VwdGlvbi5qYXZhCkBAIC01NiwxMCArNTYsMTAgQEAKIHB1YmxpYyBjbGFzcyBDb21wb3VuZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0KGZpbmFsIENvbGxlY3Rpb248VGhyb3dhYmxlPiBjYXVzZXMpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0KENvbGxlY3Rpb248VGhyb3dhYmxlPiBjYXVzZXMpIHsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBtc2cgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQltc2cuYXBwZW5kKEpHaXRUZXh0LmdldCgpLmZhaWx1cmVEdWVUb09uZU9mVGhlRm9sbG93aW5nKTsKLQkJZm9yIChmaW5hbCBUaHJvd2FibGUgYyA6IGNhdXNlcykgeworCQlmb3IgKFRocm93YWJsZSBjIDogY2F1c2VzKSB7CiAJCQltc2cuYXBwZW5kKCIgICIpOyAvLyROT04tTkxTLTEkCiAJCQltc2cuYXBwZW5kKGMuZ2V0TWVzc2FnZSgpKTsKIAkJCW1zZy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKQEAgLTc1LDcgKzc1LDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdChmaW5hbCBDb2xsZWN0aW9uPFRocm93YWJsZT4gY2F1c2VzKSB7CiAJICogQHBhcmFtIHdoeQogCSAqICAgICAgICAgICAgVHdvIG9yIG1vcmUgZXhjZXB0aW9ucyB0aGF0IG1heSBoYXZlIGJlZW4gdGhlIHByb2JsZW0uCiAJICovCi0JcHVibGljIENvbXBvdW5kRXhjZXB0aW9uKGZpbmFsIENvbGxlY3Rpb248VGhyb3dhYmxlPiB3aHkpIHsKKwlwdWJsaWMgQ29tcG91bmRFeGNlcHRpb24oQ29sbGVjdGlvbjxUaHJvd2FibGU+IHdoeSkgewogCQlzdXBlcihmb3JtYXQod2h5KSk7CiAJCWNhdXNlTGlzdCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobmV3IEFycmF5TGlzdDw+KHdoeSkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0NvbmZpZ0ludmFsaWRFeGNlcHRpb24uamF2YQppbmRleCBhN2UxZDAyLi4yNGY0M2NmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Db25maWdJbnZhbGlkRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvQ29uZmlnSW52YWxpZEV4Y2VwdGlvbi5qYXZhCkBAIC01NSw3ICs1NSw3IEBAIHB1YmxpYyBjbGFzcyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gbWVzc2FnZQogCSAqICAgICAgICAgICAgd2h5IHRoZSBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuCiAJICovCi0JcHVibGljIENvbmZpZ0ludmFsaWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKwlwdWJsaWMgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewogCQlzdXBlcihtZXNzYWdlKTsKIAl9CiAKQEAgLTY3LDcgKzY3LDcgQEAgcHVibGljIENvbmZpZ0ludmFsaWRFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIHJvb3QgY2F1c2Ugb2YgdGhlIGVycm9yLgogCSAqLwotCXB1YmxpYyBDb25maWdJbnZhbGlkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9FbnRyeUV4aXN0c0V4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvRW50cnlFeGlzdHNFeGNlcHRpb24uamF2YQppbmRleCA4ZGQwZDUzLi5iOTdkMjM3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9FbnRyeUV4aXN0c0V4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0VudHJ5RXhpc3RzRXhjZXB0aW9uLmphdmEKQEAgLTYxLDcgKzYxLDcgQEAgcHVibGljIGNsYXNzIEVudHJ5RXhpc3RzRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCSAqCiAJICogQHBhcmFtIG5hbWUgd29ya2RpciByZWxhdGl2ZSBmaWxlIG5hbWUKIAkgKi8KLQlwdWJsaWMgRW50cnlFeGlzdHNFeGNlcHRpb24oZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwdWJsaWMgRW50cnlFeGlzdHNFeGNlcHRpb24oU3RyaW5nIG5hbWUpIHsKIAkJc3VwZXIoTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudHJlZUVudHJ5QWxyZWFkeUV4aXN0cywgbmFtZSkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0lsbGVnYWxUb2RvRmlsZU1vZGlmaWNhdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSWxsZWdhbFRvZG9GaWxlTW9kaWZpY2F0aW9uLmphdmEKaW5kZXggYTY0NzEyMS4uNzg1Y2I5NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSWxsZWdhbFRvZG9GaWxlTW9kaWZpY2F0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSWxsZWdhbFRvZG9GaWxlTW9kaWZpY2F0aW9uLmphdmEKQEAgLTU2LDcgKzU2LDcgQEAgcHVibGljIGNsYXNzIElsbGVnYWxUb2RvRmlsZU1vZGlmaWNhdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CiAJICogQHBhcmFtIG1zZwogCSAqICAgICAgICAgICAgZXJyb3IgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBJbGxlZ2FsVG9kb0ZpbGVNb2RpZmljYXRpb24oZmluYWwgU3RyaW5nIG1zZykgeworCXB1YmxpYyBJbGxlZ2FsVG9kb0ZpbGVNb2RpZmljYXRpb24oU3RyaW5nIG1zZykgewogCQlzdXBlcihtc2cpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24uamF2YQppbmRleCA3YmEzYTAwLi41YWJkMGMzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbi5qYXZhCkBAIC03MCw3ICs3MCw3IEBAIHB1YmxpYyBjbGFzcyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCSAqIEBwYXJhbSBpZCBTSEEtMQogCSAqIEBwYXJhbSB0eXBlIG9iamVjdCB0eXBlCiAJICovCi0JcHVibGljIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24oZmluYWwgT2JqZWN0SWQgaWQsIGZpbmFsIFN0cmluZyB0eXBlKSB7CisJcHVibGljIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24oT2JqZWN0SWQgaWQsIFN0cmluZyB0eXBlKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLm9iamVjdElzTm90QSwgaWQubmFtZSgpLCB0eXBlKSk7CiAJfQogCkBAIC04Miw3ICs4Miw3IEBAIHB1YmxpYyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uKGZpbmFsIE9iamVjdElkIGlkLCBmaW5hbCBTdHJpbmcgdHlwZSkgewogCSAqIEBwYXJhbSBpZCBTSEEtMQogCSAqIEBwYXJhbSB0eXBlIG9iamVjdCB0eXBlCiAJICovCi0JcHVibGljIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24oZmluYWwgT2JqZWN0SWQgaWQsIGZpbmFsIGludCB0eXBlKSB7CisJcHVibGljIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24oT2JqZWN0SWQgaWQsIGludCB0eXBlKSB7CiAJCXRoaXMoaWQsIENvbnN0YW50cy50eXBlU3RyaW5nKHR5cGUpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmRleFJlYWRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4UmVhZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDcwZjY1MGQuLmUwN2QzMDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4UmVhZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4UmVhZEV4Y2VwdGlvbi5qYXZhCkBAIC02Myw3ICs2Myw3IEBAIHB1YmxpYyBJbmRleFJlYWRFeGNlcHRpb24oKSB7CiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgSW5kZXhSZWFkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIEluZGV4UmVhZEV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTc1LDcgKzc1LDcgQEAgcHVibGljIEluZGV4UmVhZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgewogCSAqIEBwYXJhbSBjYXVzZQogCSAqICAgICAgICAgICAgcm9vdCBjYXVzZSBleGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgSW5kZXhSZWFkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgSW5kZXhSZWFkRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIocyk7CiAJCWluaXRDYXVzZShjYXVzZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5kZXhXcml0ZUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvSW5kZXhXcml0ZUV4Y2VwdGlvbi5qYXZhCmluZGV4IGRlMTljMDYuLjM0ZmQ3YTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL0luZGV4V3JpdGVFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9JbmRleFdyaXRlRXhjZXB0aW9uLmphdmEKQEAgLTYwLDcgKzYwLDcgQEAgcHVibGljIEluZGV4V3JpdGVFeGNlcHRpb24oKSB7CiAJICoKIAkgKiBAcGFyYW0gcyBtZXNzYWdlCiAJICovCi0JcHVibGljIEluZGV4V3JpdGVFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgSW5kZXhXcml0ZUV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTcwLDcgKzcwLDcgQEAgcHVibGljIEluZGV4V3JpdGVFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMpIHsKIAkgKiBAcGFyYW0gcyBtZXNzYWdlCiAJICogQHBhcmFtIGNhdXNlIHJvb3QgY2F1c2UgZXhjZXB0aW9uCiAJICovCi0JcHVibGljIEluZGV4V3JpdGVFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBJbmRleFdyaXRlRXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIocyk7CiAJCWluaXRDYXVzZShjYXVzZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTWlzc2luZ0J1bmRsZVByZXJlcXVpc2l0ZUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTWlzc2luZ0J1bmRsZVByZXJlcXVpc2l0ZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDA5YmI0YTkuLmIzN2QyMGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL01pc3NpbmdCdW5kbGVQcmVyZXF1aXNpdGVFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9NaXNzaW5nQnVuZGxlUHJlcmVxdWlzaXRlRXhjZXB0aW9uLmphdmEKQEAgLTU2LDEwICs1NiwxMCBAQAogcHVibGljIGNsYXNzIE1pc3NpbmdCdW5kbGVQcmVyZXF1aXNpdGVFeGNlcHRpb24gZXh0ZW5kcyBUcmFuc3BvcnRFeGNlcHRpb24gewogCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdChmaW5hbCBNYXA8T2JqZWN0SWQsIFN0cmluZz4gbWlzc2luZ0NvbW1pdHMpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0KE1hcDxPYmplY3RJZCwgU3RyaW5nPiBtaXNzaW5nQ29tbWl0cykgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlyLmFwcGVuZChKR2l0VGV4dC5nZXQoKS5taXNzaW5nUHJlcmVxdWlzaXRlQ29tbWl0cyk7Ci0JCWZvciAoZmluYWwgTWFwLkVudHJ5PE9iamVjdElkLCBTdHJpbmc+IGUgOiBtaXNzaW5nQ29tbWl0cy5lbnRyeVNldCgpKSB7CisJCWZvciAoTWFwLkVudHJ5PE9iamVjdElkLCBTdHJpbmc+IGUgOiBtaXNzaW5nQ29tbWl0cy5lbnRyeVNldCgpKSB7CiAJCQlyLmFwcGVuZCgiXG4gICIpOyAvLyROT04tTkxTLTEkCiAJCQlyLmFwcGVuZChlLmdldEtleSgpLm5hbWUoKSk7CiAJCQlpZiAoZS5nZXRWYWx1ZSgpICE9IG51bGwpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9NaXNzaW5nT2JqZWN0RXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9NaXNzaW5nT2JqZWN0RXhjZXB0aW9uLmphdmEKaW5kZXggZjZhYTA5Mi4uYzZjNDdmOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTWlzc2luZ09iamVjdEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL01pc3NpbmdPYmplY3RFeGNlcHRpb24uamF2YQpAQCAtNjksNyArNjksNyBAQCBwdWJsaWMgY2xhc3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gaWQgU0hBLTEKIAkgKiBAcGFyYW0gdHlwZSBvYmplY3QgdHlwZQogCSAqLwotCXB1YmxpYyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uKGZpbmFsIE9iamVjdElkIGlkLCBmaW5hbCBTdHJpbmcgdHlwZSkgeworCXB1YmxpYyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uKE9iamVjdElkIGlkLCBTdHJpbmcgdHlwZSkgewogCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5taXNzaW5nT2JqZWN0LCB0eXBlLCBpZC5uYW1lKCkpKTsKIAkJbWlzc2luZyA9IGlkLmNvcHkoKTsKIAl9CkBAIC04MSw3ICs4MSw3IEBAIHB1YmxpYyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uKGZpbmFsIE9iamVjdElkIGlkLCBmaW5hbCBTdHJpbmcgdHlwZSkgewogCSAqIEBwYXJhbSBpZCBTSEEtMQogCSAqIEBwYXJhbSB0eXBlIG9iamVjdCB0eXBlCiAJICovCi0JcHVibGljIE1pc3NpbmdPYmplY3RFeGNlcHRpb24oZmluYWwgT2JqZWN0SWQgaWQsIGZpbmFsIGludCB0eXBlKSB7CisJcHVibGljIE1pc3NpbmdPYmplY3RFeGNlcHRpb24oT2JqZWN0SWQgaWQsIGludCB0eXBlKSB7CiAJCXRoaXMoaWQsIENvbnN0YW50cy50eXBlU3RyaW5nKHR5cGUpKTsKIAl9CiAKQEAgLTk0LDcgKzk0LDcgQEAgcHVibGljIE1pc3NpbmdPYmplY3RFeGNlcHRpb24oZmluYWwgT2JqZWN0SWQgaWQsIGZpbmFsIGludCB0eXBlKSB7CiAJICogQHBhcmFtIHR5cGUKIAkgKiAgICAgICAgICAgIG9iamVjdCB0eXBlCiAJICovCi0JcHVibGljIE1pc3NpbmdPYmplY3RFeGNlcHRpb24oZmluYWwgQWJicmV2aWF0ZWRPYmplY3RJZCBpZCwgZmluYWwgaW50IHR5cGUpIHsKKwlwdWJsaWMgTWlzc2luZ09iamVjdEV4Y2VwdGlvbihBYmJyZXZpYXRlZE9iamVjdElkIGlkLCBpbnQgdHlwZSkgewogCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5taXNzaW5nT2JqZWN0LCBDb25zdGFudHMKIAkJCQkudHlwZVN0cmluZyh0eXBlKSwgaWQubmFtZSgpKSk7CiAJCW1pc3NpbmcgPSBudWxsOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9QYWNrU2lnbmF0dXJlRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1BhY2tTaWduYXR1cmVFeGNlcHRpb24uamF2YQppbmRleCAyOGU5Nzg4Li44YzJlODcyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1BhY2tTaWduYXR1cmVFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Ob1BhY2tTaWduYXR1cmVFeGNlcHRpb24uamF2YQpAQCAtNjAsNyArNjAsNyBAQCBwdWJsaWMgY2xhc3MgTm9QYWNrU2lnbmF0dXJlRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCSAqIEBwYXJhbSB3aHkKIAkgKiAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIHRoZSB0eXBlIG9mIGVycm9yLgogCSAqLwotCXB1YmxpYyBOb1BhY2tTaWduYXR1cmVFeGNlcHRpb24oZmluYWwgU3RyaW5nIHdoeSkgeworCXB1YmxpYyBOb1BhY2tTaWduYXR1cmVFeGNlcHRpb24oU3RyaW5nIHdoeSkgewogCQlzdXBlcih3aHkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEKaW5kZXggZmUwNzNkNS4uNTI0OTY4ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uLmphdmEKQEAgLTU5LDcgKzU5LDcgQEAgcHVibGljIGNsYXNzIE5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbiBleHRlbmRzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgTm9SZW1vdGVSZXBvc2l0b3J5RXhjZXB0aW9uKGZpbmFsIFVSSWlzaCB1cmksIGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIE5vUmVtb3RlUmVwb3NpdG9yeUV4Y2VwdGlvbihVUklpc2ggdXJpLCBTdHJpbmcgcykgewogCQlzdXBlcih1cmksIHMpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKaW5kZXggMTI0NjgwZS4uMTE0ZTY2MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAgcHVibGljIGNsYXNzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKIAkgKgogCSAqIEBwYXJhbSBzIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgaXNzdWUKIAkgKi8KLQlwdWJsaWMgTm90U3VwcG9ydGVkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTcwLDcgKzcwLDcgQEAgcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgewogCSAqIEBwYXJhbSB3aHkKIAkgKiAgICAgICAgICAgIGEgbG93ZXIgbGV2ZWwgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgaXNzdWUuCiAJICovCi0JcHVibGljIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcywgZmluYWwgVGhyb3dhYmxlIHdoeSkgeworCXB1YmxpYyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSB3aHkpIHsKIAkJc3VwZXIocyk7CiAJCWluaXRDYXVzZSh3aHkpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL09iamVjdFdyaXRpbmdFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL09iamVjdFdyaXRpbmdFeGNlcHRpb24uamF2YQppbmRleCA4YWYxOTkxLi5iYmVlNDJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9PYmplY3RXcml0aW5nRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvT2JqZWN0V3JpdGluZ0V4Y2VwdGlvbi5qYXZhCkBAIC01OCw3ICs1OCw3IEBAIHB1YmxpYyBjbGFzcyBPYmplY3RXcml0aW5nRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCSAqCiAJICogQHBhcmFtIHMgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBPYmplY3RXcml0aW5nRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIE9iamVjdFdyaXRpbmdFeGNlcHRpb24oU3RyaW5nIHMpIHsKIAkJc3VwZXIocyk7CiAJfQogCkBAIC02OCw3ICs2OCw3IEBAIHB1YmxpYyBPYmplY3RXcml0aW5nRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CiAJICogQHBhcmFtIHMgbWVzc2FnZQogCSAqIEBwYXJhbSBjYXVzZSByb290IGNhdXNlIGV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBPYmplY3RXcml0aW5nRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgT2JqZWN0V3JpdGluZ0V4Y2VwdGlvbihTdHJpbmcgcywgVGhyb3dhYmxlIGNhdXNlKSB7CiAJCXN1cGVyKHMpOwogCQlpbml0Q2F1c2UoY2F1c2UpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tJbnZhbGlkRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrSW52YWxpZEV4Y2VwdGlvbi5qYXZhCmluZGV4IDk4ODZlMTUuLmE4M2RlMDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tJbnZhbGlkRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja0ludmFsaWRFeGNlcHRpb24uamF2YQpAQCAtNjEsNyArNjEsNyBAQCBwdWJsaWMgY2xhc3MgUGFja0ludmFsaWRFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAJICogQHBhcmFtIHBhdGgKIAkgKiAgICAgICAgICAgIHBhdGggb2YgdGhlIGludmFsaWQgcGFjayBmaWxlLgogCSAqLwotCXB1YmxpYyBQYWNrSW52YWxpZEV4Y2VwdGlvbihmaW5hbCBGaWxlIHBhdGgpIHsKKwlwdWJsaWMgUGFja0ludmFsaWRFeGNlcHRpb24oRmlsZSBwYXRoKSB7CiAJCXRoaXMocGF0aC5nZXRBYnNvbHV0ZVBhdGgoKSk7CiAJfQogCkBAIC03MSw3ICs3MSw3IEBAIHB1YmxpYyBQYWNrSW52YWxpZEV4Y2VwdGlvbihmaW5hbCBGaWxlIHBhdGgpIHsKIAkgKiBAcGFyYW0gcGF0aAogCSAqICAgICAgICAgICAgcGF0aCBvZiB0aGUgaW52YWxpZCBwYWNrIGZpbGUuCiAJICovCi0JcHVibGljIFBhY2tJbnZhbGlkRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBwYXRoKSB7CisJcHVibGljIFBhY2tJbnZhbGlkRXhjZXB0aW9uKFN0cmluZyBwYXRoKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnBhY2tGaWxlSW52YWxpZCwgcGF0aCkpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tNaXNtYXRjaEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja01pc21hdGNoRXhjZXB0aW9uLmphdmEKaW5kZXggNWI5YTRiOS4uZWExZTY1YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja01pc21hdGNoRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUGFja01pc21hdGNoRXhjZXB0aW9uLmphdmEKQEAgLTU3LDcgKzU3LDcgQEAgcHVibGljIGNsYXNzIFBhY2tNaXNtYXRjaEV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gd2h5CiAJICogICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiB0aGUgdHlwZSBvZiBlcnJvci4KIAkgKi8KLQlwdWJsaWMgUGFja01pc21hdGNoRXhjZXB0aW9uKGZpbmFsIFN0cmluZyB3aHkpIHsKKwlwdWJsaWMgUGFja01pc21hdGNoRXhjZXB0aW9uKFN0cmluZyB3aHkpIHsKIAkJc3VwZXIod2h5KTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9QYWNrUHJvdG9jb2xFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCmluZGV4IDQ0YmMxNjQuLmRkMTM3NDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1BhY2tQcm90b2NvbEV4Y2VwdGlvbi5qYXZhCkBAIC02Miw3ICs2Miw3IEBAIHB1YmxpYyBjbGFzcyBQYWNrUHJvdG9jb2xFeGNlcHRpb24gZXh0ZW5kcyBUcmFuc3BvcnRFeGNlcHRpb24gewogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICBtZXNzYWdlLCB3aGljaCBtYXkgYmUgc2hvd24gdG8gYW4gZW5kLXVzZXIuCiAJICovCi0JcHVibGljIFBhY2tQcm90b2NvbEV4Y2VwdGlvbihmaW5hbCBVUklpc2ggdXJpLCBmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oVVJJaXNoIHVyaSwgU3RyaW5nIHMpIHsKIAkJc3VwZXIodXJpICsgIjogIiArIHMpOyAvLyROT04tTkxTLTEkCiAJfQogCkBAIC04OCw3ICs4OCw3IEBAIHB1YmxpYyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oZmluYWwgVVJJaXNoIHVyaSwgZmluYWwgU3RyaW5nIHMsCiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UsIHdoaWNoIG1heSBiZSBzaG93biB0byBhbiBlbmQtdXNlci4KIAkgKi8KLQlwdWJsaWMgUGFja1Byb3RvY29sRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIFBhY2tQcm90b2NvbEV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiAKQEAgLTEwMCw3ICsxMDAsNyBAQCBwdWJsaWMgUGFja1Byb3RvY29sRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzKSB7CiAJICogQHBhcmFtIGNhdXNlCiAJICogICAgICAgICAgICByb290IGNhdXNlIGV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oU3RyaW5nIHMsIFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihzKTsKIAkJaW5pdENhdXNlKGNhdXNlKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9SZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCmluZGV4IGFhYmI0NmEuLjA0ZmQ4ZWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCkBAIC02MCw3ICs2MCw3IEBAIHB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBUcmFuc3BvcnRFeGNlcHRpb24gewogCSAqIEBwYXJhbSBsb2NhdGlvbgogCSAqICAgICAgICAgICAgZGVzY3JpcHRpb24gb2YgdGhlIHJlcG9zaXRvcnkgbm90IGZvdW5kLCB1c3VhbGx5IGZpbGUgcGF0aC4KIAkgKi8KLQlwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKGZpbmFsIEZpbGUgbG9jYXRpb24pIHsKKwlwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKEZpbGUgbG9jYXRpb24pIHsKIAkJdGhpcyhsb2NhdGlvbi5nZXRQYXRoKCkpOwogCX0KIApAQCAtNzIsNyArNzIsNyBAQCBwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKGZpbmFsIEZpbGUgbG9jYXRpb24pIHsKIAkgKiBAcGFyYW0gd2h5CiAJICogICAgICAgICAgICB3aHkgdGhlIHJlcG9zaXRvcnkgZG9lcyBub3QgZXhpc3QuCiAJICovCi0JcHVibGljIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihmaW5hbCBGaWxlIGxvY2F0aW9uLCBUaHJvd2FibGUgd2h5KSB7CisJcHVibGljIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihGaWxlIGxvY2F0aW9uLCBUaHJvd2FibGUgd2h5KSB7CiAJCXRoaXMobG9jYXRpb24uZ2V0UGF0aCgpLCB3aHkpOwogCX0KIApAQCAtODIsNyArODIsNyBAQCBwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKGZpbmFsIEZpbGUgbG9jYXRpb24sIFRocm93YWJsZSB3aHkpIHsKIAkgKiBAcGFyYW0gbG9jYXRpb24KIAkgKiAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIHRoZSByZXBvc2l0b3J5IG5vdCBmb3VuZCwgdXN1YWxseSBmaWxlIHBhdGguCiAJICovCi0JcHVibGljIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbG9jYXRpb24pIHsKKwlwdWJsaWMgUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uKFN0cmluZyBsb2NhdGlvbikgewogCQlzdXBlcihtZXNzYWdlKGxvY2F0aW9uKSk7CiAJfQogCkBAIC05OCw3ICs5OCw3IEBAIHB1YmxpYyBSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIGxvY2F0aW9uLCBUaHJvd2FibGUgd2h5KSB7CiAJCXN1cGVyKG1lc3NhZ2UobG9jYXRpb24pLCB3aHkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBtZXNzYWdlKGZpbmFsIFN0cmluZyBsb2NhdGlvbikgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBtZXNzYWdlKFN0cmluZyBsb2NhdGlvbikgewogCQlyZXR1cm4gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkucmVwb3NpdG9yeU5vdEZvdW5kLCBsb2NhdGlvbik7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUmV2V2Fsa0V4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvUmV2V2Fsa0V4Y2VwdGlvbi5qYXZhCmluZGV4IDgyNjU0ZTguLmY2ODUyYjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1JldldhbGtFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9SZXZXYWxrRXhjZXB0aW9uLmphdmEKQEAgLTY1LDcgKzY1LDcgQEAgcHVibGljIGNsYXNzIFJldldhbGtFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gY2F1c2UKIAkgKiAgICAgICAgICAgIHRoZSBjaGVja2VkIGV4Y2VwdGlvbiB0aGF0IGRlc2NyaWJlcyB3aHkgdGhlIHdhbGsgZmFpbGVkLgogCSAqLwotCXB1YmxpYyBSZXZXYWxrRXhjZXB0aW9uKGZpbmFsIFRocm93YWJsZSBjYXVzZSkgeworCXB1YmxpYyBSZXZXYWxrRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewogCQlzdXBlcihKR2l0VGV4dC5nZXQoKS53YWxrRmFpbHVyZSwgY2F1c2UpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1N0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9TdG9yZWRPYmplY3RSZXByZXNlbnRhdGlvbk5vdEF2YWlsYWJsZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDhmYTE0YzcuLjYxMWZkNjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1N0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvU3RvcmVkT2JqZWN0UmVwcmVzZW50YXRpb25Ob3RBdmFpbGFibGVFeGNlcHRpb24uamF2YQpAQCAtNTYsMjEgKzU2LDYgQEAgcHVibGljIGNsYXNzIFN0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKIAkgKgogCSAqIEBwYXJhbSBvdHAKIAkgKiAgICAgICAgICAgIHRoZSBvYmplY3Qgd2hvc2UgY3VycmVudCByZXByZXNlbnRhdGlvbiBpcyBubyBsb25nZXIgcHJlc2VudC4KLQkgKiBAZGVwcmVjYXRlZCB1c2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgI1N0b3JlZE9iamVjdFJlcHJlc2VudGF0aW9uTm90QXZhaWxhYmxlRXhjZXB0aW9uKE9iamVjdFRvUGFjaywgVGhyb3dhYmxlKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkLgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBTdG9yZWRPYmplY3RSZXByZXNlbnRhdGlvbk5vdEF2YWlsYWJsZUV4Y2VwdGlvbihPYmplY3RUb1BhY2sgb3RwKSB7Ci0JCS8vIERvIG5vdGhpbmcuCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0IGFuIGVycm9yIGZvciBhbiBvYmplY3QuCi0JICoKLQkgKiBAcGFyYW0gb3RwCi0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHdob3NlIGN1cnJlbnQgcmVwcmVzZW50YXRpb24gaXMgbm8gbG9uZ2VyIHByZXNlbnQuCiAJICogQHBhcmFtIGNhdXNlCiAJICogICAgICAgICAgICBjYXVzZQogCSAqIEBzaW5jZSA0LjEwCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9TeW1saW5rc05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvU3ltbGlua3NOb3RTdXBwb3J0ZWRFeGNlcHRpb24uamF2YQppbmRleCA2MGQ3YWEwLi5kYzU5YzhjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9TeW1saW5rc05vdFN1cHBvcnRlZEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1N5bWxpbmtzTm90U3VwcG9ydGVkRXhjZXB0aW9uLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAgcHVibGljIGNsYXNzIFN5bWxpbmtzTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCSAqCiAJICogQHBhcmFtIHMgbmFtZSBvZiBsaW5rIGluIHRyZWUgb3Igd29ya2RpcgogCSAqLwotCXB1YmxpYyBTeW1saW5rc05vdFN1cHBvcnRlZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBTeW1saW5rc05vdFN1cHBvcnRlZEV4Y2VwdGlvbihTdHJpbmcgcykgewogCQlzdXBlcihzKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9UcmFuc3BvcnRFeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1RyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCmluZGV4IDg2ZGVhODIuLjVmZWNmMGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1RyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1RyYW5zcG9ydEV4Y2VwdGlvbi5qYXZhCkBAIC02NCw3ICs2NCw3IEBAIHB1YmxpYyBjbGFzcyBUcmFuc3BvcnRFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UKIAkgKi8KLQlwdWJsaWMgVHJhbnNwb3J0RXhjZXB0aW9uKGZpbmFsIFVSSWlzaCB1cmksIGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIFRyYW5zcG9ydEV4Y2VwdGlvbihVUklpc2ggdXJpLCBTdHJpbmcgcykgewogCQlzdXBlcih1cmkuc2V0UGFzcyhudWxsKSArICI6ICIgKyBzKTsgLy8kTk9OLU5MUy0xJAogCX0KIApAQCAtOTAsNyArOTAsNyBAQCBwdWJsaWMgVHJhbnNwb3J0RXhjZXB0aW9uKGZpbmFsIFVSSWlzaCB1cmksIGZpbmFsIFN0cmluZyBzLAogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICBtZXNzYWdlCiAJICovCi0JcHVibGljIFRyYW5zcG9ydEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgeworCXB1YmxpYyBUcmFuc3BvcnRFeGNlcHRpb24oU3RyaW5nIHMpIHsKIAkJc3VwZXIocyk7CiAJfQogCkBAIC0xMDIsNyArMTAyLDcgQEAgcHVibGljIFRyYW5zcG9ydEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcykgewogCSAqIEBwYXJhbSBjYXVzZQogCSAqICAgICAgICAgICAgcm9vdCBjYXVzZSBleGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgVHJhbnNwb3J0RXhjZXB0aW9uKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKKwlwdWJsaWMgVHJhbnNwb3J0RXhjZXB0aW9uKFN0cmluZyBzLCBUaHJvd2FibGUgY2F1c2UpIHsKIAkJc3VwZXIocyk7CiAJCWluaXRDYXVzZShjYXVzZSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5tZXJnZWRQYXRoRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Vbm1lcmdlZFBhdGhFeGNlcHRpb24uamF2YQppbmRleCA0ZmM1MzRiLi42ZGU5MTUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Vbm1lcmdlZFBhdGhFeGNlcHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9Vbm1lcmdlZFBhdGhFeGNlcHRpb24uamF2YQpAQCAtNjMsNyArNjMsNyBAQCBwdWJsaWMgY2xhc3MgVW5tZXJnZWRQYXRoRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewogCSAqIEBwYXJhbSBkY2UKIAkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBub24temVybyBzdGFnZSBvZiB0aGUgdW5tZXJnZWQgcGF0aC4KIAkgKi8KLQlwdWJsaWMgVW5tZXJnZWRQYXRoRXhjZXB0aW9uKGZpbmFsIERpckNhY2hlRW50cnkgZGNlKSB7CisJcHVibGljIFVubWVyZ2VkUGF0aEV4Y2VwdGlvbihEaXJDYWNoZUVudHJ5IGRjZSkgewogCQlzdXBlcihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bm1lcmdlZFBhdGgsIGRjZS5nZXRQYXRoU3RyaW5nKCkpKTsKIAkJZW50cnkgPSBkY2U7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRDcmVkZW50aWFsSXRlbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRDcmVkZW50aWFsSXRlbS5qYXZhCmluZGV4IDg4YzJlZjYuLjliYWI2ODcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkQ3JlZGVudGlhbEl0ZW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZENyZWRlbnRpYWxJdGVtLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAgcHVibGljIGNsYXNzIFVuc3VwcG9ydGVkQ3JlZGVudGlhbEl0ZW0gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgbWVzc2FnZQogCSAqLwotCXB1YmxpYyBVbnN1cHBvcnRlZENyZWRlbnRpYWxJdGVtKGZpbmFsIFVSSWlzaCB1cmksIGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIFVuc3VwcG9ydGVkQ3JlZGVudGlhbEl0ZW0oVVJJaXNoIHVyaSwgU3RyaW5nIHMpIHsKIAkJc3VwZXIodXJpLnNldFBhc3MobnVsbCkgKyAiOiAiICsgcyk7IC8vJE5PTi1OTFMtMSQKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZFBhY2tJbmRleFZlcnNpb25FeGNlcHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbkV4Y2VwdGlvbi5qYXZhCmluZGV4IDBiN2NjZjUuLjBhNGZlZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbkV4Y2VwdGlvbi5qYXZhCkBAIC02Miw3ICs2Miw3IEBAIHB1YmxpYyBjbGFzcyBVbnN1cHBvcnRlZFBhY2tJbmRleFZlcnNpb25FeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7CiAJICogQHBhcmFtIHZlcnNpb24KIAkgKiAgICAgICAgICAgIHBhY2sgaW5kZXggdmVyc2lvbgogCSAqLwotCXB1YmxpYyBVbnN1cHBvcnRlZFBhY2tJbmRleFZlcnNpb25FeGNlcHRpb24oZmluYWwgaW50IHZlcnNpb24pIHsKKwlwdWJsaWMgVW5zdXBwb3J0ZWRQYWNrSW5kZXhWZXJzaW9uRXhjZXB0aW9uKGludCB2ZXJzaW9uKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuc3VwcG9ydGVkUGFja0luZGV4VmVyc2lvbiwKIAkJCQlJbnRlZ2VyLnZhbHVlT2YodmVyc2lvbikpKTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZFBhY2tWZXJzaW9uRXhjZXB0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2Vycm9ycy9VbnN1cHBvcnRlZFBhY2tWZXJzaW9uRXhjZXB0aW9uLmphdmEKaW5kZXggMjM2MTE4Ni4uY2JmOGYzYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9lcnJvcnMvVW5zdXBwb3J0ZWRQYWNrVmVyc2lvbkV4Y2VwdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXJyb3JzL1Vuc3VwcG9ydGVkUGFja1ZlcnNpb25FeGNlcHRpb24uamF2YQpAQCAtNjIsNyArNjIsNyBAQCBwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRQYWNrVmVyc2lvbkV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gdmVyc2lvbgogCSAqICAgICAgICAgICAgcGFjayB2ZXJzaW9uCiAJICovCi0JcHVibGljIFVuc3VwcG9ydGVkUGFja1ZlcnNpb25FeGNlcHRpb24oZmluYWwgbG9uZyB2ZXJzaW9uKSB7CisJcHVibGljIFVuc3VwcG9ydGVkUGFja1ZlcnNpb25FeGNlcHRpb24obG9uZyB2ZXJzaW9uKSB7CiAJCXN1cGVyKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuc3VwcG9ydGVkUGFja1ZlcnNpb24sCiAJCQkJTG9uZy52YWx1ZU9mKHZlcnNpb24pKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ldmVudHMvSW5kZXhDaGFuZ2VkRXZlbnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZXZlbnRzL0luZGV4Q2hhbmdlZEV2ZW50LmphdmEKaW5kZXggNjQ3ZWM4YS4uZGNjZTg2YSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ldmVudHMvSW5kZXhDaGFuZ2VkRXZlbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2V2ZW50cy9JbmRleENoYW5nZWRFdmVudC5qYXZhCkBAIC00Nyw2ICs0NywyOCBAQAogICogRGVzY3JpYmVzIGEgY2hhbmdlIHRvIG9uZSBvciBtb3JlIHBhdGhzIGluIHRoZSBpbmRleCBmaWxlLgogICovCiBwdWJsaWMgY2xhc3MgSW5kZXhDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBSZXBvc2l0b3J5RXZlbnQ8SW5kZXhDaGFuZ2VkTGlzdGVuZXI+IHsKKwlwcml2YXRlIGJvb2xlYW4gaW50ZXJuYWw7CisKKwkvKioKKwkgKiBOb3RpZnkgdGhhdCB0aGUgaW5kZXggY2hhbmdlZAorCSAqCisJICogQHBhcmFtIGludGVybmFsCisJICogICAgICAgICAgICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGluZGV4IHdhcyBjaGFuZ2VkIGJ5IHRoZSBzYW1lCisJICogICAgICAgICAgICAgICAgICAgICBKR2l0IHByb2Nlc3MKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIEluZGV4Q2hhbmdlZEV2ZW50KGJvb2xlYW4gaW50ZXJuYWwpIHsKKwkJdGhpcy5pbnRlcm5hbCA9IGludGVybmFsOworCX0KKworCS8qKgorCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBpbmRleCB3YXMgY2hhbmdlZCBieSB0aGUgc2FtZSBKR2l0IHByb2Nlc3MKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIGJvb2xlYW4gaXNJbnRlcm5hbCgpIHsKKwkJcmV0dXJuIGludGVybmFsOworCX0KKwogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIENsYXNzPEluZGV4Q2hhbmdlZExpc3RlbmVyPiBnZXRMaXN0ZW5lclR5cGUoKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvQ2hhcmFjdGVySGVhZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0NoYXJhY3RlckhlYWQuamF2YQppbmRleCA5OGFlZTBlLi43MDM5YzNkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvQ2hhcmFjdGVySGVhZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9DaGFyYWN0ZXJIZWFkLmphdmEKQEAgLTUzLDE0ICs1MywxNCBAQCBmaW5hbCBjbGFzcyBDaGFyYWN0ZXJIZWFkIGV4dGVuZHMgQWJzdHJhY3RIZWFkIHsKIAkgKiBAcGFyYW0gZXhwZWN0ZWRDaGFyYWN0ZXIKIAkgKiAgICAgICAgICAgIGV4cGVjdGVkIHtAY29kZSBjaGFyfQogCSAqLwotCXByb3RlY3RlZCBDaGFyYWN0ZXJIZWFkKGZpbmFsIGNoYXIgZXhwZWN0ZWRDaGFyYWN0ZXIpIHsKKwlwcm90ZWN0ZWQgQ2hhcmFjdGVySGVhZChjaGFyIGV4cGVjdGVkQ2hhcmFjdGVyKSB7CiAJCXN1cGVyKGZhbHNlKTsKIAkJdGhpcy5leHBlY3RlZENoYXJhY3RlciA9IGV4cGVjdGVkQ2hhcmFjdGVyOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWF0Y2hlcyhmaW5hbCBjaGFyIGMpIHsKKwlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYXRjaGVzKGNoYXIgYykgewogCQlyZXR1cm4gYyA9PSBleHBlY3RlZENoYXJhY3RlcjsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9GaWxlTmFtZU1hdGNoZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9GaWxlTmFtZU1hdGNoZXIuamF2YQppbmRleCA1NjYzMDM5Li5iZmNjNTgwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvRmlsZU5hbWVNYXRjaGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0ZpbGVOYW1lTWF0Y2hlci5qYXZhCkBAIC0xMDUsNyArMTA1LDcgQEAgcHVibGljIGNsYXNzIEZpbGVOYW1lTWF0Y2hlciB7CiAJICogQHBhcmFtIGhlYWRzU3RhcnRWYWx1ZQogCSAqICAgICAgICAgICAgbXVzdCBiZSBhIGxpc3Qgd2hpY2ggd2lsbCBuZXZlciBiZSBtb2RpZmllZC4KIAkgKi8KLQlwcml2YXRlIEZpbGVOYW1lTWF0Y2hlcihmaW5hbCBMaXN0PEhlYWQ+IGhlYWRzU3RhcnRWYWx1ZSkgeworCXByaXZhdGUgRmlsZU5hbWVNYXRjaGVyKExpc3Q8SGVhZD4gaGVhZHNTdGFydFZhbHVlKSB7CiAJCXRoaXMoaGVhZHNTdGFydFZhbHVlLCBoZWFkc1N0YXJ0VmFsdWUpOwogCX0KIApAQCAtMzE1LDcgKzMxNSw3IEBAIHByaXZhdGUgc3RhdGljIEFic3RyYWN0SGVhZCBjcmVhdGVXaWxkQ2FyZEhlYWQoCiAJICogQHBhcmFtIGMgbmV3IGNoYXJhY3RlciB0byBhcHBlbmQKIAkgKiBAcmV0dXJuIHRydWUgdG8gY29udGludWUsIGZhbHNlIGlmIHRoZSBtYXRjaGVyIGNhbiBzdG9wIGFwcGVuZGluZwogCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleHRlbmRTdHJpbmdUb01hdGNoQnlPbmVDaGFyYWN0ZXIoZmluYWwgY2hhciBjKSB7CisJcHJpdmF0ZSBib29sZWFuIGV4dGVuZFN0cmluZ1RvTWF0Y2hCeU9uZUNoYXJhY3RlcihjaGFyIGMpIHsKIAkJZmluYWwgTGlzdDxIZWFkPiBuZXdIZWFkcyA9IGxpc3RGb3JMb2NhbFVzZWFnZTsKIAkJbmV3SGVhZHMuY2xlYXIoKTsKIAkJTGlzdDxIZWFkPiBsYXN0QWRkZWRIZWFkcyA9IG51bGw7CkBAIC0zNTcsNyArMzU3LDcgQEAgcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2ZVbmVzY2FwZWQoZmluYWwgU3RyaW5nIHNlYXJjaFN0cmluZywKIAkgKiAgICAgICAgICAgIGV4dGVuZHMgdGhlIHN0cmluZyB3aGljaCBpcyBtYXRjaGVkIGFnYWluc3QgdGhlIHBhdHRlcm5zIG9mCiAJICogICAgICAgICAgICB0aGlzIGNsYXNzLgogCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZChmaW5hbCBTdHJpbmcgc3RyaW5nVG9NYXRjaCkgeworCXB1YmxpYyB2b2lkIGFwcGVuZChTdHJpbmcgc3RyaW5nVG9NYXRjaCkgewogCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ1RvTWF0Y2gubGVuZ3RoKCk7IGkrKykgewogCQkJZmluYWwgY2hhciBjID0gc3RyaW5nVG9NYXRjaC5jaGFyQXQoaSk7CiAJCQlpZiAoIWV4dGVuZFN0cmluZ1RvTWF0Y2hCeU9uZUNoYXJhY3RlcihjKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9Hcm91cEhlYWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9Hcm91cEhlYWQuamF2YQppbmRleCA5NjVkOTAwLi4xZGM1OTMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvR3JvdXBIZWFkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL0dyb3VwSGVhZC5qYXZhCkBAIC02MSw3ICs2MSw3IEBAIGZpbmFsIGNsYXNzIEdyb3VwSGVhZCBleHRlbmRzIEFic3RyYWN0SGVhZCB7CiAKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaW52ZXJzZTsKIAotCUdyb3VwSGVhZChTdHJpbmcgcGF0dGVybiwgZmluYWwgU3RyaW5nIHdob2xlUGF0dGVybikKKwlHcm91cEhlYWQoU3RyaW5nIHBhdHRlcm4sIFN0cmluZyB3aG9sZVBhdHRlcm4pCiAJCQl0aHJvd3MgSW52YWxpZFBhdHRlcm5FeGNlcHRpb24gewogCQlzdXBlcihmYWxzZSk7CiAJCXRoaXMuY2hhcmFjdGVyQ2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwpAQCAtMTMyLDcgKzEzMiw3IEBAIGZpbmFsIGNsYXNzIEdyb3VwSGVhZCBleHRlbmRzIEFic3RyYWN0SGVhZCB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1hdGNoZXMoZmluYWwgY2hhciBjKSB7CisJcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWF0Y2hlcyhjaGFyIGMpIHsKIAkJZm9yIChDaGFyYWN0ZXJQYXR0ZXJuIHBhdHRlcm4gOiBjaGFyYWN0ZXJDbGFzc2VzKSB7CiAJCQlpZiAocGF0dGVybi5tYXRjaGVzKGMpKSB7CiAJCQkJcmV0dXJuICFpbnZlcnNlOwpAQCAtMjE0LDcgKzIxNCw3IEBAIHB1YmxpYyBmaW5hbCBib29sZWFuIG1hdGNoZXMoY2hhciBjKSB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgT25lQ2hhcmFjdGVyUGF0dGVybiBpbXBsZW1lbnRzIENoYXJhY3RlclBhdHRlcm4gewogCQlwcml2YXRlIGNoYXIgZXhwZWN0ZWRDaGFyYWN0ZXI7CiAKLQkJT25lQ2hhcmFjdGVyUGF0dGVybihmaW5hbCBjaGFyIGMpIHsKKwkJT25lQ2hhcmFjdGVyUGF0dGVybihjaGFyIGMpIHsKIAkJCXRoaXMuZXhwZWN0ZWRDaGFyYWN0ZXIgPSBjOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9SZXN0cmljdGVkV2lsZENhcmRIZWFkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvUmVzdHJpY3RlZFdpbGRDYXJkSGVhZC5qYXZhCmluZGV4IGMxMzJlMjguLjQ1ZTZlZDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9SZXN0cmljdGVkV2lsZENhcmRIZWFkLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL1Jlc3RyaWN0ZWRXaWxkQ2FyZEhlYWQuamF2YQpAQCAtNDcsMTQgKzQ3LDE0IEBACiBmaW5hbCBjbGFzcyBSZXN0cmljdGVkV2lsZENhcmRIZWFkIGV4dGVuZHMgQWJzdHJhY3RIZWFkIHsKIAlwcml2YXRlIGZpbmFsIGNoYXIgZXhjbHVkZWRDaGFyYWN0ZXI7CiAKLQlSZXN0cmljdGVkV2lsZENhcmRIZWFkKGZpbmFsIGNoYXIgZXhjbHVkZWRDaGFyYWN0ZXIsIGZpbmFsIGJvb2xlYW4gc3RhcikgeworCVJlc3RyaWN0ZWRXaWxkQ2FyZEhlYWQoY2hhciBleGNsdWRlZENoYXJhY3RlciwgYm9vbGVhbiBzdGFyKSB7CiAJCXN1cGVyKHN0YXIpOwogCQl0aGlzLmV4Y2x1ZGVkQ2hhcmFjdGVyID0gZXhjbHVkZWRDaGFyYWN0ZXI7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYXRjaGVzKGZpbmFsIGNoYXIgYykgeworCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIG1hdGNoZXMoY2hhciBjKSB7CiAJCXJldHVybiBjICE9IGV4Y2x1ZGVkQ2hhcmFjdGVyOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL1dpbGRDYXJkSGVhZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9mbm1hdGNoL1dpbGRDYXJkSGVhZC5qYXZhCmluZGV4IGM4MDZlMjMuLjA3MzYyYWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZm5tYXRjaC9XaWxkQ2FyZEhlYWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ZubWF0Y2gvV2lsZENhcmRIZWFkLmphdmEKQEAgLTUxLDcgKzUxLDcgQEAgZmluYWwgY2xhc3MgV2lsZENhcmRIZWFkIGV4dGVuZHMgQWJzdHJhY3RIZWFkIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gbWF0Y2hlcyhmaW5hbCBjaGFyIGMpIHsKKwlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBtYXRjaGVzKGNoYXIgYykgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb0NvbW1hbmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhCmluZGV4IDhiOGRmODcuLjgwZmQzY2YgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvQ29tbWFuZC5qYXZhCkBAIC00MTMsNyArNDEzLDcgQEAgcHVibGljIFJlcG9Db21tYW5kIHNldFJlY29tbWVuZFNoYWxsb3coYm9vbGVhbiBlbmFibGUpIHsKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlByb2dyZXNzTW9uaXRvcn0KIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRQcm9ncmVzc01vbml0b3IoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKKwlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0UHJvZ3Jlc3NNb25pdG9yKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7CiAJCXRoaXMubW9uaXRvciA9IG1vbml0b3I7CiAJCXJldHVybiB0aGlzOwogCX0KQEAgLTQ0OCw3ICs0NDgsNyBAQCBwdWJsaWMgUmVwb0NvbW1hbmQgc2V0SWdub3JlUmVtb3RlRmFpbHVyZXMoYm9vbGVhbiBpZ25vcmUpIHsKIAkgKiAgICAgICAgICAgIHRoZSBhdXRob3IncyB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuUGVyc29uSWRlbnR9CiAJICogQHJldHVybiB0aGlzIGNvbW1hbmQKIAkgKi8KLQlwdWJsaWMgUmVwb0NvbW1hbmQgc2V0QXV0aG9yKGZpbmFsIFBlcnNvbklkZW50IGF1dGhvcikgeworCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRBdXRob3IoUGVyc29uSWRlbnQgYXV0aG9yKSB7CiAJCXRoaXMuYXV0aG9yID0gYXV0aG9yOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC00NjMsNyArNDYzLDcgQEAgcHVibGljIFJlcG9Db21tYW5kIHNldEF1dGhvcihmaW5hbCBQZXJzb25JZGVudCBhdXRob3IpIHsKIAkgKiAgICAgICAgICAgIG9iamVjdC4KIAkgKiBAcmV0dXJuIHRoaXMgY29tbWFuZAogCSAqLwotCXB1YmxpYyBSZXBvQ29tbWFuZCBzZXRSZW1vdGVSZWFkZXIoZmluYWwgUmVtb3RlUmVhZGVyIGNhbGxiYWNrKSB7CisJcHVibGljIFJlcG9Db21tYW5kIHNldFJlbW90ZVJlYWRlcihSZW1vdGVSZWFkZXIgY2FsbGJhY2spIHsKIAkJdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOwogCQlyZXR1cm4gdGhpczsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2dpdHJlcG8vUmVwb1Byb2plY3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvUHJvamVjdC5qYXZhCmluZGV4IGU4Mjc2MTIuLjdiYTgzYzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvUHJvamVjdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvZ2l0cmVwby9SZXBvUHJvamVjdC5qYXZhCkBAIC0xMzEsMTggKzEzMSwxMCBAQCBwdWJsaWMgdm9pZCBjb3B5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCUZpbGUgc3JjRmlsZSA9IG5ldyBGaWxlKHJlcG8uZ2V0V29ya1RyZWUoKSwKIAkJCQkJcGF0aCArICIvIiArIHNyYyk7IC8vJE5PTi1OTFMtMSQKIAkJCUZpbGUgZGVzdEZpbGUgPSBuZXcgRmlsZShyZXBvLmdldFdvcmtUcmVlKCksIGRlc3QpOwotCQkJRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmNGaWxlKTsKLQkJCXRyeSB7Ci0JCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJRmlsZUNoYW5uZWwgY2hhbm5lbCA9IGlucHV0LmdldENoYW5uZWwoKTsKLQkJCQkJb3V0cHV0LmdldENoYW5uZWwoKS50cmFuc2ZlckZyb20oCi0JCQkJCQkJY2hhbm5lbCwgMCwgY2hhbm5lbC5zaXplKCkpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCW91dHB1dC5jbG9zZSgpOwotCQkJCX0KLQkJCX0gZmluYWxseSB7Ci0JCQkJaW5wdXQuY2xvc2UoKTsKKwkJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShzcmNGaWxlKTsKKwkJCQkJRmlsZU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZXN0RmlsZSkpIHsKKwkJCQlGaWxlQ2hhbm5lbCBjaGFubmVsID0gaW5wdXQuZ2V0Q2hhbm5lbCgpOworCQkJCW91dHB1dC5nZXRDaGFubmVsKCkudHJhbnNmZXJGcm9tKGNoYW5uZWwsIDAsIGNoYW5uZWwuc2l6ZSgpKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaG9va3MvR2l0SG9vay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9HaXRIb29rLmphdmEKaW5kZXggYWQ0M2UyYy4uOGE2MWQxYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9HaXRIb29rLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9HaXRIb29rLmphdmEKQEAgLTQyLDcgKzQyLDcgQEAKICAqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0Lmhvb2tzOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwpAQCAtMTU4LDcgKzE1OCw3IEBAIHByb3RlY3RlZCB2b2lkIGRvUnVuKCkgdGhyb3dzIEFib3J0ZWRCeUhvb2tFeGNlcHRpb24gewogCQlQcmludFN0cmVhbSBob29rRXJyUmVkaXJlY3QgPSBudWxsOwogCQl0cnkgewogCQkJaG9va0VyclJlZGlyZWN0ID0gbmV3IFByaW50U3RyZWFtKGVycm9yQnl0ZUFycmF5LCBmYWxzZSwKLQkJCQkJVVRGXzgubmFtZSgpKTsKKwkJCQkJQ0hBUlNFVC5uYW1lKCkpOwogCQl9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKIAkJCS8vIFVURi04IGlzIGd1YXJhbnRlZWQgdG8gYmUgYXZhaWxhYmxlCiAJCX0KQEAgLTE2Nyw3ICsxNjcsNyBAQCBwcm90ZWN0ZWQgdm9pZCBkb1J1bigpIHRocm93cyBBYm9ydGVkQnlIb29rRXhjZXB0aW9uIHsKIAkJCQlob29rRXJyUmVkaXJlY3QsIGdldFN0ZGluQXJncygpKTsKIAkJaWYgKHJlc3VsdC5pc0V4ZWN1dGVkV2l0aEVycm9yKCkpIHsKIAkJCXRocm93IG5ldyBBYm9ydGVkQnlIb29rRXhjZXB0aW9uKAotCQkJCQluZXcgU3RyaW5nKGVycm9yQnl0ZUFycmF5LnRvQnl0ZUFycmF5KCksIFVURl84KSwKKwkJCQkJbmV3IFN0cmluZyhlcnJvckJ5dGVBcnJheS50b0J5dGVBcnJheSgpLCBDSEFSU0VUKSwKIAkJCQkJZ2V0SG9va05hbWUoKSwgcmVzdWx0LmdldEV4aXRDb2RlKCkpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9Ib29rcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9ob29rcy9Ib29rcy5qYXZhCmluZGV4IDc5Mzk1ZWQuLmI4MDFkNjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaG9va3MvSG9va3MuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2hvb2tzL0hvb2tzLmphdmEKQEAgLTExNSw3ICsxMTUsMTEgQEAgcHVibGljIHN0YXRpYyBQcmVQdXNoSG9vayBwcmVQdXNoKFJlcG9zaXRvcnkgcmVwbywgUHJpbnRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7CiAJCQkJCW91dHB1dFN0cmVhbSk7CiAJCQlpZiAoaG9vayAhPSBudWxsKSB7CiAJCQkJaWYgKGhvb2suaXNOYXRpdmVIb29rUHJlc2VudCgpKSB7Ci0JCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQlQcmludFN0cmVhbSBwcyA9IG91dHB1dFN0cmVhbTsKKwkJCQkJaWYgKHBzID09IG51bGwpIHsKKwkJCQkJCXBzID0gU3lzdGVtLm91dDsKKwkJCQkJfQorCQkJCQlwcy5wcmludGxuKE1lc3NhZ2VGb3JtYXQKIAkJCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmxmc0hvb2tDb25mbGljdCwgcmVwbykpOwogCQkJCX0KIAkJCQlyZXR1cm4gaG9vazsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0lnbm9yZU5vZGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaWdub3JlL0lnbm9yZU5vZGUuamF2YQppbmRleCAxMjI0ZGY0Li5kNTcwZmRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2lnbm9yZS9JZ25vcmVOb2RlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pZ25vcmUvSWdub3JlTm9kZS5qYXZhCkBAIC0xNjMsMzUgKzE2Myw2IEBAIHB1YmxpYyBNYXRjaFJlc3VsdCBpc0lnbm9yZWQoU3RyaW5nIGVudHJ5UGF0aCwgYm9vbGVhbiBpc0RpcmVjdG9yeSkgewogCSAqICAgICAgICAgICAgKHVzZXMgJy8nIGFuZCBub3QgJ1wnKS4KIAkgKiBAcGFyYW0gaXNEaXJlY3RvcnkKIAkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIHRhcmdldCBpdGVtIGlzIGEgZGlyZWN0b3J5LgotCSAqIEBwYXJhbSBuZWdhdGVGaXJzdE1hdGNoCi0JICogICAgICAgICAgICB0cnVlIGlmIHRoZSBmaXJzdCBtYXRjaCBzaG91bGQgYmUgbmVnYXRlZAotCSAqIEBkZXByZWNhdGVkIG5lZ2F0ZUZpcnN0TWF0Y2ggaXMgbm90IGhvbm9yZWQgYW55bW9yZQotCSAqIEByZXR1cm4gc3RhdHVzIG9mIHRoZSBwYXRoLgotCSAqIEBzaW5jZSAzLjYKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBNYXRjaFJlc3VsdCBpc0lnbm9yZWQoU3RyaW5nIGVudHJ5UGF0aCwgYm9vbGVhbiBpc0RpcmVjdG9yeSwKLQkJCWJvb2xlYW4gbmVnYXRlRmlyc3RNYXRjaCkgewotCQlmaW5hbCBCb29sZWFuIHJlc3VsdCA9IGNoZWNrSWdub3JlZChlbnRyeVBhdGgsIGlzRGlyZWN0b3J5KTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmVnYXRlRmlyc3RNYXRjaAotCQkJCQk/IE1hdGNoUmVzdWx0LkNIRUNLX1BBUkVOVF9ORUdBVEVfRklSU1RfTUFUQ0gKLQkJCQkJOiBNYXRjaFJlc3VsdC5DSEVDS19QQVJFTlQ7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpID8gTWF0Y2hSZXN1bHQuSUdOT1JFRAotCQkJCTogTWF0Y2hSZXN1bHQuTk9UX0lHTk9SRUQ7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGlmIGFuIGVudHJ5IHBhdGggbWF0Y2hlcyBhbiBpZ25vcmUgcnVsZS4KLQkgKgotCSAqIEBwYXJhbSBlbnRyeVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIHRlc3QuIFRoZSBwYXRoIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhpcyBpZ25vcmUKLQkgKiAgICAgICAgICAgIG5vZGUncyBvd24gcmVwb3NpdG9yeSBwYXRoLCBhbmQgaW4gcmVwb3NpdG9yeSBwYXRoIGZvcm1hdAotCSAqICAgICAgICAgICAgKHVzZXMgJy8nIGFuZCBub3QgJ1wnKS4KLQkgKiBAcGFyYW0gaXNEaXJlY3RvcnkKLQkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIHRhcmdldCBpdGVtIGlzIGEgZGlyZWN0b3J5LgogCSAqIEByZXR1cm4gQm9vbGVhbi5UUlVFLCBpZiB0aGUgZW50cnkgaXMgaWdub3JlZDsgQm9vbGVhbi5GQUxTRSwgaWYgdGhlCiAJICogICAgICAgICBlbnRyeSBpcyBmb3JjZWQgdG8gYmUgbm90IGlnbm9yZWQgKG5lZ2F0ZWQgbWF0Y2gpOyBvciBudWxsLCBpZgogCSAqICAgICAgICAgdW5kZXRlcm1pbmVkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL0pHaXRUZXh0LmphdmEKaW5kZXggMTIwZDZhZC4uZDJmNjIzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9KR2l0VGV4dC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvSkdpdFRleHQuamF2YQpAQCAtMjg3LDYgKzI4Nyw4IEBAIHB1YmxpYyBzdGF0aWMgSkdpdFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgY3JlZGVudGlhbFVzZXJuYW1lOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGFlbW9uQWxyZWFkeVJ1bm5pbmc7CiAJLyoqKi8gcHVibGljIFN0cmluZyBkYXlzQWdvOworCS8qKiovIHB1YmxpYyBTdHJpbmcgZGVlcGVuTm90V2l0aERlZXBlbjsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGRlZXBlblNpbmNlV2l0aERlZXBlbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGRlbGV0ZUJyYW5jaFVuZXhwZWN0ZWRSZXN1bHQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBkZWxldGVGaWxlRmFpbGVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZGVsZXRlUmVxdWlyZXNaZXJvTmV3SWQ7CkBAIC0zNzIsNiArMzc0LDcgQEAgcHVibGljIHN0YXRpYyBKR2l0VGV4dCBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBmaWxlTW9kZU5vdFNldEZvclBhdGg7CiAJLyoqKi8gcHVibGljIFN0cmluZyBmaWx0ZXJFeGVjdXRpb25GYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBmaWx0ZXJFeGVjdXRpb25GYWlsZWRSYzsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGZpbHRlclJlcXVpcmVzQ2FwYWJpbGl0eTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGZpbmRpbmdHYXJiYWdlOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgZmxhZ0lzRGlzcG9zZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBmbGFnTm90RnJvbVRoaXM7CkBAIC00MjMsNiArNDI2LDcgQEAgcHVibGljIHN0YXRpYyBKR2l0VGV4dCBnZXQoKSB7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkRGVwdGg7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkRW5jcnlwdGlvbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRFeHBhbmRXaWxkY2FyZDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRGaWx0ZXI7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkR2l0ZGlyUmVmOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgaW52YWxpZEdpdE1vZHVsZXM7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkR2l0VHlwZTsKQEAgLTQ1OCw2ICs0NjIsNyBAQCBwdWJsaWMgc3RhdGljIEpHaXRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRTeXN0ZW1Qcm9wZXJ0eTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRUYWdPcHRpb247CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkVGltZW91dDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIGludmFsaWRUaW1lc3RhbXA7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkVGltZVVuaXRWYWx1ZTI7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkVGltZVVuaXRWYWx1ZTM7CiAJLyoqKi8gcHVibGljIFN0cmluZyBpbnZhbGlkVHJlZVplcm9MZW5ndGhOYW1lOwpAQCAtNjkwLDYgKzY5NSw3IEBAIHB1YmxpYyBzdGF0aWMgSkdpdFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgc291cmNlUmVmRG9lc250UmVzb2x2ZVRvQW55T2JqZWN0OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc291cmNlUmVmTm90U3BlY2lmaWVkRm9yUmVmc3BlYzsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHNxdWFzaENvbW1pdE5vdFVwZGF0aW5nSEVBRDsKKwkvKioqLyBwdWJsaWMgU3RyaW5nIHNzaENvbW1hbmRGYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2hVc2VyTmFtZUVycm9yOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgc3NsRmFpbHVyZUV4Y2VwdGlvbk1lc3NhZ2U7CiAJLyoqKi8gcHVibGljIFN0cmluZyBzc2xGYWlsdXJlSW5mbzsKQEAgLTczNSw2ICs3NDEsNyBAQCBwdWJsaWMgc3RhdGljIEpHaXRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRpbWVJc1VuY2VydGFpbjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRpbWVyQWxyZWFkeVRlcm1pbmF0ZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB0b29NYW55Q29tbWFuZHM7CisJLyoqKi8gcHVibGljIFN0cmluZyB0b29NYW55RmlsdGVyczsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRvb01hbnlJbmNsdWRlUmVjdXJzaW9uczsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHRvcG9sb2dpY2FsU29ydFJlcXVpcmVkOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdHJhbnNwb3J0RXhjZXB0aW9uQmFkUmVmOwpAQCAtNzc3LDYgKzc4NCw3IEBAIHB1YmxpYyBzdGF0aWMgSkdpdFRleHQgZ2V0KCkgewogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5leHBlY3RlZEVvZkluUGFjazsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVuZXhwZWN0ZWRIdW5rVHJhaWxlcjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVuZXhwZWN0ZWRPZGRSZXN1bHQ7CisJLyoqKi8gcHVibGljIFN0cmluZyB1bmV4cGVjdGVkUGFja2V0TGluZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVuZXhwZWN0ZWRSZWZSZXBvcnQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmV4cGVjdGVkUmVwb3J0TGluZTsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVuZXhwZWN0ZWRSZXBvcnRMaW5lMjsKQEAgLTc5MSw2ICs3OTksNyBAQCBwdWJsaWMgc3RhdGljIEpHaXRUZXh0IGdldCgpIHsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVua25vd25PYmplY3RUeXBlMjsKIAkvKioqLyBwdWJsaWMgU3RyaW5nIHVua25vd25SZXBvc2l0b3J5Rm9ybWF0OwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5rbm93blJlcG9zaXRvcnlGb3JtYXQyOworCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5rbm93blRyYW5zcG9ydENvbW1hbmQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bmtub3duWmxpYkVycm9yOwogCS8qKiovIHB1YmxpYyBTdHJpbmcgdW5sb2NrTG9ja0ZpbGVGYWlsZWQ7CiAJLyoqKi8gcHVibGljIFN0cmluZyB1bm1lcmdlZFBhdGg7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0tldGNoU3lzdGVtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0tldGNoU3lzdGVtLmphdmEKaW5kZXggMTkwOGQ2Yy4uZDFkNGY2NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9LZXRjaFN5c3RlbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvS2V0Y2hTeXN0ZW0uamF2YQpAQCAtMjYwLDcgKzI2MCw3IEBAIHB1YmxpYyBTdHJpbmcgbmV3TGVhZGVyVGFnKCkgewogCSAqIEB0aHJvd3MgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBmb2xsb3dlciBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGFuIHVuc3VwcG9ydGVkIFVSSS4KIAkgKi8KLQlwdWJsaWMgS2V0Y2hMZWFkZXIgY3JlYXRlTGVhZGVyKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykKKwlwdWJsaWMgS2V0Y2hMZWFkZXIgY3JlYXRlTGVhZGVyKFJlcG9zaXRvcnkgcmVwbykKIAkJCXRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewogCQlLZXRjaExlYWRlciBsZWFkZXIgPSBuZXcgS2V0Y2hMZWFkZXIodGhpcykgewogCQkJQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0xvY2FsUmVwbGljYS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9Mb2NhbFJlcGxpY2EuamF2YQppbmRleCA5YzM3YTkwLi43ZGRkZTYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL2tldGNoL0xvY2FsUmVwbGljYS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvTG9jYWxSZXBsaWNhLmphdmEKQEAgLTEyMiw3ICsxMjIsNyBAQCB2b2lkIGluaXRpYWxpemUoUmVwb3NpdG9yeSByZXBvKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFB1c2goZmluYWwgUmVwbGljYVB1c2hSZXF1ZXN0IHJlcSkgeworCXByb3RlY3RlZCB2b2lkIHN0YXJ0UHVzaChSZXBsaWNhUHVzaFJlcXVlc3QgcmVxKSB7CiAJCWdldFN5c3RlbSgpLmdldEV4ZWN1dG9yKCkuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwva2V0Y2gvUmVtb3RlR2l0UmVwbGljYS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9SZW1vdGVHaXRSZXBsaWNhLmphdmEKaW5kZXggNjc0ZGExZi4uYjYxMjc0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9SZW1vdGVHaXRSZXBsaWNhLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9rZXRjaC9SZW1vdGVHaXRSZXBsaWNhLmphdmEKQEAgLTEzOCw3ICsxMzgsNyBAQCBwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaWJlRm9yTG9nKCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCBzdGFydFB1c2goZmluYWwgUmVwbGljYVB1c2hSZXF1ZXN0IHJlcSkgeworCXByb3RlY3RlZCB2b2lkIHN0YXJ0UHVzaChSZXBsaWNhUHVzaFJlcXVlc3QgcmVxKSB7CiAJCWdldFN5c3RlbSgpLmdldEV4ZWN1dG9yKCkuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKaW5kZXggMTRkYzgwZi4uNDY4Nzk1MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlLmphdmEKQEAgLTE4MSw3ICsxODEsNyBAQCBwdWJsaWMgc3RhdGljIERmc0Jsb2NrQ2FjaGUgZ2V0SW5zdGFuY2UoKSB7CiAJcHJpdmF0ZSBSZWYgY2xvY2tIYW5kOwogCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBEZnNCbG9ja0NhY2hlKGZpbmFsIERmc0Jsb2NrQ2FjaGVDb25maWcgY2ZnKSB7CisJcHJpdmF0ZSBEZnNCbG9ja0NhY2hlKERmc0Jsb2NrQ2FjaGVDb25maWcgY2ZnKSB7CiAJCXRhYmxlU2l6ZSA9IHRhYmxlU2l6ZShjZmcpOwogCQlpZiAodGFibGVTaXplIDwgMSkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkudFNpemVNdXN0QmVHcmVhdGVyT3JFcXVhbDEpOwpAQCAtMzMwLDcgKzMzMCw3IEBAIGludCBnZXRCbG9ja1NpemUoKSB7CiAJCXJldHVybiBibG9ja1NpemU7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlU2l6ZShmaW5hbCBEZnNCbG9ja0NhY2hlQ29uZmlnIGNmZykgeworCXByaXZhdGUgc3RhdGljIGludCB0YWJsZVNpemUoRGZzQmxvY2tDYWNoZUNvbmZpZyBjZmcpIHsKIAkJZmluYWwgaW50IHdzeiA9IGNmZy5nZXRCbG9ja1NpemUoKTsKIAkJZmluYWwgbG9uZyBsaW1pdCA9IGNmZy5nZXRCbG9ja0xpbWl0KCk7CiAJCWlmICh3c3ogPD0gMCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzQmxvY2tDYWNoZUNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlQ29uZmlnLmphdmEKaW5kZXggY2Q3OTAxYi4uZGQ3Y2I4OSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNCbG9ja0NhY2hlQ29uZmlnLmphdmEKQEAgLTEwNiw3ICsxMDYsNyBAQCBwdWJsaWMgbG9uZyBnZXRCbG9ja0xpbWl0KCkgewogCSAqICAgICAgICAgICAgcGFjayBmaWxlIGRhdGE7IG11c3QgYmUgcG9zaXRpdmUuCiAJICogQHJldHVybiB7QGNvZGUgdGhpc30KIAkgKi8KLQlwdWJsaWMgRGZzQmxvY2tDYWNoZUNvbmZpZyBzZXRCbG9ja0xpbWl0KGZpbmFsIGxvbmcgbmV3TGltaXQpIHsKKwlwdWJsaWMgRGZzQmxvY2tDYWNoZUNvbmZpZyBzZXRCbG9ja0xpbWl0KGxvbmcgbmV3TGltaXQpIHsKIAkJaWYgKG5ld0xpbWl0IDw9IDApIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCUpHaXRUZXh0LmdldCgpLmJsb2NrTGltaXROb3RQb3NpdGl2ZSwKQEAgLTEzNSw3ICsxMzUsNyBAQCBwdWJsaWMgaW50IGdldEJsb2NrU2l6ZSgpIHsKIAkgKiAgICAgICAgICAgIFRoZSB2YWx1ZSBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIHNldEJsb2NrU2l6ZShmaW5hbCBpbnQgbmV3U2l6ZSkgeworCXB1YmxpYyBEZnNCbG9ja0NhY2hlQ29uZmlnIHNldEJsb2NrU2l6ZShpbnQgbmV3U2l6ZSkgewogCQlpbnQgc2l6ZSA9IE1hdGgubWF4KDUxMiwgbmV3U2l6ZSk7CiAJCWlmICgoc2l6ZSAmIChzaXplIC0gMSkpICE9IDApIHsKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCkBAIC0yMDYsNyArMjA2LDcgQEAgcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgc2V0U3RyZWFtUmF0aW8oZG91YmxlIHJhdGlvKSB7CiAJICogICAgICAgICAgICBjb25maWd1cmF0aW9uIHRvIHJlYWQgcHJvcGVydGllcyBmcm9tLgogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9CiAJICovCi0JcHVibGljIERmc0Jsb2NrQ2FjaGVDb25maWcgZnJvbUNvbmZpZyhmaW5hbCBDb25maWcgcmMpIHsKKwlwdWJsaWMgRGZzQmxvY2tDYWNoZUNvbmZpZyBmcm9tQ29uZmlnKENvbmZpZyByYykgewogCQlsb25nIGNmZ0Jsb2NrTGltaXQgPSByYy5nZXRMb25nKAogCQkJCUNPTkZJR19DT1JFX1NFQ1RJT04sCiAJCQkJQ09ORklHX0RGU19TRUNUSU9OLApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNHYXJiYWdlQ29sbGVjdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0dhcmJhZ2VDb2xsZWN0b3IuamF2YQppbmRleCA2OTk4OWE0Li5jYTExZmI5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0dhcmJhZ2VDb2xsZWN0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0dhcmJhZ2VDb2xsZWN0b3IuamF2YQpAQCAtNDAzLDcgKzQwMyw3IEBAIHB1YmxpYyBib29sZWFuIHBhY2soUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCX0KIAogCXByaXZhdGUgQ29sbGVjdGlvbjxSZWY+IGdldEFsbFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlDb2xsZWN0aW9uPFJlZj4gcmVmcyA9IHJlZmRiLmdldFJlZnMoUmVmRGF0YWJhc2UuQUxMKS52YWx1ZXMoKTsKKwkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZWZkYi5nZXRSZWZzKCk7CiAJCUxpc3Q8UmVmPiBhZGRsID0gcmVmZGIuZ2V0QWRkaXRpb25hbFJlZnMoKTsKIAkJaWYgKCFhZGRsLmlzRW1wdHkoKSkgewogCQkJTGlzdDxSZWY+IGFsbCA9IG5ldyBBcnJheUxpc3Q8PihyZWZzLnNpemUoKSArIGFkZGwuc2l6ZSgpKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzSW5zZXJ0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzSW5zZXJ0ZXIuamF2YQppbmRleCBlYjBhNTI3Li4wZDllMmMxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc0luc2VydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNJbnNlcnRlci5qYXZhCkBAIC02OCw2ICs2OCw3IEBACiBpbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcjsKIGltcG9ydCBqYXZhLnV0aWwuemlwLkluZmxhdGVySW5wdXRTdHJlYW07CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvcnJ1cHRPYmplY3RFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5MYXJnZU9iamVjdEV4Y2VwdGlvbjsKQEAgLTMwOSw2ICszMTAsMTUgQEAgcHJpdmF0ZSB2b2lkIHNvcnRPYmplY3RzQnlJZCgpIHsKIAkJQ29sbGVjdGlvbnMuc29ydChvYmplY3RMaXN0KTsKIAl9CiAKKwlATnVsbGFibGUKKwlwcml2YXRlIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIG1heWJlR2V0VGVtcG9yYXJ5QnVmZmVyKAorCQkJTGlzdDxQYWNrZWRPYmplY3RJbmZvPiBsaXN0KSB7CisJCWlmIChsaXN0LnNpemUoKSA8PSA1ODAwMCkgeworCQkJcmV0dXJuIG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcCgyIDw8IDIwKTsKKwkJfQorCQlyZXR1cm4gbnVsbDsKKwl9CisKIAlQYWNrSW5kZXggd3JpdGVQYWNrSW5kZXgoRGZzUGFja0Rlc2NyaXB0aW9uIHBhY2ssIGJ5dGVbXSBwYWNrSGFzaCwKIAkJCUxpc3Q8UGFja2VkT2JqZWN0SW5mbz4gbGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcGFjay5zZXRJbmRleFZlcnNpb24oSU5ERVhfVkVSU0lPTik7CkBAIC0zMTcsMjcgKzMyNywyMCBAQCBQYWNrSW5kZXggd3JpdGVQYWNrSW5kZXgoRGZzUGFja0Rlc2NyaXB0aW9uIHBhY2ssIGJ5dGVbXSBwYWNrSGFzaCwKIAkJLy8gSWYgdGhlcmUgYXJlIGxlc3MgdGhhbiA1OCwwMDAgb2JqZWN0cywgdGhlIGVudGlyZSBpbmRleCBmaXRzIGluIHVuZGVyCiAJCS8vIDIgTWlCLiBDYWxsZXJzIHdpbGwgcHJvYmFibHkgbmVlZCB0aGUgaW5kZXggaW1tZWRpYXRlbHksIHNvIGJ1ZmZlcgogCQkvLyB0aGUgaW5kZXggaW4gcHJvY2VzcyBhbmQgbG9hZCBmcm9tIHRoZSBidWZmZXIuCi0JCVRlbXBvcmFyeUJ1ZmZlci5IZWFwIGJ1ZiA9IG51bGw7CiAJCVBhY2tJbmRleCBwYWNrSW5kZXggPSBudWxsOwotCQlpZiAobGlzdC5zaXplKCkgPD0gNTgwMDApIHsKLQkJCWJ1ZiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcCgyIDw8IDIwKTsKLQkJCWluZGV4KGJ1ZiwgcGFja0hhc2gsIGxpc3QpOwotCQkJcGFja0luZGV4ID0gUGFja0luZGV4LnJlYWQoYnVmLm9wZW5JbnB1dFN0cmVhbSgpKTsKLQkJfQotCi0JCXRyeSAoRGZzT3V0cHV0U3RyZWFtIG9zID0gZGIud3JpdGVGaWxlKHBhY2ssIElOREVYKSkgewotCQkJQ291bnRpbmdPdXRwdXRTdHJlYW0gY250ID0gbmV3IENvdW50aW5nT3V0cHV0U3RyZWFtKG9zKTsKLQkJCWlmIChidWYgIT0gbnVsbCkKKwkJdHJ5IChUZW1wb3JhcnlCdWZmZXIuSGVhcCBidWYgPSBtYXliZUdldFRlbXBvcmFyeUJ1ZmZlcihsaXN0KTsKKwkJCQlEZnNPdXRwdXRTdHJlYW0gb3MgPSBkYi53cml0ZUZpbGUocGFjaywgSU5ERVgpOworCQkJCUNvdW50aW5nT3V0cHV0U3RyZWFtIGNudCA9IG5ldyBDb3VudGluZ091dHB1dFN0cmVhbShvcykpIHsKKwkJCWlmIChidWYgIT0gbnVsbCkgeworCQkJCWluZGV4KGJ1ZiwgcGFja0hhc2gsIGxpc3QpOworCQkJCXBhY2tJbmRleCA9IFBhY2tJbmRleC5yZWFkKGJ1Zi5vcGVuSW5wdXRTdHJlYW0oKSk7CiAJCQkJYnVmLndyaXRlVG8oY250LCBudWxsKTsKLQkJCWVsc2UKKwkJCX0gZWxzZSB7CiAJCQkJaW5kZXgoY250LCBwYWNrSGFzaCwgbGlzdCk7CisJCQl9CiAJCQlwYWNrLmFkZEZpbGVFeHQoSU5ERVgpOwogCQkJcGFjay5zZXRCbG9ja1NpemUoSU5ERVgsIG9zLmJsb2NrU2l6ZSgpKTsKIAkJCXBhY2suc2V0RmlsZVNpemUoSU5ERVgsIGNudC5nZXRDb3VudCgpKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChidWYgIT0gbnVsbCkgewotCQkJCWJ1Zi5jbG9zZSgpOwotCQkJfQogCQl9CiAJCXJldHVybiBwYWNrSW5kZXg7CiAJfQpAQCAtNDAzLDcgKzQwNiw3IEBAIHByaXZhdGUgaW50IGVuY29kZVR5cGVTaXplKGludCB0eXBlLCBsb25nIHJhd0xlbmd0aCkgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWhkckJ1ZlswXSA9IChieXRlKSBiOwogCQkJd3JpdGUoaGRyQnVmLCAwLCAxKTsKIAkJfQpAQCAtNjY2LDYgKzY2OSw3IEBAIHByaXZhdGUgY2xhc3MgU3RyZWFtTG9hZGVyIGV4dGVuZHMgT2JqZWN0TG9hZGVyIHsKIAogCQlAT3ZlcnJpZGUKIAkJcHVibGljIE9iamVjdFN0cmVhbSBvcGVuU3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEV4cGxpY2l0bHkgY2xvc2VkIGJlbG93CiAJCQlmaW5hbCBEZnNSZWFkZXIgY3R4ID0gZGIubmV3UmVhZGVyKCk7CiAJCQlpZiAoc3JjUGFjayAhPSBwYWNrS2V5KSB7CiAJCQkJdHJ5IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqRGF0YWJhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqRGF0YWJhc2UuamF2YQppbmRleCA0MmIxYTQ3Li5jYTU0ZWUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc09iakRhdGFiYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNPYmpEYXRhYmFzZS5qYXZhCkBAIC00OTcsNyArNDk3LDcgQEAgdm9pZCBhZGRSZWZ0YWJsZShEZnNQYWNrRGVzY3JpcHRpb24gYWRkLCBTZXQ8RGZzUGFja0Rlc2NyaXB0aW9uPiByZW1vdmUpCiAJCX0gd2hpbGUgKCFwYWNrTGlzdC5jb21wYXJlQW5kU2V0KG8sIG4pKTsKIAl9CiAKLQlQYWNrTGlzdCBzY2FuUGFja3MoZmluYWwgUGFja0xpc3Qgb3JpZ2luYWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJUGFja0xpc3Qgc2NhblBhY2tzKFBhY2tMaXN0IG9yaWdpbmFsKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlQYWNrTGlzdCBvLCBuOwogCQlzeW5jaHJvbml6ZWQgKHBhY2tMaXN0KSB7CiAJCQlkbyB7CkBAIC01NDYsNyArNTQ2LDcgQEAgcHJpdmF0ZSBQYWNrTGlzdCBzY2FuUGFja3NJbXBsKFBhY2tMaXN0IG9sZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCX0KIAkJfQogCi0JCWlmIChuZXdQYWNrcy5pc0VtcHR5KCkpCisJCWlmIChuZXdQYWNrcy5pc0VtcHR5KCkgJiYgbmV3UmVmdGFibGVzLmlzRW1wdHkoKSkKIAkJCXJldHVybiBuZXcgUGFja0xpc3RJbXBsKE5PX1BBQ0tTLnBhY2tzLCBOT19QQUNLUy5yZWZ0YWJsZXMpOwogCQlpZiAoIWZvdW5kTmV3KSB7CiAJCQlvbGQuY2xlYXJEaXJ0eSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNPYmplY3RUb1BhY2suamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzT2JqZWN0VG9QYWNrLmphdmEKaW5kZXggM2EwNGQ3MC4uNWY0ZGVlMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNPYmplY3RUb1BhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc09iamVjdFRvUGFjay5qYXZhCkBAIC02MCw3ICs2MCw3IEBAIGNsYXNzIERmc09iamVjdFRvUGFjayBleHRlbmRzIE9iamVjdFRvUGFjayB7CiAJLyoqIExlbmd0aCBvZiB0aGUgZGF0YSBzZWN0aW9uIG9mIHRoZSBvYmplY3QuICovCiAJbG9uZyBsZW5ndGg7CiAKLQlEZnNPYmplY3RUb1BhY2soQW55T2JqZWN0SWQgc3JjLCBmaW5hbCBpbnQgdHlwZSkgeworCURmc09iamVjdFRvUGFjayhBbnlPYmplY3RJZCBzcmMsIGludCB0eXBlKSB7CiAJCXN1cGVyKHNyYywgdHlwZSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tDb21wYWN0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0NvbXBhY3Rvci5qYXZhCmluZGV4IGFiNzYzMzIuLmI0M2I5YjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0NvbXBhY3Rvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0NvbXBhY3Rvci5qYXZhCkBAIC0yNjgsOCArMjY4LDcgQEAgcHJpdmF0ZSB2b2lkIGNvbXBhY3RQYWNrcyhEZnNSZWFkZXIgY3R4LCBQcm9ncmVzc01vbml0b3IgcG0pCiAJCXBjLnNldFJldXNlRGVsdGFzKHRydWUpOwogCQlwYy5zZXRSZXVzZU9iamVjdHModHJ1ZSk7CiAKLQkJUGFja1dyaXRlciBwdyA9IG5ldyBQYWNrV3JpdGVyKHBjLCBjdHgpOwotCQl0cnkgeworCQl0cnkgKFBhY2tXcml0ZXIgcHcgPSBuZXcgUGFja1dyaXRlcihwYywgY3R4KSkgewogCQkJcHcuc2V0RGVsdGFCYXNlQXNPZmZzZXQodHJ1ZSk7CiAJCQlwdy5zZXRSZXVzZURlbHRhQ29tbWl0cyhmYWxzZSk7CiAKQEAgLTI4NSw4ICsyODQsNiBAQCBwcml2YXRlIHZvaWQgY29tcGFjdFBhY2tzKERmc1JlYWRlciBjdHgsIFByb2dyZXNzTW9uaXRvciBwbSkKIAkJCQl3cml0ZUluZGV4KG9iamRiLCBvdXREZXNjLCBwdyk7CiAKIAkJCQlQYWNrU3RhdGlzdGljcyBzdGF0cyA9IHB3LmdldFN0YXRpc3RpY3MoKTsKLQkJCQlwdy5jbG9zZSgpOwotCQkJCXB3ID0gbnVsbDsKIAogCQkJCW91dERlc2Muc2V0UGFja1N0YXRzKHN0YXRzKTsKIAkJCQluZXdTdGF0cyA9IHN0YXRzOwpAQCAtMjk2LDEwICsyOTMsNiBAQCBwcml2YXRlIHZvaWQgY29tcGFjdFBhY2tzKERmc1JlYWRlciBjdHgsIFByb2dyZXNzTW9uaXRvciBwbSkKIAkJCQkJb2JqZGIucm9sbGJhY2tQYWNrKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob3V0RGVzYykpOwogCQkJCX0KIAkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmIChwdyAhPSBudWxsKSB7Ci0JCQkJcHcuY2xvc2UoKTsKLQkJCX0KIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrRmlsZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNQYWNrRmlsZS5qYXZhCmluZGV4IDdlMzYwNDIuLjA1YjhmNjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUGFja0ZpbGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1BhY2tGaWxlLmphdmEKQEAgLTIwOSw4ICsyMDksNyBAQCBwcml2YXRlIFBhY2tJbmRleCBpZHgoRGZzUmVhZGVyIGN0eCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXRyeSB7CiAJCQkJY3R4LnN0YXRzLnJlYWRJZHgrKzsKIAkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0JCQkJUmVhZGFibGVDaGFubmVsIHJjID0gY3R4LmRiLm9wZW5GaWxlKGRlc2MsIElOREVYKTsKLQkJCQl0cnkgeworCQkJCXRyeSAoUmVhZGFibGVDaGFubmVsIHJjID0gY3R4LmRiLm9wZW5GaWxlKGRlc2MsIElOREVYKSkgewogCQkJCQlJbnB1dFN0cmVhbSBpbiA9IENoYW5uZWxzLm5ld0lucHV0U3RyZWFtKHJjKTsKIAkJCQkJaW50IHdhbnRTaXplID0gODE5MjsKIAkJCQkJaW50IGJzID0gcmMuYmxvY2tTaXplKCk7CkBAIC0yMjEsNyArMjIwLDYgQEAgZWxzZSBpZiAoYnMgPD0gMCkKIAkJCQkJaWR4ID0gUGFja0luZGV4LnJlYWQobmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaW4sIGJzKSk7CiAJCQkJCWN0eC5zdGF0cy5yZWFkSWR4Qnl0ZXMgKz0gcmMucG9zaXRpb24oKTsKIAkJCQl9IGZpbmFsbHkgewotCQkJCQlyYy5jbG9zZSgpOwogCQkJCQljdHguc3RhdHMucmVhZElkeE1pY3JvcyArPSBlbGFwc2VkTWljcm9zKHN0YXJ0KTsKIAkJCQl9CiAJCQl9IGNhdGNoIChFT0ZFeGNlcHRpb24gZSkgewpAQCAtMjc2LDEwICsyNzQsOSBAQCBQYWNrQml0bWFwSW5kZXggZ2V0Qml0bWFwSW5kZXgoRGZzUmVhZGVyIGN0eCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCQkJbG9uZyBzaXplOwogCQkJUGFja0JpdG1hcEluZGV4IGlkeDsKLQkJCXRyeSB7Ci0JCQkJY3R4LnN0YXRzLnJlYWRCaXRtYXArKzsKLQkJCQlsb25nIHN0YXJ0ID0gU3lzdGVtLm5hbm9UaW1lKCk7Ci0JCQkJUmVhZGFibGVDaGFubmVsIHJjID0gY3R4LmRiLm9wZW5GaWxlKGRlc2MsIEJJVE1BUF9JTkRFWCk7CisJCQljdHguc3RhdHMucmVhZEJpdG1hcCsrOworCQkJbG9uZyBzdGFydCA9IFN5c3RlbS5uYW5vVGltZSgpOworCQkJdHJ5IChSZWFkYWJsZUNoYW5uZWwgcmMgPSBjdHguZGIub3BlbkZpbGUoZGVzYywgQklUTUFQX0lOREVYKSkgewogCQkJCXRyeSB7CiAJCQkJCUlucHV0U3RyZWFtIGluID0gQ2hhbm5lbHMubmV3SW5wdXRTdHJlYW0ocmMpOwogCQkJCQlpbnQgd2FudFNpemUgPSA4MTkyOwpAQCAtMjkzLDcgKzI5MCw2IEBAIGVsc2UgaWYgKGJzIDw9IDApCiAJCQkJCQkJaW4sIGlkeChjdHgpLCBnZXRSZXZlcnNlSWR4KGN0eCkpOwogCQkJCX0gZmluYWxseSB7CiAJCQkJCXNpemUgPSByYy5wb3NpdGlvbigpOwotCQkJCQlyYy5jbG9zZSgpOwogCQkJCQljdHguc3RhdHMucmVhZElkeEJ5dGVzICs9IHNpemU7CiAJCQkJCWN0eC5zdGF0cy5yZWFkSWR4TWljcm9zICs9IGVsYXBzZWRNaWNyb3Moc3RhcnQpOwogCQkJCX0KQEAgLTQ0Myw2ICs0MzksNyBAQCB2b2lkIGNvcHlQYWNrQXNJcyhQYWNrT3V0cHV0U3RyZWFtIG91dCwgRGZzUmVhZGVyIGN0eCkKIAogCXByaXZhdGUgdm9pZCBjb3B5UGFja1Rocm91Z2hDYWNoZShQYWNrT3V0cHV0U3RyZWFtIG91dCwgRGZzUmVhZGVyIGN0eCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIEV4cGxpY2l0bHkgY2xvc2VkIGluIGZpbmFsbHkgYmxvY2sKIAkJUmVhZGFibGVDaGFubmVsIHJjID0gbnVsbDsKIAkJdHJ5IHsKIAkJCWxvbmcgcG9zaXRpb24gPSAxMjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzUmVhZGVyT3B0aW9ucy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZWFkZXJPcHRpb25zLmphdmEKaW5kZXggYmYxNGQxOC4uMmVhNWMzOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZWFkZXJPcHRpb25zLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZWFkZXJPcHRpb25zLmphdmEKQEAgLTExNSw3ICsxMTUsNyBAQCBwdWJsaWMgaW50IGdldFN0cmVhbUZpbGVUaHJlc2hvbGQoKSB7CiAJICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5saWIuT2JqZWN0U3RyZWFtfS4KIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfQogCSAqLwotCXB1YmxpYyBEZnNSZWFkZXJPcHRpb25zIHNldFN0cmVhbUZpbGVUaHJlc2hvbGQoZmluYWwgaW50IG5ld0xpbWl0KSB7CisJcHVibGljIERmc1JlYWRlck9wdGlvbnMgc2V0U3RyZWFtRmlsZVRocmVzaG9sZChpbnQgbmV3TGltaXQpIHsKIAkJc3RyZWFtRmlsZVRocmVzaG9sZCA9IE1hdGgubWF4KDAsIG5ld0xpbWl0KTsKIAkJcmV0dXJuIHRoaXM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNSZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlcG9zaXRvcnkuamF2YQppbmRleCAxOTc2ODE2Li41MTY5ZTkyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlcG9zaXRvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1JlcG9zaXRvcnkuamF2YQpAQCAtMTMzLDcgKzEzMyw3IEBAIHB1YmxpYyB2b2lkIHNjYW5Gb3JSZXBvQ2hhbmdlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUluZGV4Q2hhbmdlZCgpIHsKKwlwdWJsaWMgdm9pZCBub3RpZnlJbmRleENoYW5nZWQoYm9vbGVhbiBpbnRlcm5hbCkgewogCQkvLyBEbyBub3Qgc2VuZCBub3RpZmljYXRpb25zLgogCQkvLyBUaGVyZSBpcyBubyBpbmRleCwgYXMgdGhlcmUgaXMgbm8gd29ya2luZyB0cmVlLgogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzU3RyZWFtS2V5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0Rmc1N0cmVhbUtleS5qYXZhCmluZGV4IDg3OTNkODMuLmMxMWY2OTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvRGZzU3RyZWFtS2V5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9EZnNTdHJlYW1LZXkuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5kZnM7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiAKQEAgLTY3LDcgKzY3LDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIERmc1N0cmVhbUtleSB7CiAJICovCiAJcHVibGljIHN0YXRpYyBEZnNTdHJlYW1LZXkgb2YoRGZzUmVwb3NpdG9yeURlc2NyaXB0aW9uIHJlcG8sIFN0cmluZyBuYW1lLAogCQkJQE51bGxhYmxlIFBhY2tFeHQgZXh0KSB7Ci0JCXJldHVybiBuZXcgQnl0ZUFycmF5RGZzU3RyZWFtS2V5KHJlcG8sIG5hbWUuZ2V0Qnl0ZXMoVVRGXzgpLCBleHQpOworCQlyZXR1cm4gbmV3IEJ5dGVBcnJheURmc1N0cmVhbUtleShyZXBvLCBuYW1lLmdldEJ5dGVzKENIQVJTRVQpLCBleHQpOwogCX0KIAogCWZpbmFsIGludCBoYXNoOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9MYXJnZVBhY2tlZFdob2xlT2JqZWN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0xhcmdlUGFja2VkV2hvbGVPYmplY3QuamF2YQppbmRleCBmYTJjNTI5Li4zN2Q4ZDFjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0xhcmdlUGFja2VkV2hvbGVPYmplY3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL0xhcmdlUGFja2VkV2hvbGVPYmplY3QuamF2YQpAQCAtMTA0LDMxICsxMDQsMzQgQEAgcHVibGljIGJvb2xlYW4gaXNMYXJnZSgpIHsKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyBPYmplY3RTdHJlYW0gb3BlblN0cmVhbSgpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisJCVBhY2tJbnB1dFN0cmVhbSBwYWNrSW47CisJCS8vIGN0eCBpcyBjbG9zZWQgYnkgUGFja0lucHV0U3RyZWFtLCBvciBleHBsaWNpdGx5IGluIHRoZSBmaW5hbGx5IGJsb2NrCisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpCiAJCURmc1JlYWRlciBjdHggPSBkYi5uZXdSZWFkZXIoKTsKLQkJSW5wdXRTdHJlYW0gaW47CiAJCXRyeSB7Ci0JCQlpbiA9IG5ldyBQYWNrSW5wdXRTdHJlYW0ocGFjaywgb2JqZWN0T2Zmc2V0ICsgaGVhZGVyTGVuZ3RoLCBjdHgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBwYWNrR29uZSkgewotCQkJLy8gSWYgdGhlIHBhY2sgZmlsZSBjYW5ub3QgYmUgcGlubmVkIGludG8gdGhlIGN1cnNvciwgaXQKLQkJCS8vIHByb2JhYmx5IHdhcyByZXBhY2tlZCByZWNlbnRseS4gR28gZmluZCB0aGUgb2JqZWN0Ci0JCQkvLyBhZ2FpbiBhbmQgb3BlbiB0aGUgc3RyZWFtIGZyb20gdGhhdCBsb2NhdGlvbiBpbnN0ZWFkLgotCQkJLy8KIAkJCXRyeSB7CisJCQkJcGFja0luID0gbmV3IFBhY2tJbnB1dFN0cmVhbSgKKwkJCQkJCXBhY2ssIG9iamVjdE9mZnNldCArIGhlYWRlckxlbmd0aCwgY3R4KTsKKwkJCQljdHggPSBudWxsOyAvLyBvd25lZCBieSBwYWNrSW4KKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHBhY2tHb25lKSB7CisJCQkJLy8gSWYgdGhlIHBhY2sgZmlsZSBjYW5ub3QgYmUgcGlubmVkIGludG8gdGhlIGN1cnNvciwgaXQKKwkJCQkvLyBwcm9iYWJseSB3YXMgcmVwYWNrZWQgcmVjZW50bHkuIEdvIGZpbmQgdGhlIG9iamVjdAorCQkJCS8vIGFnYWluIGFuZCBvcGVuIHRoZSBzdHJlYW0gZnJvbSB0aGF0IGxvY2F0aW9uIGluc3RlYWQuCiAJCQkJT2JqZWN0SWQgb2JqID0gcGFjay5nZXRSZXZlcnNlSWR4KGN0eCkuZmluZE9iamVjdChvYmplY3RPZmZzZXQpOwogCQkJCXJldHVybiBjdHgub3BlbihvYmosIHR5cGUpLm9wZW5TdHJlYW0oKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJY3R4LmNsb3NlKCk7CiAJCQl9CiAJCX0gZmluYWxseSB7Ci0JCQljdHguY2xvc2UoKTsKKwkJCWlmIChjdHggIT0gbnVsbCkgeworCQkJCWN0eC5jbG9zZSgpOworCQkJfQogCQl9CiAKIAkJLy8gQWxpZ24gYnVmZmVyIHRvIGluZmxhdGVyIHNpemUsIGF0IGEgbGFyZ2VyIHRoYW4gZGVmYXVsdCBibG9jay4KIAkJLy8gVGhpcyByZWR1Y2VzIHRoZSBudW1iZXIgb2YgY29udGV4dCBzd2l0Y2hlcyBmcm9tIHRoZQogCQkvLyBjYWxsZXIgZG93biBpbnRvIHRoZSBwYWNrIHN0cmVhbSBpbmZsYXRpb24uCiAJCWludCBidWZzeiA9IDgxOTI7Ci0JCWluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCi0JCQkJbmV3IEluZmxhdGVySW5wdXRTdHJlYW0oaW4sIGN0eC5pbmZsYXRlcigpLCBidWZzeiksCisJCUlucHV0U3RyZWFtIGluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oCisJCQkJbmV3IEluZmxhdGVySW5wdXRTdHJlYW0ocGFja0luLCBwYWNrSW4uY3R4LmluZmxhdGVyKCksIGJ1ZnN6KSwKIAkJCQlidWZzeik7CiAJCXJldHVybiBuZXcgT2JqZWN0U3RyZWFtLkZpbHRlcih0eXBlLCBzaXplLCBpbik7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9QYWNrSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9kZnMvUGFja0lucHV0U3RyZWFtLmphdmEKaW5kZXggZDg4MDExYy4uYjg1OWQ5ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2Rmcy9QYWNrSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZGZzL1BhY2tJbnB1dFN0cmVhbS5qYXZhCkBAIC00Nyw3ICs0Nyw3IEBACiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIAogZmluYWwgY2xhc3MgUGFja0lucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewotCXByaXZhdGUgZmluYWwgRGZzUmVhZGVyIGN0eDsKKwlmaW5hbCBEZnNSZWFkZXIgY3R4OwogCiAJcHJpdmF0ZSBmaW5hbCBEZnNQYWNrRmlsZSBwYWNrOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CaXRtYXBJbmRleEltcGwuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JpdG1hcEluZGV4SW1wbC5qYXZhCmluZGV4IDZhZGU0MzguLjFkYTQzMDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JpdG1hcEluZGV4SW1wbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0JpdG1hcEluZGV4SW1wbC5qYXZhCkBAIC0yMTMsMjIgKzIxMyw2IEBAIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENvbXByZXNzZWRCaXRtYXBCdWlsZGVyIGltcGxlbWVudHMgQml0bWFwQnVpbGRlciB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gYWRkKEFueU9iamVjdElkIG9iamVjdElkLCBpbnQgdHlwZSkgewotCQkJaW50IHBvc2l0aW9uID0gYml0bWFwSW5kZXguZmluZE9ySW5zZXJ0KG9iamVjdElkLCB0eXBlKTsKLQkJCWlmIChiaXRzZXQuY29udGFpbnMocG9zaXRpb24pKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJQml0bWFwIGVudHJ5ID0gYml0bWFwSW5kZXguZ2V0Qml0bWFwKG9iamVjdElkKTsKLQkJCWlmIChlbnRyeSAhPSBudWxsKSB7Ci0JCQkJb3IoZW50cnkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJYml0c2V0LnNldChwb3NpdGlvbik7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhBbnlPYmplY3RJZCBvYmplY3RJZCkgewogCQkJaW50IHBvc2l0aW9uID0gYml0bWFwSW5kZXguZmluZFBvc2l0aW9uKG9iamVjdElkKTsKIAkJCXJldHVybiAwIDw9IHBvc2l0aW9uICYmIGJpdHNldC5jb250YWlucyhwb3NpdGlvbik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlQXJyYXlXaW5kb3cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVBcnJheVdpbmRvdy5qYXZhCmluZGV4IDMzOGRmNGEuLmM2ZmRlYjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVBcnJheVdpbmRvdy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVBcnJheVdpbmRvdy5qYXZhCkBAIC01OCwxNCArNTgsMTQgQEAKIGZpbmFsIGNsYXNzIEJ5dGVBcnJheVdpbmRvdyBleHRlbmRzIEJ5dGVXaW5kb3cgewogCXByaXZhdGUgZmluYWwgYnl0ZVtdIGFycmF5OwogCi0JQnl0ZUFycmF5V2luZG93KGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgbywgZmluYWwgYnl0ZVtdIGIpIHsKKwlCeXRlQXJyYXlXaW5kb3coUGFja0ZpbGUgcGFjaywgbG9uZyBvLCBieXRlW10gYikgewogCQlzdXBlcihwYWNrLCBvLCBiLmxlbmd0aCk7CiAJCWFycmF5ID0gYjsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgY29weShmaW5hbCBpbnQgcCwgZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvLCBpbnQgbikgeworCXByb3RlY3RlZCBpbnQgY29weShpbnQgcCwgYnl0ZVtdIGIsIGludCBvLCBpbnQgbikgewogCQluID0gTWF0aC5taW4oYXJyYXkubGVuZ3RoIC0gcCwgbik7CiAJCVN5c3RlbS5hcnJheWNvcHkoYXJyYXksIHAsIGIsIG8sIG4pOwogCQlyZXR1cm4gbjsKQEAgLTczLDcgKzczLDcgQEAgcHJvdGVjdGVkIGludCBjb3B5KGZpbmFsIGludCBwLCBmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG8sIGludCBuKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBpbnQgc2V0SW5wdXQoZmluYWwgaW50IHBvcywgZmluYWwgSW5mbGF0ZXIgaW5mKQorCXByb3RlY3RlZCBpbnQgc2V0SW5wdXQoaW50IHBvcywgSW5mbGF0ZXIgaW5mKQogCQkJdGhyb3dzIERhdGFGb3JtYXRFeGNlcHRpb24gewogCQlpbnQgbiA9IGFycmF5Lmxlbmd0aCAtIHBvczsKIAkJaW5mLnNldElucHV0KGFycmF5LCBwb3MsIG4pOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUJ1ZmZlcldpbmRvdy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZUJ1ZmZlcldpbmRvdy5qYXZhCmluZGV4IDRkY2YxMzMuLjhlNzkwNGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVCdWZmZXJXaW5kb3cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlQnVmZmVyV2luZG93LmphdmEKQEAgLTYwLDE0ICs2MCwxNCBAQAogZmluYWwgY2xhc3MgQnl0ZUJ1ZmZlcldpbmRvdyBleHRlbmRzIEJ5dGVXaW5kb3cgewogCXByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXI7CiAKLQlCeXRlQnVmZmVyV2luZG93KGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgbywgZmluYWwgQnl0ZUJ1ZmZlciBiKSB7CisJQnl0ZUJ1ZmZlcldpbmRvdyhQYWNrRmlsZSBwYWNrLCBsb25nIG8sIEJ5dGVCdWZmZXIgYikgewogCQlzdXBlcihwYWNrLCBvLCBiLmNhcGFjaXR5KCkpOwogCQlidWZmZXIgPSBiOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGludCBjb3B5KGZpbmFsIGludCBwLCBmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG8sIGludCBuKSB7CisJcHJvdGVjdGVkIGludCBjb3B5KGludCBwLCBieXRlW10gYiwgaW50IG8sIGludCBuKSB7CiAJCWZpbmFsIEJ5dGVCdWZmZXIgcyA9IGJ1ZmZlci5zbGljZSgpOwogCQlzLnBvc2l0aW9uKHApOwogCQluID0gTWF0aC5taW4ocy5yZW1haW5pbmcoKSwgbik7CkBAIC05Miw3ICs5Miw3IEBAIHZvaWQgd3JpdGUoUGFja091dHB1dFN0cmVhbSBvdXQsIGxvbmcgcG9zLCBpbnQgY250KQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgaW50IHNldElucHV0KGZpbmFsIGludCBwb3MsIGZpbmFsIEluZmxhdGVyIGluZikKKwlwcm90ZWN0ZWQgaW50IHNldElucHV0KGludCBwb3MsIEluZmxhdGVyIGluZikKIAkJCXRocm93cyBEYXRhRm9ybWF0RXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZUJ1ZmZlciBzID0gYnVmZmVyLnNsaWNlKCk7CiAJCXMucG9zaXRpb24ocG9zKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVXaW5kb3cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0J5dGVXaW5kb3cuamF2YQppbmRleCA3OTYzY2VhLi42MDA3M2YzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9CeXRlV2luZG93LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQnl0ZVdpbmRvdy5qYXZhCkBAIC03Niw3ICs3Niw3IEBAIGFic3RyYWN0IGNsYXNzIEJ5dGVXaW5kb3cgewogCSAqIEBwYXJhbSBuCiAJICogICAgICAgICAgICBzaXplIG9mIHRoZSBieXRlIHdpbmRvdwogCSAqLwotCXByb3RlY3RlZCBCeXRlV2luZG93KGZpbmFsIFBhY2tGaWxlIHAsIGZpbmFsIGxvbmcgcywgZmluYWwgaW50IG4pIHsKKwlwcm90ZWN0ZWQgQnl0ZVdpbmRvdyhQYWNrRmlsZSBwLCBsb25nIHMsIGludCBuKSB7CiAJCXBhY2sgPSBwOwogCQlzdGFydCA9IHM7CiAJCWVuZCA9IHN0YXJ0ICsgbjsKQEAgLTg2LDcgKzg2LDcgQEAgZmluYWwgaW50IHNpemUoKSB7CiAJCXJldHVybiAoaW50KSAoZW5kIC0gc3RhcnQpOwogCX0KIAotCWZpbmFsIGJvb2xlYW4gY29udGFpbnMoZmluYWwgUGFja0ZpbGUgbmVlZGVkRmlsZSwgZmluYWwgbG9uZyBuZWVkZWRQb3MpIHsKKwlmaW5hbCBib29sZWFuIGNvbnRhaW5zKFBhY2tGaWxlIG5lZWRlZEZpbGUsIGxvbmcgbmVlZGVkUG9zKSB7CiAJCXJldHVybiBwYWNrID09IG5lZWRlZEZpbGUgJiYgc3RhcnQgPD0gbmVlZGVkUG9zICYmIG5lZWRlZFBvcyA8IGVuZDsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0NhY2hlZE9iamVjdERpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ2FjaGVkT2JqZWN0RGlyZWN0b3J5LmphdmEKaW5kZXggZTgxMGFlMC4uN2Y3ZWNjMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ2FjaGVkT2JqZWN0RGlyZWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvQ2FjaGVkT2JqZWN0RGlyZWN0b3J5LmphdmEKQEAgLTE4MSwxMSArMTgxLDExIEBAIHZvaWQgcmVzb2x2ZShTZXQ8T2JqZWN0SWQ+IG1hdGNoZXMsIEFiYnJldmlhdGVkT2JqZWN0SWQgaWQpCiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGhhcyhmaW5hbCBBbnlPYmplY3RJZCBvYmplY3RJZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgYm9vbGVhbiBoYXMoQW55T2JqZWN0SWQgb2JqZWN0SWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBoYXMob2JqZWN0SWQsIG51bGwpOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBoYXMoZmluYWwgQW55T2JqZWN0SWQgb2JqZWN0SWQsIFNldDxBbHRlcm5hdGVIYW5kbGUuSWQ+IHNraXBzKQorCXByaXZhdGUgYm9vbGVhbiBoYXMoQW55T2JqZWN0SWQgb2JqZWN0SWQsIFNldDxBbHRlcm5hdGVIYW5kbGUuSWQ+IHNraXBzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHVucGFja2VkT2JqZWN0cy5jb250YWlucyhvYmplY3RJZCkpIHsKIAkJCXJldHVybiB0cnVlOwpAQCAtMjA1LDcgKzIwNSw3IEBAIHByaXZhdGUgYm9vbGVhbiBoYXMoZmluYWwgQW55T2JqZWN0SWQgb2JqZWN0SWQsIFNldDxBbHRlcm5hdGVIYW5kbGUuSWQ+IHNraXBzKQogCX0KIAogCUBPdmVycmlkZQotCU9iamVjdExvYWRlciBvcGVuT2JqZWN0KGZpbmFsIFdpbmRvd0N1cnNvciBjdXJzLCBmaW5hbCBBbnlPYmplY3RJZCBvYmplY3RJZCkKKwlPYmplY3RMb2FkZXIgb3Blbk9iamVjdChXaW5kb3dDdXJzb3IgY3VycywgQW55T2JqZWN0SWQgb2JqZWN0SWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gb3Blbk9iamVjdChjdXJzLCBvYmplY3RJZCwgbnVsbCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRGVsdGFCYXNlQ2FjaGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0RlbHRhQmFzZUNhY2hlLmphdmEKaW5kZXggYjM5Nzk4OS4uZWQ3M2U3MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRGVsdGFCYXNlQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9EZWx0YUJhc2VDYWNoZS5qYXZhCkBAIC01Miw3ICs1Miw3IEBAIGNsYXNzIERlbHRhQmFzZUNhY2hlIHsKIAogCXN0YXRpYyBmaW5hbCBTb2Z0UmVmZXJlbmNlPEVudHJ5PiBERUFEOwogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGhhc2goZmluYWwgbG9uZyBwb3NpdGlvbikgeworCXByaXZhdGUgc3RhdGljIGludCBoYXNoKGxvbmcgcG9zaXRpb24pIHsKIAkJcmV0dXJuICgoKGludCkgcG9zaXRpb24pIDw8IDIyKSA+Pj4gMjI7CiAJfQogCkBAIC04Miw3ICs4Miw3IEBAIHN0YXRpYyB2b2lkIHJlY29uZmlndXJlKFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgewogCQljYWNoZSA9IG5ldyBTbG90W0NBQ0hFX1NaXTsKIAl9CiAKLQlFbnRyeSBnZXQoZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBwb3NpdGlvbikgeworCUVudHJ5IGdldChQYWNrRmlsZSBwYWNrLCBsb25nIHBvc2l0aW9uKSB7CiAJCVNsb3QgZSA9IGNhY2hlW2hhc2gocG9zaXRpb24pXTsKIAkJaWYgKGUgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwpAQCAtMTM2LDcgKzEzNiw3IEBAIHByaXZhdGUgdm9pZCByZWxlYXNlTWVtb3J5KCkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG1vdmVUb0hlYWQoZmluYWwgU2xvdCBlKSB7CisJcHJpdmF0ZSB2b2lkIG1vdmVUb0hlYWQoU2xvdCBlKSB7CiAJCXVubGluayhlKTsKIAkJZS5scnVQcmV2ID0gbnVsbDsKIAkJZS5scnVOZXh0ID0gbHJ1SGVhZDsKQEAgLTE0Nyw3ICsxNDcsNyBAQCBwcml2YXRlIHZvaWQgbW92ZVRvSGVhZChmaW5hbCBTbG90IGUpIHsKIAkJbHJ1SGVhZCA9IGU7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHVubGluayhmaW5hbCBTbG90IGUpIHsKKwlwcml2YXRlIHZvaWQgdW5saW5rKFNsb3QgZSkgewogCQlmaW5hbCBTbG90IHByZXYgPSBlLmxydVByZXY7CiAJCWZpbmFsIFNsb3QgbmV4dCA9IGUubHJ1TmV4dDsKIAkJaWYgKHByZXYgIT0gbnVsbCkKQEAgLTE1Niw3ICsxNTYsNyBAQCBwcml2YXRlIHZvaWQgdW5saW5rKGZpbmFsIFNsb3QgZSkgewogCQkJbmV4dC5scnVQcmV2ID0gcHJldjsKIAl9CiAKLQlwcml2YXRlIHZvaWQgY2xlYXJFbnRyeShmaW5hbCBTbG90IGUpIHsKKwlwcml2YXRlIHZvaWQgY2xlYXJFbnRyeShTbG90IGUpIHsKIAkJb3BlbkJ5dGVDb3VudCAtPSBlLnN6OwogCQllLnByb3ZpZGVyID0gbnVsbDsKIAkJZS5kYXRhID0gREVBRDsKQEAgLTE2OCw3ICsxNjgsNyBAQCBzdGF0aWMgY2xhc3MgRW50cnkgewogCiAJCWZpbmFsIGludCB0eXBlOwogCi0JCUVudHJ5KGZpbmFsIGJ5dGVbXSBhRGF0YSwgZmluYWwgaW50IGFUeXBlKSB7CisJCUVudHJ5KGJ5dGVbXSBhRGF0YSwgaW50IGFUeXBlKSB7CiAJCQlkYXRhID0gYURhdGE7CiAJCQl0eXBlID0gYVR5cGU7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlUmVwb3NpdG9yeS5qYXZhCmluZGV4IDliODIyMTAuLmQwMjg4OGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0ZpbGVSZXBvc2l0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVJlcG9zaXRvcnkuamF2YQpAQCAtNDYsOCArNDYsNiBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCi1pbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZkRhdGFiYXNlLkFMTDsKLQogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKQEAgLTEyNSw2ICsxMjMsMTAgQEAgcHVibGljIGNsYXNzIEZpbGVSZXBvc2l0b3J5IGV4dGVuZHMgUmVwb3NpdG9yeSB7CiAJcHJpdmF0ZSBmaW5hbCBGaWxlQmFzZWRDb25maWcgcmVwb0NvbmZpZzsKIAlwcml2YXRlIGZpbmFsIFJlZkRhdGFiYXNlIHJlZnM7CiAJcHJpdmF0ZSBmaW5hbCBPYmplY3REaXJlY3Rvcnkgb2JqZWN0RGF0YWJhc2U7CisKKwlwcml2YXRlIGZpbmFsIE9iamVjdCBzbmFwc2hvdExvY2sgPSBuZXcgT2JqZWN0KCk7CisKKwkvLyBwcm90ZWN0ZWQgYnkgc25hcHNob3RMb2NrCiAJcHJpdmF0ZSBGaWxlU25hcHNob3Qgc25hcHNob3Q7CiAKIAkvKioKQEAgLTE0Nyw3ICsxNDksNyBAQCBwdWJsaWMgY2xhc3MgRmlsZVJlcG9zaXRvcnkgZXh0ZW5kcyBSZXBvc2l0b3J5IHsKIAkgKiAgICAgICAgICAgICBhY2Nlc3NlZC4KIAkgKiBAc2VlIEZpbGVSZXBvc2l0b3J5QnVpbGRlcgogCSAqLwotCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShmaW5hbCBGaWxlIGdpdERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgRmlsZVJlcG9zaXRvcnkoRmlsZSBnaXREaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRoaXMobmV3IEZpbGVSZXBvc2l0b3J5QnVpbGRlcigpLnNldEdpdERpcihnaXREaXIpLnNldHVwKCkpOwogCX0KIApAQCAtMTYxLDcgKzE2Myw3IEBAIHB1YmxpYyBGaWxlUmVwb3NpdG9yeShmaW5hbCBGaWxlIGdpdERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgICBhY2Nlc3NlZC4KIAkgKiBAc2VlIEZpbGVSZXBvc2l0b3J5QnVpbGRlcgogCSAqLwotCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShmaW5hbCBTdHJpbmcgZ2l0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBGaWxlUmVwb3NpdG9yeShTdHJpbmcgZ2l0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0aGlzKG5ldyBGaWxlKGdpdERpcikpOwogCX0KIApAQCAtMTc0LDcgKzE3Niw3IEBAIHB1YmxpYyBGaWxlUmVwb3NpdG9yeShmaW5hbCBTdHJpbmcgZ2l0RGlyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgICAgIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24gZmlsZSBvciByZXBvc2l0b3J5IGNvbmZpZ3VyYXRpb24gZmlsZQogCSAqICAgICAgICAgICAgIGNhbm5vdCBiZSBhY2Nlc3NlZC4KIAkgKi8KLQlwdWJsaWMgRmlsZVJlcG9zaXRvcnkoZmluYWwgQmFzZVJlcG9zaXRvcnlCdWlsZGVyIG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIEZpbGVSZXBvc2l0b3J5KEJhc2VSZXBvc2l0b3J5QnVpbGRlciBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlzdXBlcihvcHRpb25zKTsKIAogCQlpZiAoU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbChTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRlbnYoCkBAIC0yNDAsOCArMjQyLDkgQEAgcHVibGljIHZvaWQgb25Db25maWdDaGFuZ2VkKENvbmZpZ0NoYW5nZWRFdmVudCBldmVudCkgewogCQkJCQkJTG9uZy52YWx1ZU9mKHJlcG9zaXRvcnlGb3JtYXRWZXJzaW9uKSkpOwogCQl9CiAKLQkJaWYgKCFpc0JhcmUoKSkKKwkJaWYgKCFpc0JhcmUoKSkgewogCQkJc25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShnZXRJbmRleEZpbGUoKSk7CisJCX0KIAl9CiAKIAlwcml2YXRlIHZvaWQgbG9hZFN5c3RlbUNvbmZpZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC01MzEsMzQgKzUzNCw0MyBAQCBwcml2YXRlIFNldDxPYmplY3RJZD4gZ2V0QWRkaXRpb25hbEhhdmVzKFNldDxBbHRlcm5hdGVIYW5kbGUuSWQ+IHNraXBzKSB7CiAJICogICAgICAgICAgICAgaW5kZXggZmlsZSBjb3VsZCBub3QgYmUgb3BlbmVkLCByZWFkLCBvciBpcyBub3QgcmVjb2duaXplZCBhcwogCSAqICAgICAgICAgICAgIGEgR2l0IHBhY2sgZmlsZSBpbmRleC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuUGFjayhmaW5hbCBGaWxlIHBhY2spIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgb3BlblBhY2soRmlsZSBwYWNrKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvYmplY3REYXRhYmFzZS5vcGVuUGFjayhwYWNrKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQogCXB1YmxpYyB2b2lkIHNjYW5Gb3JSZXBvQ2hhbmdlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpOyAvLyBUaGlzIHdpbGwgbG9vayBmb3IgY2hhbmdlcyB0byByZWZzCisJCWdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOyAvLyBUaGlzIHdpbGwgbG9vayBmb3IgY2hhbmdlcyB0byByZWZzCiAJCWRldGVjdEluZGV4Q2hhbmdlcygpOwogCX0KIAogCS8qKiBEZXRlY3QgaW5kZXggY2hhbmdlcy4gKi8KIAlwcml2YXRlIHZvaWQgZGV0ZWN0SW5kZXhDaGFuZ2VzKCkgewotCQlpZiAoaXNCYXJlKCkpCisJCWlmIChpc0JhcmUoKSkgewogCQkJcmV0dXJuOworCQl9CiAKIAkJRmlsZSBpbmRleEZpbGUgPSBnZXRJbmRleEZpbGUoKTsKLQkJaWYgKHNuYXBzaG90ID09IG51bGwpCi0JCQlzbmFwc2hvdCA9IEZpbGVTbmFwc2hvdC5zYXZlKGluZGV4RmlsZSk7Ci0JCWVsc2UgaWYgKHNuYXBzaG90LmlzTW9kaWZpZWQoaW5kZXhGaWxlKSkKLQkJCW5vdGlmeUluZGV4Q2hhbmdlZCgpOworCQlzeW5jaHJvbml6ZWQgKHNuYXBzaG90TG9jaykgeworCQkJaWYgKHNuYXBzaG90ID09IG51bGwpIHsKKwkJCQlzbmFwc2hvdCA9IEZpbGVTbmFwc2hvdC5zYXZlKGluZGV4RmlsZSk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJaWYgKCFzbmFwc2hvdC5pc01vZGlmaWVkKGluZGV4RmlsZSkpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJbm90aWZ5SW5kZXhDaGFuZ2VkKGZhbHNlKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG5vdGlmeUluZGV4Q2hhbmdlZCgpIHsKLQkJc25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShnZXRJbmRleEZpbGUoKSk7Ci0JCWZpcmVFdmVudChuZXcgSW5kZXhDaGFuZ2VkRXZlbnQoKSk7CisJcHVibGljIHZvaWQgbm90aWZ5SW5kZXhDaGFuZ2VkKGJvb2xlYW4gaW50ZXJuYWwpIHsKKwkJc3luY2hyb25pemVkIChzbmFwc2hvdExvY2spIHsKKwkJCXNuYXBzaG90ID0gRmlsZVNuYXBzaG90LnNhdmUoZ2V0SW5kZXhGaWxlKCkpOworCQl9CisJCWZpcmVFdmVudChuZXcgSW5kZXhDaGFuZ2VkRXZlbnQoaW50ZXJuYWwpKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvRmlsZVNuYXBzaG90LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlU25hcHNob3QuamF2YQppbmRleCBiNTQ4NWM0Li5mMjZlYmEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlU25hcHNob3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9GaWxlU25hcHNob3QuamF2YQpAQCAtMjY4LDcgKzI2OCw3IEBAIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJCQkJKyAiLCByZWFkOiAiICsgZi5mb3JtYXQobmV3IERhdGUobGFzdFJlYWQpKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIG5vdFJhY3lDbGVhbihmaW5hbCBsb25nIHJlYWQpIHsKKwlwcml2YXRlIGJvb2xlYW4gbm90UmFjeUNsZWFuKGxvbmcgcmVhZCkgewogCQkvLyBUaGUgbGFzdCBtb2RpZmllZCB0aW1lIGdyYW51bGFyaXR5IG9mIEZBVCBmaWxlc3lzdGVtcyBpcyAyIHNlY29uZHMuCiAJCS8vIFVzaW5nIDIuNSBzZWNvbmRzIGhlcmUgcHJvdmlkZXMgYSByZWFzb25hYmx5IGhpZ2ggYXNzdXJhbmNlIHRoYXQKIAkJLy8gYSBtb2RpZmljYXRpb24gd2FzIG5vdCBtaXNzZWQuCkBAIC0yNzYsNyArMjc2LDcgQEAgcHJpdmF0ZSBib29sZWFuIG5vdFJhY3lDbGVhbihmaW5hbCBsb25nIHJlYWQpIHsKIAkJcmV0dXJuIHJlYWQgLSBsYXN0TW9kaWZpZWQgPiAyNTAwOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc01vZGlmaWVkKGZpbmFsIGxvbmcgY3Vyckxhc3RNb2RpZmllZCkgeworCXByaXZhdGUgYm9vbGVhbiBpc01vZGlmaWVkKGxvbmcgY3Vyckxhc3RNb2RpZmllZCkgewogCQkvLyBBbnkgZGlmZmVyZW5jZSBpbmRpY2F0ZXMgdGhlIHBhdGggd2FzIG1vZGlmaWVkLgogCQkvLwogCQlpZiAobGFzdE1vZGlmaWVkICE9IGN1cnJMYXN0TW9kaWZpZWQpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HQy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR0MuamF2YQppbmRleCA4YTQ3ZGZjLi5jZmUwMjk0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HQy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0dDLmphdmEKQEAgLTc3Miw3ICs3NzIsOCBAQCBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFscyhSZWYgcjEsIFJlZiByMikgewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwogCXB1YmxpYyB2b2lkIHBhY2tSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZXBvLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhDb25zdGFudHMuUl9SRUZTKS52YWx1ZXMoKTsKKwkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZXBvLmdldFJlZkRhdGFiYXNlKCkKKwkJCQkuZ2V0UmVmc0J5UHJlZml4KENvbnN0YW50cy5SX1JFRlMpOwogCQlMaXN0PFN0cmluZz4gcmVmc1RvQmVQYWNrZWQgPSBuZXcgQXJyYXlMaXN0PD4ocmVmcy5zaXplKCkpOwogCQlwbS5iZWdpblRhc2soSkdpdFRleHQuZ2V0KCkucGFja1JlZnMsIHJlZnMuc2l6ZSgpKTsKIAkJdHJ5IHsKQEAgLTgzOCw3ICs4MzksNyBAQCBwdWJsaWMgQ29sbGVjdGlvbjxQYWNrRmlsZT4gcmVwYWNrKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCiAJCUxpc3Q8T2JqZWN0SWRTZXQ+IGV4Y2x1ZGVkID0gbmV3IExpbmtlZExpc3Q8PigpOwotCQlmb3IgKGZpbmFsIFBhY2tGaWxlIGYgOiByZXBvLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0UGFja3MoKSkgeworCQlmb3IgKFBhY2tGaWxlIGYgOiByZXBvLmdldE9iamVjdERhdGFiYXNlKCkuZ2V0UGFja3MoKSkgewogCQkJY2hlY2tDYW5jZWxsZWQoKTsKIAkJCWlmIChmLnNob3VsZEJlS2VwdCgpKQogCQkJCWV4Y2x1ZGVkLmFkZChmLmdldEluZGV4KCkpOwpAQCAtMTAwMSw2ICsxMDAyLDkgQEAgcHJpdmF0ZSB2b2lkIGRlbGV0ZU9ycGhhbnMoKSB7CiAJcHJpdmF0ZSB2b2lkIGRlbGV0ZVRlbXBQYWNrc0lkeCgpIHsKIAkJUGF0aCBwYWNrRGlyID0gcmVwby5nZXRPYmplY3REYXRhYmFzZSgpLmdldFBhY2tEaXJlY3RvcnkoKS50b1BhdGgoKTsKIAkJSW5zdGFudCB0aHJlc2hvbGQgPSBJbnN0YW50Lm5vdygpLm1pbnVzKDEsIENocm9ub1VuaXQuREFZUyk7CisJCWlmICghRmlsZXMuZXhpc3RzKHBhY2tEaXIpKSB7CisJCQlyZXR1cm47CisJCX0KIAkJdHJ5IChEaXJlY3RvcnlTdHJlYW08UGF0aD4gc3RyZWFtID0KIAkJCQlGaWxlcy5uZXdEaXJlY3RvcnlTdHJlYW0ocGFja0RpciwgImdjXypfdG1wIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJc3RyZWFtLmZvckVhY2godCAtPiB7CkBAIC0xMDYyLDcgKzEwNjYsNyBAQCBwcml2YXRlIFNldDxPYmplY3RJZD4gbGlzdFJlZkxvZ09iamVjdHMoUmVmIHJlZiwgbG9uZyBtaW5UaW1lKSB0aHJvd3MgSU9FeGNlcHRpbwogCSAqLwogCXByaXZhdGUgQ29sbGVjdGlvbjxSZWY+IGdldEFsbFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlSZWZEYXRhYmFzZSByZWZkYiA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKTsKLQkJQ29sbGVjdGlvbjxSZWY+IHJlZnMgPSByZWZkYi5nZXRSZWZzKFJlZkRhdGFiYXNlLkFMTCkudmFsdWVzKCk7CisJCUNvbGxlY3Rpb248UmVmPiByZWZzID0gcmVmZGIuZ2V0UmVmcygpOwogCQlMaXN0PFJlZj4gYWRkbCA9IHJlZmRiLmdldEFkZGl0aW9uYWxSZWZzKCk7CiAJCWlmICghYWRkbC5pc0VtcHR5KCkpIHsKIAkJCUxpc3Q8UmVmPiBhbGwgPSBuZXcgQXJyYXlMaXN0PD4ocmVmcy5zaXplKCkgKyBhZGRsLnNpemUoKSk7CkBAIC0xMzcwLDcgKzEzNzQsNyBAQCBwdWJsaWMgUmVwb1N0YXRpc3RpY3MgZ2V0U3RhdGlzdGljcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAogCQlSZWZEYXRhYmFzZSByZWZEYiA9IHJlcG8uZ2V0UmVmRGF0YWJhc2UoKTsKLQkJZm9yIChSZWYgciA6IHJlZkRiLmdldFJlZnMoUmVmRGF0YWJhc2UuQUxMKS52YWx1ZXMoKSkgeworCQlmb3IgKFJlZiByIDogcmVmRGIuZ2V0UmVmcygpKSB7CiAJCQlTdG9yYWdlIHN0b3JhZ2UgPSByLmdldFN0b3JhZ2UoKTsKIAkJCWlmIChzdG9yYWdlID09IFN0b3JhZ2UuTE9PU0UgfHwgc3RvcmFnZSA9PSBTdG9yYWdlLkxPT1NFX1BBQ0tFRCkKIAkJCQlyZXQubnVtYmVyT2ZMb29zZVJlZnMrKzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0djTG9nLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9HY0xvZy5qYXZhCmluZGV4IDgyNDU4YzEuLjBlNTg3Y2UgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0djTG9nLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvR2NMb2cuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKQEAgLTE3MSw2ICsxNzEsNiBAQCB2b2lkIHdyaXRlKFN0cmluZyBjb250ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoY29udGVudC5sZW5ndGgoKSA+IDApIHsKIAkJCW5vbkVtcHR5ID0gdHJ1ZTsKIAkJfQotCQlsb2NrLndyaXRlKGNvbnRlbnQuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJbG9jay53cml0ZShjb250ZW50LmdldEJ5dGVzKENIQVJTRVQpKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9MYXp5T2JqZWN0SWRTZXRGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9MYXp5T2JqZWN0SWRTZXRGaWxlLmphdmEKaW5kZXggM2QwZTljNy4uYzgyZDUyZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTGF6eU9iamVjdElkU2V0RmlsZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xhenlPYmplY3RJZFNldEZpbGUuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTg2LDcgKzg2LDcgQEAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoQW55T2JqZWN0SWQgb2JqZWN0SWQpIHsKIAlwcml2YXRlIE9iamVjdElkT3duZXJNYXA8RW50cnk+IGxvYWQoKSB7CiAJCU9iamVjdElkT3duZXJNYXA8RW50cnk+IHIgPSBuZXcgT2JqZWN0SWRPd25lck1hcDw+KCk7CiAJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGZpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oc3JjKTsKLQkJCQlSZWFkZXIgcmluID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGZpbiwgVVRGXzgpOworCQkJCVJlYWRlciByaW4gPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZmluLCBDSEFSU0VUKTsKIAkJCQlCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyaW4pKSB7CiAJCQlNdXRhYmxlT2JqZWN0SWQgaWQgPSBuZXcgTXV0YWJsZU9iamVjdElkKCk7CiAJCQlmb3IgKFN0cmluZyBsaW5lOyAobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGw7KSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NhbE9iamVjdFRvUGFjay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9jYWxPYmplY3RUb1BhY2suamF2YQppbmRleCA1NWVlYjk1Li5lZDVjYmZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NhbE9iamVjdFRvUGFjay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2FsT2JqZWN0VG9QYWNrLmphdmEKQEAgLTU4LDcgKzU4LDcgQEAgY2xhc3MgTG9jYWxPYmplY3RUb1BhY2sgZXh0ZW5kcyBPYmplY3RUb1BhY2sgewogCS8qKiBMZW5ndGggb2YgdGhlIGRhdGEgc2VjdGlvbiBvZiB0aGUgb2JqZWN0LiAqLwogCWxvbmcgbGVuZ3RoOwogCi0JTG9jYWxPYmplY3RUb1BhY2soQW55T2JqZWN0SWQgc3JjLCBmaW5hbCBpbnQgdHlwZSkgeworCUxvY2FsT2JqZWN0VG9QYWNrKEFueU9iamVjdElkIHNyYywgaW50IHR5cGUpIHsKIAkJc3VwZXIoc3JjLCB0eXBlKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2tGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Mb2NrRmlsZS5qYXZhCmluZGV4IDliZWZlMmEuLmI4MGM1OGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL0xvY2tGaWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvTG9ja0ZpbGUuamF2YQpAQCAtOTMsNyArOTMsNyBAQCBwdWJsaWMgY2xhc3MgTG9ja0ZpbGUgewogCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfSBvYmplY3QuCiAJICogQHJldHVybiB0cnVlIGlmIHVubG9ja2VkLCBmYWxzZSBpZiB1bmxvY2tpbmcgZmFpbGVkCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHVubG9jayhmaW5hbCBGaWxlIGZpbGUpIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdW5sb2NrKEZpbGUgZmlsZSkgewogCQlmaW5hbCBGaWxlIGxvY2tGaWxlID0gZ2V0TG9ja0ZpbGUoZmlsZSk7CiAJCWZpbmFsIGludCBmbGFncyA9IEZpbGVVdGlscy5SRVRSWSB8IEZpbGVVdGlscy5TS0lQX01JU1NJTkc7CiAJCXRyeSB7CkBAIC0xNDQsMjYgKzE0NCw4IEBAIHB1YmxpYyBib29sZWFuIGFjY2VwdChGaWxlIGRpciwgU3RyaW5nIG5hbWUpIHsKIAkgKgogCSAqIEBwYXJhbSBmCiAJICogICAgICAgICAgICB0aGUgZmlsZSB0aGF0IHdpbGwgYmUgbG9ja2VkLgotCSAqIEBwYXJhbSBmcwotCSAqICAgICAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGFic3RyYWN0aW9uIHdoaWNoIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHBlcmZvcm0KLQkgKiAgICAgICAgICAgIGNlcnRhaW4gZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4KLQkgKiBAZGVwcmVjYXRlZCB1c2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLmZpbGUuTG9ja0ZpbGUjTG9ja0ZpbGUoRmlsZSl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAogCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIExvY2tGaWxlKGZpbmFsIEZpbGUgZiwgZmluYWwgRlMgZnMpIHsKLQkJcmVmID0gZjsKLQkJbGNrID0gZ2V0TG9ja0ZpbGUocmVmKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbG9jayBmb3IgYW55IGZpbGUuCi0JICoKLQkgKiBAcGFyYW0gZgotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdGhhdCB3aWxsIGJlIGxvY2tlZC4KLQkgKi8KLQlwdWJsaWMgTG9ja0ZpbGUoZmluYWwgRmlsZSBmKSB7CisJcHVibGljIExvY2tGaWxlKEZpbGUgZikgewogCQlyZWYgPSBmOwogCQlsY2sgPSBnZXRMb2NrRmlsZShyZWYpOwogCX0KQEAgLTI4Miw3ICsyNjQsNyBAQCBwdWJsaWMgdm9pZCBjb3B5Q3VycmVudENvbnRlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgICAgIHRoZSB0ZW1wb3JhcnkgZmlsZSBjb3VsZCBub3QgYmUgd3JpdHRlbi4gVGhlIGxvY2sgaXMgcmVsZWFzZWQKIAkgKiAgICAgICAgICAgICBiZWZvcmUgdGhyb3dpbmcgdGhlIHVuZGVybHlpbmcgZXhjZXB0aW9uIHRvIHRoZSBjYWxsZXIuCiAJICovCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgT2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGUoT2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEggKyAxXTsKIAkJaWQuY29weVRvKGJ1ZiwgMCk7CiAJCWJ1ZltDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEhdID0gJ1xuJzsKQEAgLTMwMyw3ICsyODUsNyBAQCBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgICB0aGUgdGVtcG9yYXJ5IGZpbGUgY291bGQgbm90IGJlIHdyaXR0ZW4uIFRoZSBsb2NrIGlzIHJlbGVhc2VkCiAJICogICAgICAgICAgICAgYmVmb3JlIHRocm93aW5nIHRoZSB1bmRlcmx5aW5nIGV4Y2VwdGlvbiB0byB0aGUgY2FsbGVyLgogCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBjb250ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBjb250ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXF1aXJlTG9jaygpOwogCQl0cnkgewogCQkJaWYgKGZzeW5jKSB7CkBAIC0zNDksMTggKzMzMSwxOCBAQCBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHsKIAogCQlyZXR1cm4gbmV3IE91dHB1dFN0cmVhbSgpIHsKIAkJCUBPdmVycmlkZQotCQkJcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvLCBmaW5hbCBpbnQgbikKKwkJCXB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgbywgaW50IG4pCiAJCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJb3V0LndyaXRlKGIsIG8sIG4pOwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJb3V0LndyaXRlKGIpOwogCQkJfQogCiAJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJb3V0LndyaXRlKGIpOwogCQkJfQogCkBAIC00MDAsNyArMzgyLDcgQEAgdm9pZCByZXF1aXJlTG9jaygpIHsKIAkgKiBAcGFyYW0gb24KIAkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGNvbW1pdCBtZXRob2QgbXVzdCByZW1lbWJlciB0aGUgbW9kaWZpY2F0aW9uIHRpbWUuCiAJICovCi0JcHVibGljIHZvaWQgc2V0TmVlZFN0YXRJbmZvcm1hdGlvbihmaW5hbCBib29sZWFuIG9uKSB7CisJcHVibGljIHZvaWQgc2V0TmVlZFN0YXRJbmZvcm1hdGlvbihib29sZWFuIG9uKSB7CiAJCXNldE5lZWRTbmFwc2hvdChvbik7CiAJfQogCkBAIC00MTEsNyArMzkzLDcgQEAgcHVibGljIHZvaWQgc2V0TmVlZFN0YXRJbmZvcm1hdGlvbihmaW5hbCBib29sZWFuIG9uKSB7CiAJICogQHBhcmFtIG9uCiAJICogICAgICAgICAgICB0cnVlIGlmIHRoZSBjb21taXQgbWV0aG9kIG11c3QgcmVtZW1iZXIgdGhlIEZpbGVTbmFwc2hvdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZWVkU25hcHNob3QoZmluYWwgYm9vbGVhbiBvbikgeworCXB1YmxpYyB2b2lkIHNldE5lZWRTbmFwc2hvdChib29sZWFuIG9uKSB7CiAJCW5lZWRTbmFwc2hvdCA9IG9uOwogCX0KIApAQCAtNDIxLDcgKzQwMyw3IEBAIHB1YmxpYyB2b2lkIHNldE5lZWRTbmFwc2hvdChmaW5hbCBib29sZWFuIG9uKSB7CiAJICogQHBhcmFtIG9uCiAJICogICAgICAgICAgICB0cnVlIGlmIGRpcnR5IGRhdGEgc2hvdWxkIGJlIGZvcmNlZCB0byB0aGUgZHJpdmUuCiAJICovCi0JcHVibGljIHZvaWQgc2V0RlN5bmMoZmluYWwgYm9vbGVhbiBvbikgeworCXB1YmxpYyB2b2lkIHNldEZTeW5jKGJvb2xlYW4gb24pIHsKIAkJZnN5bmMgPSBvbjsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5LmphdmEKaW5kZXggODgxZTM4Zi4uMmI2ZDIzMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5LmphdmEKQEAgLTI1Nyw3ICsyNTcsNyBAQCBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAkJLy8gRnVsbHkgY2xvc2UgYWxsIGxvYWRlZCBhbHRlcm5hdGVzIGFuZCBjbGVhciB0aGUgYWx0ZXJuYXRlIGxpc3QuCiAJCUFsdGVybmF0ZUhhbmRsZVtdIGFsdCA9IGFsdGVybmF0ZXMuZ2V0KCk7CiAJCWlmIChhbHQgIT0gbnVsbCAmJiBhbHRlcm5hdGVzLmNvbXBhcmVBbmRTZXQoYWx0LCBudWxsKSkgewotCQkJZm9yKGZpbmFsIEFsdGVybmF0ZUhhbmRsZSBvZCA6IGFsdCkKKwkJCWZvcihBbHRlcm5hdGVIYW5kbGUgb2QgOiBhbHQpCiAJCQkJb2QuY2xvc2UoKTsKIAkJfQogCX0KQEAgLTI3OCw3ICsyNzgsNyBAQCBwdWJsaWMgQ29sbGVjdGlvbjxQYWNrRmlsZT4gZ2V0UGFja3MoKSB7CiAJICogQWRkIGEgc2luZ2xlIGV4aXN0aW5nIHBhY2sgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHBhY2sgZmlsZXMuCiAJICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFBhY2tGaWxlIG9wZW5QYWNrKGZpbmFsIEZpbGUgcGFjaykKKwlwdWJsaWMgUGFja0ZpbGUgb3BlblBhY2soRmlsZSBwYWNrKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHAgPSBwYWNrLmdldE5hbWUoKTsKIAkJaWYgKHAubGVuZ3RoKCkgIT0gNTAgfHwgIXAuc3RhcnRzV2l0aCgicGFjay0iKSB8fCAhcC5lbmRzV2l0aCgiLnBhY2siKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC02MjIsNyArNjIyLDcgQEAgcHJpdmF0ZSB2b2lkIHNlbGVjdE9iamVjdFJlcHJlc2VudGF0aW9uKFBhY2tXcml0ZXIgcGFja2VyLCBPYmplY3RUb1BhY2sgb3RwLAogCQkJV2luZG93Q3Vyc29yIGN1cnMsIFNldDxBbHRlcm5hdGVIYW5kbGUuSWQ+IHNraXBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlQYWNrTGlzdCBwTGlzdCA9IHBhY2tMaXN0LmdldCgpOwogCQlTRUFSQ0g6IGZvciAoOzspIHsKLQkJCWZvciAoZmluYWwgUGFja0ZpbGUgcCA6IHBMaXN0LnBhY2tzKSB7CisJCQlmb3IgKFBhY2tGaWxlIHAgOiBwTGlzdC5wYWNrcykgewogCQkJCXRyeSB7CiAJCQkJCUxvY2FsT2JqZWN0UmVwcmVzZW50YXRpb24gcmVwID0gcC5yZXByZXNlbnRhdGlvbihjdXJzLCBvdHApOwogCQkJCQlwLnJlc2V0VHJhbnNpZW50RXJyb3JDb3VudCgpOwpAQCAtODE5LDcgKzgxOSw3IEBAIFNldDxPYmplY3RJZD4gZ2V0U2hhbGxvd0NvbW1pdHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gc2hhbGxvd0NvbW1pdHNJZHM7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGluc2VydFBhY2soZmluYWwgUGFja0ZpbGUgcGYpIHsKKwlwcml2YXRlIHZvaWQgaW5zZXJ0UGFjayhQYWNrRmlsZSBwZikgewogCQlQYWNrTGlzdCBvLCBuOwogCQlkbyB7CiAJCQlvID0gcGFja0xpc3QuZ2V0KCk7CkBAIC04NDIsNyArODQyLDcgQEAgcHJpdmF0ZSB2b2lkIGluc2VydFBhY2soZmluYWwgUGFja0ZpbGUgcGYpIHsKIAkJfSB3aGlsZSAoIXBhY2tMaXN0LmNvbXBhcmVBbmRTZXQobywgbikpOwogCX0KIAotCXByaXZhdGUgdm9pZCByZW1vdmVQYWNrKGZpbmFsIFBhY2tGaWxlIGRlYWRQYWNrKSB7CisJcHJpdmF0ZSB2b2lkIHJlbW92ZVBhY2soUGFja0ZpbGUgZGVhZFBhY2spIHsKIAkJUGFja0xpc3QgbywgbjsKIAkJZG8gewogCQkJbyA9IHBhY2tMaXN0LmdldCgpOwpAQCAtODYwLDcgKzg2MCw3IEBAIHByaXZhdGUgdm9pZCByZW1vdmVQYWNrKGZpbmFsIFBhY2tGaWxlIGRlYWRQYWNrKSB7CiAJCWRlYWRQYWNrLmNsb3NlKCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2YoZmluYWwgUGFja0ZpbGVbXSBsaXN0LCBmaW5hbCBQYWNrRmlsZSBwYWNrKSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IGluZGV4T2YoUGFja0ZpbGVbXSBsaXN0LCBQYWNrRmlsZSBwYWNrKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogCQkJaWYgKGxpc3RbaV0gPT0gcGFjaykKIAkJCQlyZXR1cm4gaTsKQEAgLTg2OCw3ICs4NjgsNyBAQCBwcml2YXRlIHN0YXRpYyBpbnQgaW5kZXhPZihmaW5hbCBQYWNrRmlsZVtdIGxpc3QsIGZpbmFsIFBhY2tGaWxlIHBhY2spIHsKIAkJcmV0dXJuIC0xOwogCX0KIAotCXByaXZhdGUgUGFja0xpc3Qgc2NhblBhY2tzKGZpbmFsIFBhY2tMaXN0IG9yaWdpbmFsKSB7CisJcHJpdmF0ZSBQYWNrTGlzdCBzY2FuUGFja3MoUGFja0xpc3Qgb3JpZ2luYWwpIHsKIAkJc3luY2hyb25pemVkIChwYWNrTGlzdCkgewogCQkJUGFja0xpc3QgbywgbjsKIAkJCWRvIHsKQEAgLTg4NywxMyArODg3LDEzIEBAIHByaXZhdGUgUGFja0xpc3Qgc2NhblBhY2tzKGZpbmFsIFBhY2tMaXN0IG9yaWdpbmFsKSB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIFBhY2tMaXN0IHNjYW5QYWNrc0ltcGwoZmluYWwgUGFja0xpc3Qgb2xkKSB7CisJcHJpdmF0ZSBQYWNrTGlzdCBzY2FuUGFja3NJbXBsKFBhY2tMaXN0IG9sZCkgewogCQlmaW5hbCBNYXA8U3RyaW5nLCBQYWNrRmlsZT4gZm9yUmV1c2UgPSByZXVzZU1hcChvbGQpOwogCQlmaW5hbCBGaWxlU25hcHNob3Qgc25hcHNob3QgPSBGaWxlU25hcHNob3Quc2F2ZShwYWNrRGlyZWN0b3J5KTsKIAkJZmluYWwgU2V0PFN0cmluZz4gbmFtZXMgPSBsaXN0UGFja0RpcmVjdG9yeSgpOwogCQlmaW5hbCBMaXN0PFBhY2tGaWxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KG5hbWVzLnNpemUoKSA+PiAyKTsKIAkJYm9vbGVhbiBmb3VuZE5ldyA9IGZhbHNlOwotCQlmb3IgKGZpbmFsIFN0cmluZyBpbmRleE5hbWUgOiBuYW1lcykgeworCQlmb3IgKFN0cmluZyBpbmRleE5hbWUgOiBuYW1lcykgewogCQkJLy8gTXVzdCBtYXRjaCAicGFjay1bMC05YS1mXXs0MH0uaWR4IiB0byBiZSBhbiBpbmRleC4KIAkJCS8vCiAJCQlpZiAoaW5kZXhOYW1lLmxlbmd0aCgpICE9IDQ5IHx8ICFpbmRleE5hbWUuZW5kc1dpdGgoIi5pZHgiKSkgLy8kTk9OLU5MUy0xJApAQCAtOTM2LDcgKzkzNiw3IEBAIHByaXZhdGUgUGFja0xpc3Qgc2NhblBhY2tzSW1wbChmaW5hbCBQYWNrTGlzdCBvbGQpIHsKIAkJCXJldHVybiBvbGQ7CiAJCX0KIAotCQlmb3IgKGZpbmFsIFBhY2tGaWxlIHAgOiBmb3JSZXVzZS52YWx1ZXMoKSkgeworCQlmb3IgKFBhY2tGaWxlIHAgOiBmb3JSZXVzZS52YWx1ZXMoKSkgewogCQkJcC5jbG9zZSgpOwogCQl9CiAKQEAgLTk0OCw5ICs5NDgsOSBAQCBwcml2YXRlIFBhY2tMaXN0IHNjYW5QYWNrc0ltcGwoZmluYWwgUGFja0xpc3Qgb2xkKSB7CiAJCXJldHVybiBuZXcgUGFja0xpc3Qoc25hcHNob3QsIHIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFBhY2tGaWxlPiByZXVzZU1hcChmaW5hbCBQYWNrTGlzdCBvbGQpIHsKKwlwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBQYWNrRmlsZT4gcmV1c2VNYXAoUGFja0xpc3Qgb2xkKSB7CiAJCWZpbmFsIE1hcDxTdHJpbmcsIFBhY2tGaWxlPiBmb3JSZXVzZSA9IG5ldyBIYXNoTWFwPD4oKTsKLQkJZm9yIChmaW5hbCBQYWNrRmlsZSBwIDogb2xkLnBhY2tzKSB7CisJCWZvciAoUGFja0ZpbGUgcCA6IG9sZC5wYWNrcykgewogCQkJaWYgKHAuaW52YWxpZCgpKSB7CiAJCQkJLy8gVGhlIHBhY2sgaW5zdGFuY2UgaXMgY29ycnVwdGVkLCBhbmQgY2Fubm90IGJlIHNhZmVseSB1c2VkCiAJCQkJLy8gYWdhaW4uIERvIG5vdCBpbmNsdWRlIGl0IGluIG91ciByZXVzZSBtYXAuCkBAIC05NzksNyArOTc5LDcgQEAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBsaXN0UGFja0RpcmVjdG9yeSgpIHsKIAkJaWYgKG5hbWVMaXN0ID09IG51bGwpCiAJCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKIAkJZmluYWwgU2V0PFN0cmluZz4gbmFtZVNldCA9IG5ldyBIYXNoU2V0PD4obmFtZUxpc3QubGVuZ3RoIDw8IDEpOwotCQlmb3IgKGZpbmFsIFN0cmluZyBuYW1lIDogbmFtZUxpc3QpIHsKKwkJZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVMaXN0KSB7CiAJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJwYWNrLSIpKSAvLyROT04tTkxTLTEkCiAJCQkJbmFtZVNldC5hZGQobmFtZSk7CiAJCX0KQEAgLTEwMzgsMTIgKzEwMzgsMTIgQEAgU2V0PEFsdGVybmF0ZUhhbmRsZS5JZD4gYWRkTWUoU2V0PEFsdGVybmF0ZUhhbmRsZS5JZD4gc2tpcHMpIHsKIAkJcmV0dXJuIGwudG9BcnJheShuZXcgQWx0ZXJuYXRlSGFuZGxlW2wuc2l6ZSgpXSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgQnVmZmVyZWRSZWFkZXIgb3BlbihmaW5hbCBGaWxlIGYpCisJcHJpdmF0ZSBzdGF0aWMgQnVmZmVyZWRSZWFkZXIgb3BlbihGaWxlIGYpCiAJCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmKSk7CiAJfQogCi0JcHJpdmF0ZSBBbHRlcm5hdGVIYW5kbGUgb3BlbkFsdGVybmF0ZShmaW5hbCBTdHJpbmcgbG9jYXRpb24pCisJcHJpdmF0ZSBBbHRlcm5hdGVIYW5kbGUgb3BlbkFsdGVybmF0ZShTdHJpbmcgbG9jYXRpb24pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBGaWxlIG9iamRpciA9IGZzLnJlc29sdmUob2JqZWN0cywgbG9jYXRpb24pOwogCQlyZXR1cm4gb3BlbkFsdGVybmF0ZShvYmpkaXIpOwpAQCAtMTA4MSw3ICsxMDgxLDcgQEAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUGFja0xpc3QgewogCQkvKiogQWxsIGtub3duIHBhY2tzLCBzb3J0ZWQgYnkge0BsaW5rIFBhY2tGaWxlI1NPUlR9LiAqLwogCQlmaW5hbCBQYWNrRmlsZVtdIHBhY2tzOwogCi0JCVBhY2tMaXN0KGZpbmFsIEZpbGVTbmFwc2hvdCBtb25pdG9yLCBmaW5hbCBQYWNrRmlsZVtdIHBhY2tzKSB7CisJCVBhY2tMaXN0KEZpbGVTbmFwc2hvdCBtb25pdG9yLCBQYWNrRmlsZVtdIHBhY2tzKSB7CiAJCQl0aGlzLnNuYXBzaG90ID0gbW9uaXRvcjsKIAkJCXRoaXMucGFja3MgPSBwYWNrczsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5SW5zZXJ0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeUluc2VydGVyLmphdmEKaW5kZXggZTA2ZjcyMS4uZTVhNTRlMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5SW5zZXJ0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnlJbnNlcnRlci5qYXZhCkBAIC03OCw3ICs3OCw3IEBAIGNsYXNzIE9iamVjdERpcmVjdG9yeUluc2VydGVyIGV4dGVuZHMgT2JqZWN0SW5zZXJ0ZXIgewogCiAJcHJpdmF0ZSBEZWZsYXRlciBkZWZsYXRlOwogCi0JT2JqZWN0RGlyZWN0b3J5SW5zZXJ0ZXIoZmluYWwgRmlsZU9iamVjdERhdGFiYXNlIGRlc3QsIGZpbmFsIENvbmZpZyBjZmcpIHsKKwlPYmplY3REaXJlY3RvcnlJbnNlcnRlcihGaWxlT2JqZWN0RGF0YWJhc2UgZGVzdCwgQ29uZmlnIGNmZykgewogCQlkYiA9IGRlc3Q7CiAJCWNvbmZpZyA9IGNmZy5nZXQoV3JpdGVDb25maWcuS0VZKTsKIAl9CkBAIC0xMTcsNyArMTE3LDcgQEAgcHJpdmF0ZSBPYmplY3RJZCBpbnNlcnQoCiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3RJZCBpbnNlcnQoZmluYWwgaW50IHR5cGUsIGxvbmcgbGVuLCBmaW5hbCBJbnB1dFN0cmVhbSBpcykKKwlwdWJsaWMgT2JqZWN0SWQgaW5zZXJ0KGludCB0eXBlLCBsb25nIGxlbiwgSW5wdXRTdHJlYW0gaXMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gaW5zZXJ0KHR5cGUsIGxlbiwgaXMsIGZhbHNlKTsKIAl9CkBAIC0yNjcsNyArMjY3LDcgQEAgcHJpdmF0ZSBGaWxlIHRvVGVtcChmaW5hbCBpbnQgdHlwZSwgZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IHBvcywKIAkJfQogCX0KIAotCXZvaWQgd3JpdGVIZWFkZXIoT3V0cHV0U3RyZWFtIG91dCwgZmluYWwgaW50IHR5cGUsIGxvbmcgbGVuKQorCXZvaWQgd3JpdGVIZWFkZXIoT3V0cHV0U3RyZWFtIG91dCwgaW50IHR5cGUsIGxvbmcgbGVuKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJb3V0LndyaXRlKENvbnN0YW50cy5lbmNvZGVkVHlwZVN0cmluZyh0eXBlKSk7CiAJCW91dC53cml0ZSgoYnl0ZSkgJyAnKTsKQEAgLTI3OSw3ICsyNzksNyBAQCBGaWxlIG5ld1RlbXBGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIEZpbGUuY3JlYXRlVGVtcEZpbGUoIm5veiIsIG51bGwsIGRiLmdldERpcmVjdG9yeSgpKTsgLy8kTk9OLU5MUy0xJAogCX0KIAotCURlZmxhdGVyT3V0cHV0U3RyZWFtIGNvbXByZXNzKGZpbmFsIE91dHB1dFN0cmVhbSBvdXQpIHsKKwlEZWZsYXRlck91dHB1dFN0cmVhbSBjb21wcmVzcyhPdXRwdXRTdHJlYW0gb3V0KSB7CiAJCWlmIChkZWZsYXRlID09IG51bGwpCiAJCQlkZWZsYXRlID0gbmV3IERlZmxhdGVyKGNvbmZpZy5nZXRDb21wcmVzc2lvbigpKTsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5UGFja1BhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvT2JqZWN0RGlyZWN0b3J5UGFja1BhcnNlci5qYXZhCmluZGV4IDVkY2JhNjAuLjBjZWMyZDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL09iamVjdERpcmVjdG9yeVBhY2tQYXJzZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9PYmplY3REaXJlY3RvcnlQYWNrUGFyc2VyLmphdmEKQEAgLTE1Myw3ICsxNTMsNyBAQCBwdWJsaWMgdm9pZCBzZXRJbmRleFZlcnNpb24oaW50IHZlcnNpb24pIHsKIAkgKiBAcGFyYW0gZW1wdHkKIAkgKiAgICAgICAgICAgIHRydWUgdG8gZW5hYmxlIGtlZXBpbmcgYW4gZW1wdHkgcGFjay4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLZWVwRW1wdHkoZmluYWwgYm9vbGVhbiBlbXB0eSkgeworCXB1YmxpYyB2b2lkIHNldEtlZXBFbXB0eShib29sZWFuIGVtcHR5KSB7CiAJCWtlZXBFbXB0eSA9IGVtcHR5OwogCX0KIApAQCAtNDI5LDggKzQyOSw3IEBAIHByb3RlY3RlZCB2b2lkIG9uRW5kVGhpblBhY2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlSWR4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJTGlzdDxQYWNrZWRPYmplY3RJbmZvPiBsaXN0ID0gZ2V0U29ydGVkT2JqZWN0TGlzdChudWxsIC8qIGJ5IE9iamVjdElkICovKTsKLQkJZmluYWwgRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcElkeCk7Ci0JCXRyeSB7CisJCXRyeSAoRmlsZU91dHB1dFN0cmVhbSBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcElkeCkpIHsKIAkJCWZpbmFsIFBhY2tJbmRleFdyaXRlciBpdzsKIAkJCWlmIChpbmRleFZlcnNpb24gPD0gMCkKIAkJCQlpdyA9IFBhY2tJbmRleFdyaXRlci5jcmVhdGVPbGRlc3RQb3NzaWJsZShvcywgbGlzdCk7CkBAIC00MzgsMTIgKzQzNywxMCBAQCBwcml2YXRlIHZvaWQgd3JpdGVJZHgoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWl3ID0gUGFja0luZGV4V3JpdGVyLmNyZWF0ZVZlcnNpb24ob3MsIGluZGV4VmVyc2lvbik7CiAJCQlpdy53cml0ZShsaXN0LCBwYWNrSGFzaCk7CiAJCQlvcy5nZXRDaGFubmVsKCkuZm9yY2UodHJ1ZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlvcy5jbG9zZSgpOwogCQl9CiAJfQogCi0JcHJpdmF0ZSBQYWNrTG9jayByZW5hbWVBbmRPcGVuUGFjayhmaW5hbCBTdHJpbmcgbG9ja01lc3NhZ2UpCisJcHJpdmF0ZSBQYWNrTG9jayByZW5hbWVBbmRPcGVuUGFjayhTdHJpbmcgbG9ja01lc3NhZ2UpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoIWtlZXBFbXB0eSAmJiBnZXRPYmplY3RDb3VudCgpID09IDApIHsKIAkJCWNsZWFudXBUZW1wb3JhcnlGaWxlcygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0JpdG1hcEluZGV4LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQppbmRleCAyMWExYzdmLi42NzcyZTJjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrQml0bWFwSW5kZXguamF2YQpAQCAtNDQsNyArNDQsNiBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UuZmlsZTsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CkBAIC01Myw2ICs1Miw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5BbnlPYmplY3RJZDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uU2lsZW50RmlsZUlucHV0U3RyZWFtOwogCiBpbXBvcnQgY29tLmdvb2dsZWNvZGUuamF2YWV3YWguRVdBSENvbXByZXNzZWRCaXRtYXA7CiAKQEAgLTkzLDE5ICs5MywxNSBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUGFja0JpdG1hcEluZGV4IHsKIAlwdWJsaWMgc3RhdGljIFBhY2tCaXRtYXBJbmRleCBvcGVuKAogCQkJRmlsZSBpZHhGaWxlLCBQYWNrSW5kZXggcGFja0luZGV4LCBQYWNrUmV2ZXJzZUluZGV4IHJldmVyc2VJbmRleCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBmZCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaWR4RmlsZSk7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gcmVhZChmZCwgcGFja0luZGV4LCByZXZlcnNlSW5kZXgpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0Ci0JCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5yZWFkYWJsZVBhY2tJbmRleCwKLQkJCQkJCQlpZHhGaWxlLmdldEFic29sdXRlUGF0aCgpKSwKLQkJCQkJaW9lKTsKLQkJfSBmaW5hbGx5IHsKKwkJdHJ5IChTaWxlbnRGaWxlSW5wdXRTdHJlYW0gZmQgPSBuZXcgU2lsZW50RmlsZUlucHV0U3RyZWFtKAorCQkJCWlkeEZpbGUpKSB7CiAJCQl0cnkgewotCQkJCWZkLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIyKSB7Ci0JCQkJLy8gaWdub3JlCisJCQkJcmV0dXJuIHJlYWQoZmQsIHBhY2tJbmRleCwgcmV2ZXJzZUluZGV4KTsKKwkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigKKwkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVucmVhZGFibGVQYWNrSW5kZXgsCisJCQkJCQkJCWlkeEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpLAorCQkJCQkJaW9lKTsKIAkJCX0KIAkJfQogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tGaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrRmlsZS5qYXZhCmluZGV4IDM0MTE1N2YuLmVlM2MwYTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tGaWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0ZpbGUuamF2YQpAQCAtMTAzLDcgKzEwMyw3IEBAIHB1YmxpYyBjbGFzcyBQYWNrRmlsZSBpbXBsZW1lbnRzIEl0ZXJhYmxlPFBhY2tJbmRleC5NdXRhYmxlRW50cnk+IHsKIAkvKiogU29ydHMgUGFja0ZpbGVzIHRvIGJlIG1vc3QgcmVjZW50bHkgY3JlYXRlZCB0byBsZWFzdCByZWNlbnRseSBjcmVhdGVkLiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxQYWNrRmlsZT4gU09SVCA9IG5ldyBDb21wYXJhdG9yPFBhY2tGaWxlPigpIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBQYWNrRmlsZSBhLCBmaW5hbCBQYWNrRmlsZSBiKSB7CisJCXB1YmxpYyBpbnQgY29tcGFyZShQYWNrRmlsZSBhLCBQYWNrRmlsZSBiKSB7CiAJCQlyZXR1cm4gYi5wYWNrTGFzdE1vZGlmaWVkIC0gYS5wYWNrTGFzdE1vZGlmaWVkOwogCQl9CiAJfTsKQEAgLTE2NCw3ICsxNjQsNyBAQCBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgUGFja0ZpbGUgYSwgZmluYWwgUGFja0ZpbGUgYikgewogCSAqIEBwYXJhbSBleHRlbnNpb25zCiAJICogICAgICAgICAgICBhZGRpdGlvbmFsIHBhY2sgZmlsZSBleHRlbnNpb25zIHdpdGggdGhlIHNhbWUgYmFzZSBhcyB0aGUgcGFjawogCSAqLwotCXB1YmxpYyBQYWNrRmlsZShmaW5hbCBGaWxlIHBhY2tGaWxlLCBpbnQgZXh0ZW5zaW9ucykgeworCXB1YmxpYyBQYWNrRmlsZShGaWxlIHBhY2tGaWxlLCBpbnQgZXh0ZW5zaW9ucykgewogCQl0aGlzLnBhY2tGaWxlID0gcGFja0ZpbGU7CiAJCXRoaXMuZmlsZVNuYXBzaG90ID0gRmlsZVNuYXBzaG90LnNhdmUocGFja0ZpbGUpOwogCQl0aGlzLnBhY2tMYXN0TW9kaWZpZWQgPSAoaW50KSAoZmlsZVNuYXBzaG90Lmxhc3RNb2RpZmllZCgpID4+IDEwKTsKQEAgLTI2NSw3ICsyNjUsNyBAQCBwdWJsaWMgU3RyaW5nIGdldFBhY2tOYW1lKCkgewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBpbmRleCBmaWxlIGNhbm5vdCBiZSBsb2FkZWQgaW50byBtZW1vcnkuCiAJICovCi0JcHVibGljIGJvb2xlYW4gaGFzT2JqZWN0KGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBib29sZWFuIGhhc09iamVjdChBbnlPYmplY3RJZCBpZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgbG9uZyBvZmZzZXQgPSBpZHgoKS5maW5kT2Zmc2V0KGlkKTsKIAkJcmV0dXJuIDAgPCBvZmZzZXQgJiYgIWlzQ29ycnVwdChvZmZzZXQpOwogCX0KQEAgLTI5Myw3ICsyOTMsNyBAQCBwdWJsaWMgYm9vbGVhbiBzaG91bGRCZUtlcHQoKSB7CiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBwYWNrIGZpbGUgb3IgdGhlIGluZGV4IGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCU9iamVjdExvYWRlciBnZXQoZmluYWwgV2luZG93Q3Vyc29yIGN1cnMsIGZpbmFsIEFueU9iamVjdElkIGlkKQorCU9iamVjdExvYWRlciBnZXQoV2luZG93Q3Vyc29yIGN1cnMsIEFueU9iamVjdElkIGlkKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgbG9uZyBvZmZzZXQgPSBpZHgoKS5maW5kT2Zmc2V0KGlkKTsKIAkJcmV0dXJuIDAgPCBvZmZzZXQgJiYgIWlzQ29ycnVwdChvZmZzZXQpID8gbG9hZChjdXJzLCBvZmZzZXQpIDogbnVsbDsKQEAgLTM1OCw3ICszNTgsNyBAQCBsb25nIGdldE9iamVjdENvdW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIGluZGV4IGZpbGUgY2Fubm90IGJlIGxvYWRlZCBpbnRvIG1lbW9yeS4KIAkgKi8KLQlPYmplY3RJZCBmaW5kT2JqZWN0Rm9yT2Zmc2V0KGZpbmFsIGxvbmcgb2Zmc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCU9iamVjdElkIGZpbmRPYmplY3RGb3JPZmZzZXQobG9uZyBvZmZzZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBnZXRSZXZlcnNlSWR4KCkuZmluZE9iamVjdChvZmZzZXQpOwogCX0KIApAQCAtNzE3LDcgKzcxNyw3IEBAIHByaXZhdGUgdm9pZCBkb0Nsb3NlKCkgewogCQl9CiAJfQogCi0JQnl0ZUFycmF5V2luZG93IHJlYWQoZmluYWwgbG9uZyBwb3MsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24geworCUJ5dGVBcnJheVdpbmRvdyByZWFkKGxvbmcgcG9zLCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJc3luY2hyb25pemVkIChyZWFkTG9jaykgewogCQkJaWYgKGludmFsaWQgfHwgZmQgPT0gbnVsbCkgewogCQkJCS8vIER1ZSB0byBjb25jdXJyZW5jeSBiZXR3ZWVuIGEgcmVhZCBhbmQgYW5vdGhlciBwYWNrZmlsZSBpbnZhbGlkYXRpb24gdGhyZWFkCkBAIC03MzYsNyArNzM2LDcgQEAgQnl0ZUFycmF5V2luZG93IHJlYWQoZmluYWwgbG9uZyBwb3MsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JQnl0ZVdpbmRvdyBtbWFwKGZpbmFsIGxvbmcgcG9zLCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlCeXRlV2luZG93IG1tYXAobG9uZyBwb3MsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlzeW5jaHJvbml6ZWQgKHJlYWRMb2NrKSB7CiAJCQlpZiAobGVuZ3RoIDwgcG9zICsgc2l6ZSkKIAkJCQlzaXplID0gKGludCkgKGxlbmd0aCAtIHBvcyk7CkBAIC03OTMsNyArNzkzLDcgQEAgcHJpdmF0ZSB2b2lkIG9uT3BlblBhY2soKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JT2JqZWN0TG9hZGVyIGxvYWQoZmluYWwgV2luZG93Q3Vyc29yIGN1cnMsIGxvbmcgcG9zKQorCU9iamVjdExvYWRlciBsb2FkKFdpbmRvd0N1cnNvciBjdXJzLCBsb25nIHBvcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiwgTGFyZ2VPYmplY3RFeGNlcHRpb24gewogCQl0cnkgewogCQkJZmluYWwgYnl0ZVtdIGliID0gY3Vycy50ZW1wSWQ7CkBAIC05ODIsNyArOTgyLDcgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVsdGEgewogCQlyZXR1cm4gaGRyOwogCX0KIAotCWludCBnZXRPYmplY3RUeXBlKGZpbmFsIFdpbmRvd0N1cnNvciBjdXJzLCBsb25nIHBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpbnQgZ2V0T2JqZWN0VHlwZShXaW5kb3dDdXJzb3IgY3VycywgbG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSBpYiA9IGN1cnMudGVtcElkOwogCQlmb3IgKDs7KSB7CiAJCQlyZWFkRnVsbHkocG9zLCBpYiwgMCwgMjAsIGN1cnMpOwpAQCAtMTAyOSwxMyArMTAyOSwxMyBAQCBpbnQgZ2V0T2JqZWN0VHlwZShmaW5hbCBXaW5kb3dDdXJzb3IgY3VycywgbG9uZyBwb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQlsb25nIGdldE9iamVjdFNpemUoZmluYWwgV2luZG93Q3Vyc29yIGN1cnMsIGZpbmFsIEFueU9iamVjdElkIGlkKQorCWxvbmcgZ2V0T2JqZWN0U2l6ZShXaW5kb3dDdXJzb3IgY3VycywgQW55T2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBsb25nIG9mZnNldCA9IGlkeCgpLmZpbmRPZmZzZXQoaWQpOwogCQlyZXR1cm4gMCA8IG9mZnNldCA/IGdldE9iamVjdFNpemUoY3Vycywgb2Zmc2V0KSA6IC0xOwogCX0KIAotCWxvbmcgZ2V0T2JqZWN0U2l6ZShmaW5hbCBXaW5kb3dDdXJzb3IgY3VycywgZmluYWwgbG9uZyBwb3MpCisJbG9uZyBnZXRPYmplY3RTaXplKFdpbmRvd0N1cnNvciBjdXJzLCBsb25nIHBvcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSBpYiA9IGN1cnMudGVtcElkOwogCQlyZWFkRnVsbHkocG9zLCBpYiwgMCwgMjAsIGN1cnMpOwpAQCAtMTEzMyw3ICsxMTMzLDcgQEAgTG9jYWxPYmplY3RSZXByZXNlbnRhdGlvbiByZXByZXNlbnRhdGlvbihmaW5hbCBXaW5kb3dDdXJzb3IgY3VycywKIAkJfQogCX0KIAotCXByaXZhdGUgbG9uZyBmaW5kRW5kT2Zmc2V0KGZpbmFsIGxvbmcgc3RhcnRPZmZzZXQpCisJcHJpdmF0ZSBsb25nIGZpbmRFbmRPZmZzZXQobG9uZyBzdGFydE9mZnNldCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCWZpbmFsIGxvbmcgbWF4T2Zmc2V0ID0gbGVuZ3RoIC0gMjA7CiAJCXJldHVybiBnZXRSZXZlcnNlSWR4KCkuZmluZE5leHRPZmZzZXQoc3RhcnRPZmZzZXQsIG1heE9mZnNldCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXguamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleC5qYXZhCmluZGV4IGFjZmQ5YzQuLjcyNjk5YjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleC5qYXZhCkBAIC00NSw3ICs0NSw2IEBACiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5maWxlOwogCiBpbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTY0LDYgKzYzLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZFNldDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSU87CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLk5COworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5TaWxlbnRGaWxlSW5wdXRTdHJlYW07CiAKIC8qKgogICogQWNjZXNzIHBhdGggdG8gbG9jYXRlIG9iamVjdHMgYnkge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdElkfSBpbiBhCkBAIC05NCwyMSArOTQsMTUgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIFBhY2tJbmRleAogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGV4aXN0cyBidXQgY291bGQgbm90IGJlIHJlYWQgZHVlIHRvIHNlY3VyaXR5IGVycm9ycywKIAkgKiAgICAgICAgICAgICB1bnJlY29nbml6ZWQgZGF0YSB2ZXJzaW9uLCBvciB1bmV4cGVjdGVkIGRhdGEgY29ycnVwdGlvbi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFBhY2tJbmRleCBvcGVuKGZpbmFsIEZpbGUgaWR4RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgRmlsZUlucHV0U3RyZWFtIGZkID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpZHhGaWxlKTsKLQkJdHJ5IHsKLQkJCXJldHVybiByZWFkKGZkKTsKKwlwdWJsaWMgc3RhdGljIFBhY2tJbmRleCBvcGVuKEZpbGUgaWR4RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdHJ5IChTaWxlbnRGaWxlSW5wdXRTdHJlYW0gZmQgPSBuZXcgU2lsZW50RmlsZUlucHV0U3RyZWFtKAorCQkJCWlkeEZpbGUpKSB7CisJCQkJcmV0dXJuIHJlYWQoZmQpOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0Ci0JCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5yZWFkYWJsZVBhY2tJbmRleCwKKwkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbigKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5yZWFkYWJsZVBhY2tJbmRleCwKIAkJCQkJCQlpZHhGaWxlLmdldEFic29sdXRlUGF0aCgpKSwKIAkJCQkJaW9lKTsKLQkJfSBmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJZmQuY2xvc2UoKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycjIpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KIAkJfQogCX0KIApAQCAtMTQ1LDcgKzEzOSw3IEBAIHB1YmxpYyBzdGF0aWMgUGFja0luZGV4IHJlYWQoSW5wdXRTdHJlYW0gZmQpIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJcmV0dXJuIG5ldyBQYWNrSW5kZXhWMShmZCwgaGRyKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVE9DKGZpbmFsIGJ5dGVbXSBoKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RPQyhieXRlW10gaCkgewogCQlmaW5hbCBieXRlW10gdG9jID0gUGFja0luZGV4V3JpdGVyLlRPQzsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2MubGVuZ3RoOyBpKyspCiAJCQlpZiAoaFtpXSAhPSB0b2NbaV0pCkBAIC0xNjMsNyArMTU3LDcgQEAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RPQyhmaW5hbCBieXRlW10gaCkgewogCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBsb29rIGZvci4gTXVzdCBub3QgYmUgbnVsbC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCBpcyBsaXN0ZWQgaW4gdGhpcyBpbmRleDsgZmFsc2Ugb3RoZXJ3aXNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc09iamVjdChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyBib29sZWFuIGhhc09iamVjdChBbnlPYmplY3RJZCBpZCkgewogCQlyZXR1cm4gZmluZE9mZnNldChpZCkgIT0gLTE7CiAJfQogCkBAIC0yNDcsNyArMjQxLDcgQEAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoQW55T2JqZWN0SWQgaWQpIHsKIAkgKiAgICAgICAgICAgIG5lZ2F0aXZlLCBidXQgc3RpbGwgdmFsaWQuCiAJICogQHJldHVybiB0aGUgT2JqZWN0SWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5LgogCSAqLwotCXB1YmxpYyBmaW5hbCBPYmplY3RJZCBnZXRPYmplY3RJZChmaW5hbCBpbnQgbnRoUG9zaXRpb24pIHsKKwlwdWJsaWMgZmluYWwgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoaW50IG50aFBvc2l0aW9uKSB7CiAJCWlmIChudGhQb3NpdGlvbiA+PSAwKQogCQkJcmV0dXJuIGdldE9iamVjdElkKChsb25nKSBudGhQb3NpdGlvbik7CiAJCWZpbmFsIGludCB1MzEgPSBudGhQb3NpdGlvbiA+Pj4gMTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFYxLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhWMS5qYXZhCmluZGV4IDhlYTMxZTQuLjQ0NDRkZDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFYxLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4VjEuamF2YQpAQCAtMTEzLDE0ICsxMTMsMTQgQEAgcHVibGljIGxvbmcgZ2V0T2JqZWN0Q291bnQoKSB7CiAJQE92ZXJyaWRlCiAJcHVibGljIGxvbmcgZ2V0T2Zmc2V0NjRDb3VudCgpIHsKIAkJbG9uZyBuNjQgPSAwOwotCQlmb3IgKGZpbmFsIE11dGFibGVFbnRyeSBlIDogdGhpcykgeworCQlmb3IgKE11dGFibGVFbnRyeSBlIDogdGhpcykgewogCQkJaWYgKGUuZ2V0T2Zmc2V0KCkgPj0gSW50ZWdlci5NQVhfVkFMVUUpCiAJCQkJbjY0Kys7CiAJCX0KIAkJcmV0dXJuIG42NDsKIAl9CiAKLQlwcml2YXRlIGludCBmaW5kTGV2ZWxPbmUoZmluYWwgbG9uZyBudGhQb3NpdGlvbikgeworCXByaXZhdGUgaW50IGZpbmRMZXZlbE9uZShsb25nIG50aFBvc2l0aW9uKSB7CiAJCWludCBsZXZlbE9uZSA9IEFycmF5cy5iaW5hcnlTZWFyY2goaWR4SGVhZGVyLCBudGhQb3NpdGlvbiArIDEpOwogCQlpZiAobGV2ZWxPbmUgPj0gMCkgewogCQkJLy8gSWYgd2UgaGl0IHRoZSBidWNrZXQgZXhhY3RseSB0aGUgaXRlbSBpcyBpbiB0aGUgYnVja2V0LCBvcgpAQCAtMTM3LDE0ICsxMzcsMTQgQEAgcHJpdmF0ZSBpbnQgZmluZExldmVsT25lKGZpbmFsIGxvbmcgbnRoUG9zaXRpb24pIHsKIAkJcmV0dXJuIGxldmVsT25lOwogCX0KIAotCXByaXZhdGUgaW50IGdldExldmVsVHdvKGZpbmFsIGxvbmcgbnRoUG9zaXRpb24sIGZpbmFsIGludCBsZXZlbE9uZSkgeworCXByaXZhdGUgaW50IGdldExldmVsVHdvKGxvbmcgbnRoUG9zaXRpb24sIGludCBsZXZlbE9uZSkgewogCQlmaW5hbCBsb25nIGJhc2UgPSBsZXZlbE9uZSA+IDAgPyBpZHhIZWFkZXJbbGV2ZWxPbmUgLSAxXSA6IDA7CiAJCXJldHVybiAoaW50KSAobnRoUG9zaXRpb24gLSBiYXNlKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBPYmplY3RJZCBnZXRPYmplY3RJZChmaW5hbCBsb25nIG50aFBvc2l0aW9uKSB7CisJcHVibGljIE9iamVjdElkIGdldE9iamVjdElkKGxvbmcgbnRoUG9zaXRpb24pIHsKIAkJZmluYWwgaW50IGxldmVsT25lID0gZmluZExldmVsT25lKG50aFBvc2l0aW9uKTsKIAkJZmluYWwgaW50IHAgPSBnZXRMZXZlbFR3byhudGhQb3NpdGlvbiwgbGV2ZWxPbmUpOwogCQlmaW5hbCBpbnQgZGF0YUlkeCA9IGlkT2Zmc2V0KHApOwpAQCAtMTYxLDcgKzE2MSw3IEBAIGxvbmcgZ2V0T2Zmc2V0KGxvbmcgbnRoUG9zaXRpb24pIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGxvbmcgZmluZE9mZnNldChmaW5hbCBBbnlPYmplY3RJZCBvYmpJZCkgeworCXB1YmxpYyBsb25nIGZpbmRPZmZzZXQoQW55T2JqZWN0SWQgb2JqSWQpIHsKIAkJZmluYWwgaW50IGxldmVsT25lID0gb2JqSWQuZ2V0Rmlyc3RCeXRlKCk7CiAJCWJ5dGVbXSBkYXRhID0gaWR4ZGF0YVtsZXZlbE9uZV07CiAJCWlmIChkYXRhID09IG51bGwpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhWMi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4VjIuamF2YQppbmRleCA5ZjYyMDFmLi5hOTYwNmNmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhWMi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFYyLmphdmEKQEAgLTE3Niw3ICsxNzYsNyBAQCBwdWJsaWMgbG9uZyBnZXRPZmZzZXQ2NENvdW50KCkgewogCQlyZXR1cm4gb2Zmc2V0NjQubGVuZ3RoIC8gODsKIAl9CiAKLQlwcml2YXRlIGludCBmaW5kTGV2ZWxPbmUoZmluYWwgbG9uZyBudGhQb3NpdGlvbikgeworCXByaXZhdGUgaW50IGZpbmRMZXZlbE9uZShsb25nIG50aFBvc2l0aW9uKSB7CiAJCWludCBsZXZlbE9uZSA9IEFycmF5cy5iaW5hcnlTZWFyY2goZmFub3V0VGFibGUsIG50aFBvc2l0aW9uICsgMSk7CiAJCWlmIChsZXZlbE9uZSA+PSAwKSB7CiAJCQkvLyBJZiB3ZSBoaXQgdGhlIGJ1Y2tldCBleGFjdGx5IHRoZSBpdGVtIGlzIGluIHRoZSBidWNrZXQsIG9yCkBAIC0xOTMsMTQgKzE5MywxNCBAQCBwcml2YXRlIGludCBmaW5kTGV2ZWxPbmUoZmluYWwgbG9uZyBudGhQb3NpdGlvbikgewogCQlyZXR1cm4gbGV2ZWxPbmU7CiAJfQogCi0JcHJpdmF0ZSBpbnQgZ2V0TGV2ZWxUd28oZmluYWwgbG9uZyBudGhQb3NpdGlvbiwgZmluYWwgaW50IGxldmVsT25lKSB7CisJcHJpdmF0ZSBpbnQgZ2V0TGV2ZWxUd28obG9uZyBudGhQb3NpdGlvbiwgaW50IGxldmVsT25lKSB7CiAJCWZpbmFsIGxvbmcgYmFzZSA9IGxldmVsT25lID4gMCA/IGZhbm91dFRhYmxlW2xldmVsT25lIC0gMV0gOiAwOwogCQlyZXR1cm4gKGludCkgKG50aFBvc2l0aW9uIC0gYmFzZSk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoZmluYWwgbG9uZyBudGhQb3NpdGlvbikgeworCXB1YmxpYyBPYmplY3RJZCBnZXRPYmplY3RJZChsb25nIG50aFBvc2l0aW9uKSB7CiAJCWZpbmFsIGludCBsZXZlbE9uZSA9IGZpbmRMZXZlbE9uZShudGhQb3NpdGlvbik7CiAJCWZpbmFsIGludCBwID0gZ2V0TGV2ZWxUd28obnRoUG9zaXRpb24sIGxldmVsT25lKTsKIAkJZmluYWwgaW50IHA0ID0gcCA8PCAyOwpAQCAtMjA5LDcgKzIwOSw3IEBAIHB1YmxpYyBPYmplY3RJZCBnZXRPYmplY3RJZChmaW5hbCBsb25nIG50aFBvc2l0aW9uKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBsb25nIGdldE9mZnNldChmaW5hbCBsb25nIG50aFBvc2l0aW9uKSB7CisJcHVibGljIGxvbmcgZ2V0T2Zmc2V0KGxvbmcgbnRoUG9zaXRpb24pIHsKIAkJZmluYWwgaW50IGxldmVsT25lID0gZmluZExldmVsT25lKG50aFBvc2l0aW9uKTsKIAkJZmluYWwgaW50IGxldmVsVHdvID0gZ2V0TGV2ZWxUd28obnRoUG9zaXRpb24sIGxldmVsT25lKTsKIAkJcmV0dXJuIGdldE9mZnNldChsZXZlbE9uZSwgbGV2ZWxUd28pOwpAQCAtMjE3LDcgKzIxNyw3IEBAIHB1YmxpYyBsb25nIGdldE9mZnNldChmaW5hbCBsb25nIG50aFBvc2l0aW9uKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBsb25nIGZpbmRPZmZzZXQoZmluYWwgQW55T2JqZWN0SWQgb2JqSWQpIHsKKwlwdWJsaWMgbG9uZyBmaW5kT2Zmc2V0KEFueU9iamVjdElkIG9iaklkKSB7CiAJCWZpbmFsIGludCBsZXZlbE9uZSA9IG9iaklkLmdldEZpcnN0Qnl0ZSgpOwogCQlmaW5hbCBpbnQgbGV2ZWxUd28gPSBiaW5hcnlTZWFyY2hMZXZlbFR3byhvYmpJZCwgbGV2ZWxPbmUpOwogCQlpZiAobGV2ZWxUd28gPT0gLTEpCkBAIC0yMjUsNyArMjI1LDcgQEAgcHVibGljIGxvbmcgZmluZE9mZnNldChmaW5hbCBBbnlPYmplY3RJZCBvYmpJZCkgewogCQlyZXR1cm4gZ2V0T2Zmc2V0KGxldmVsT25lLCBsZXZlbFR3byk7CiAJfQogCi0JcHJpdmF0ZSBsb25nIGdldE9mZnNldChmaW5hbCBpbnQgbGV2ZWxPbmUsIGZpbmFsIGludCBsZXZlbFR3bykgeworCXByaXZhdGUgbG9uZyBnZXRPZmZzZXQoaW50IGxldmVsT25lLCBpbnQgbGV2ZWxUd28pIHsKIAkJZmluYWwgbG9uZyBwID0gTkIuZGVjb2RlVUludDMyKG9mZnNldDMyW2xldmVsT25lXSwgbGV2ZWxUd28gPDwgMik7CiAJCWlmICgocCAmIElTX082NCkgIT0gMCkKIAkJCXJldHVybiBOQi5kZWNvZGVVSW50NjQob2Zmc2V0NjQsICg4ICogKGludCkgKHAgJiB+SVNfTzY0KSkpOwpAQCAtMjkwLDcgKzI5MCw3IEBAIHByaXZhdGUgc3RhdGljIGludCBpZE9mZnNldChpbnQgcCkgewogCQlyZXR1cm4gKHAgPDwgMikgKyBwOyAvLyBwICogNQogCX0KIAotCXByaXZhdGUgaW50IGJpbmFyeVNlYXJjaExldmVsVHdvKGZpbmFsIEFueU9iamVjdElkIG9iaklkLCBmaW5hbCBpbnQgbGV2ZWxPbmUpIHsKKwlwcml2YXRlIGludCBiaW5hcnlTZWFyY2hMZXZlbFR3byhBbnlPYmplY3RJZCBvYmpJZCwgaW50IGxldmVsT25lKSB7CiAJCWZpbmFsIGludFtdIGRhdGEgPSBuYW1lc1tsZXZlbE9uZV07CiAJCWludCBoaWdoID0gb2Zmc2V0MzJbbGV2ZWxPbmVdLmxlbmd0aCA+Pj4gMjsKIAkJaWYgKGhpZ2ggPT0gMCkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyLmphdmEKaW5kZXggYjkyZjdiMi4uNTUzZjdjOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyLmphdmEKQEAgLTEyMyw3ICsxMjMsNyBAQCBwdWJsaWMgc3RhdGljIFBhY2tJbmRleFdyaXRlciBjcmVhdGVPbGRlc3RQb3NzaWJsZShmaW5hbCBPdXRwdXRTdHJlYW0gZHN0LAogCSAqLwogCXB1YmxpYyBzdGF0aWMgaW50IG9sZGVzdFBvc3NpYmxlRm9ybWF0KAogCQkJZmluYWwgTGlzdDw/IGV4dGVuZHMgUGFja2VkT2JqZWN0SW5mbz4gb2JqcykgewotCQlmb3IgKGZpbmFsIFBhY2tlZE9iamVjdEluZm8gb2UgOiBvYmpzKSB7CisJCWZvciAoUGFja2VkT2JqZWN0SW5mbyBvZSA6IG9ianMpIHsKIAkJCWlmICghUGFja0luZGV4V3JpdGVyVjEuY2FuU3RvcmUob2UpKQogCQkJCXJldHVybiAyOwogCQl9CkBAIC0xODAsNyArMTgwLDcgQEAgcHVibGljIHN0YXRpYyBQYWNrSW5kZXhXcml0ZXIgY3JlYXRlVmVyc2lvbihmaW5hbCBPdXRwdXRTdHJlYW0gZHN0LAogCSAqICAgICAgICAgICAgdGhlIHN0cmVhbSB0aGlzIGluc3RhbmNlIG91dHB1dHMgdG8uIElmIG5vdCBhbHJlYWR5IGJ1ZmZlcmVkCiAJICogICAgICAgICAgICBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgd3JhcHBlZCBpbiBhIGJ1ZmZlcmVkIHN0cmVhbS4KIAkgKi8KLQlwcm90ZWN0ZWQgUGFja0luZGV4V3JpdGVyKGZpbmFsIE91dHB1dFN0cmVhbSBkc3QpIHsKKwlwcm90ZWN0ZWQgUGFja0luZGV4V3JpdGVyKE91dHB1dFN0cmVhbSBkc3QpIHsKIAkJb3V0ID0gbmV3IERpZ2VzdE91dHB1dFN0cmVhbShkc3QgaW5zdGFuY2VvZiBCdWZmZXJlZE91dHB1dFN0cmVhbSA/IGRzdAogCQkJCTogbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGRzdCksCiAJCQkJQ29uc3RhbnRzLm5ld01lc3NhZ2VEaWdlc3QoKSk7CkBAIC0yNTAsNyArMjUwLDcgQEAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgTGlzdDw/IGV4dGVuZHMgUGFja2VkT2JqZWN0SW5mbz4gdG9TdG9yZSwKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHdyaXRlVE9DKGZpbmFsIGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHdyaXRlVE9DKGludCB2ZXJzaW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvdXQud3JpdGUoVE9DKTsKIAkJTkIuZW5jb2RlSW50MzIodG1wLCAwLCB2ZXJzaW9uKTsKIAkJb3V0LndyaXRlKHRtcCwgMCwgNCk7CkBAIC0yNjksMTEgKzI2OSwxMSBAQCBwcm90ZWN0ZWQgdm9pZCB3cml0ZVRPQyhmaW5hbCBpbnQgdmVyc2lvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCB3cml0ZUZhbk91dFRhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50W10gZmFub3V0ID0gbmV3IGludFsyNTZdOwotCQlmb3IgKGZpbmFsIFBhY2tlZE9iamVjdEluZm8gcG8gOiBlbnRyaWVzKQorCQlmb3IgKFBhY2tlZE9iamVjdEluZm8gcG8gOiBlbnRyaWVzKQogCQkJZmFub3V0W3BvLmdldEZpcnN0Qnl0ZSgpICYgMHhmZl0rKzsKIAkJZm9yIChpbnQgaSA9IDE7IGkgPCAyNTY7IGkrKykKIAkJCWZhbm91dFtpXSArPSBmYW5vdXRbaSAtIDFdOwotCQlmb3IgKGZpbmFsIGludCBuIDogZmFub3V0KSB7CisJCWZvciAoaW50IG4gOiBmYW5vdXQpIHsKIAkJCU5CLmVuY29kZUludDMyKHRtcCwgMCwgbik7CiAJCQlvdXQud3JpdGUodG1wLCAwLCA0KTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyVjEuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlclYxLmphdmEKaW5kZXggZjIyMGU3YS4uODc3ZjdjOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyVjEuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhXcml0ZXJWMS5qYXZhCkBAIC01OCw3ICs1OCw3IEBACiAgKiBAc2VlIFBhY2tJbmRleFYxCiAgKi8KIGNsYXNzIFBhY2tJbmRleFdyaXRlclYxIGV4dGVuZHMgUGFja0luZGV4V3JpdGVyIHsKLQlzdGF0aWMgYm9vbGVhbiBjYW5TdG9yZShmaW5hbCBQYWNrZWRPYmplY3RJbmZvIG9lKSB7CisJc3RhdGljIGJvb2xlYW4gY2FuU3RvcmUoUGFja2VkT2JqZWN0SW5mbyBvZSkgewogCQkvLyBXZSBhcmUgbGltaXRlZCB0byA0IEdCIHBlciBwYWNrIGFzIG9mZnNldCBpcyAzMiBiaXQgdW5zaWduZWQgaW50LgogCQkvLwogCQlyZXR1cm4gb2UuZ2V0T2Zmc2V0KCkgPj4+IDEgPCBJbnRlZ2VyLk1BWF9WQUxVRTsKQEAgLTczLDcgKzczLDcgQEAgc3RhdGljIGJvb2xlYW4gY2FuU3RvcmUoZmluYWwgUGFja2VkT2JqZWN0SW5mbyBvZSkgewogCXByb3RlY3RlZCB2b2lkIHdyaXRlSW1wbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdyaXRlRmFuT3V0VGFibGUoKTsKIAotCQlmb3IgKGZpbmFsIFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKSB7CisJCWZvciAoUGFja2VkT2JqZWN0SW5mbyBvZSA6IGVudHJpZXMpIHsKIAkJCWlmICghY2FuU3RvcmUob2UpKQogCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5wYWNrVG9vTGFyZ2VGb3JJbmRleFZlcnNpb24xKTsKIAkJCU5CLmVuY29kZUludDMyKHRtcCwgMCwgKGludCkgb2UuZ2V0T2Zmc2V0KCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyVjIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbmRleFdyaXRlclYyLmphdmEKaW5kZXggYTE4Y2NhZi4uOTUwNWQzNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luZGV4V3JpdGVyVjIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrSW5kZXhXcml0ZXJWMi5qYXZhCkBAIC03NiwxMiArNzYsMTIgQEAgcHJvdGVjdGVkIHZvaWQgd3JpdGVJbXBsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAl9CiAKIAlwcml2YXRlIHZvaWQgd3JpdGVPYmplY3ROYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoZmluYWwgUGFja2VkT2JqZWN0SW5mbyBvZSA6IGVudHJpZXMpCisJCWZvciAoUGFja2VkT2JqZWN0SW5mbyBvZSA6IGVudHJpZXMpCiAJCQlvZS5jb3B5UmF3VG8ob3V0KTsKIAl9CiAKIAlwcml2YXRlIHZvaWQgd3JpdGVDUkNzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChmaW5hbCBQYWNrZWRPYmplY3RJbmZvIG9lIDogZW50cmllcykgeworCQlmb3IgKFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKSB7CiAJCQlOQi5lbmNvZGVJbnQzMih0bXAsIDAsIG9lLmdldENSQygpKTsKIAkJCW91dC53cml0ZSh0bXAsIDAsIDQpOwogCQl9CkBAIC04OSw3ICs4OSw3IEBAIHByaXZhdGUgdm9pZCB3cml0ZUNSQ3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlT2Zmc2V0MzIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpbnQgbzY0ID0gMDsKLQkJZm9yIChmaW5hbCBQYWNrZWRPYmplY3RJbmZvIG9lIDogZW50cmllcykgeworCQlmb3IgKFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKSB7CiAJCQlmaW5hbCBsb25nIG8gPSBvZS5nZXRPZmZzZXQoKTsKIAkJCWlmIChvIDw9IE1BWF9PRkZTRVRfMzIpCiAJCQkJTkIuZW5jb2RlSW50MzIodG1wLCAwLCAoaW50KSBvKTsKQEAgLTEwMCw3ICsxMDAsNyBAQCBwcml2YXRlIHZvaWQgd3JpdGVPZmZzZXQzMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJfQogCiAJcHJpdmF0ZSB2b2lkIHdyaXRlT2Zmc2V0NjQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmb3IgKGZpbmFsIFBhY2tlZE9iamVjdEluZm8gb2UgOiBlbnRyaWVzKSB7CisJCWZvciAoUGFja2VkT2JqZWN0SW5mbyBvZSA6IGVudHJpZXMpIHsKIAkJCWZpbmFsIGxvbmcgbyA9IG9lLmdldE9mZnNldCgpOwogCQkJaWYgKE1BWF9PRkZTRVRfMzIgPCBvKSB7CiAJCQkJTkIuZW5jb2RlSW50NjQodG1wLCAwLCBvKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tJbnNlcnRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luc2VydGVyLmphdmEKaW5kZXggN2ZmMjY5Ni4uMGNlM2NjOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luc2VydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0luc2VydGVyLmphdmEKQEAgLTQzOCw3ICs0MzgsNyBAQCBwcml2YXRlIGludCBlbmNvZGVUeXBlU2l6ZShpbnQgdHlwZSwgbG9uZyByYXdMZW5ndGgpIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQloZHJCdWZbMF0gPSAoYnl0ZSkgYjsKIAkJCXdyaXRlKGhkckJ1ZiwgMCwgMSk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tMb2NrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrTG9jay5qYXZhCmluZGV4IDgyZjBkYTEuLjBmYjg5MTEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tMb2NrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja0xvY2suamF2YQpAQCAtNjUsNyArNjUsNyBAQCBwdWJsaWMgY2xhc3MgUGFja0xvY2sgewogCSAqIEBwYXJhbSBmcwogCSAqICAgICAgICAgICAgdGhlIGZpbGVzeXN0ZW0gYWJzdHJhY3Rpb24gdXNlZCBieSB0aGUgcmVwb3NpdG9yeS4KIAkgKi8KLQlwdWJsaWMgUGFja0xvY2soZmluYWwgRmlsZSBwYWNrRmlsZSwgZmluYWwgRlMgZnMpIHsKKwlwdWJsaWMgUGFja0xvY2soRmlsZSBwYWNrRmlsZSwgRlMgZnMpIHsKIAkJZmluYWwgRmlsZSBwID0gcGFja0ZpbGUuZ2V0UGFyZW50RmlsZSgpOwogCQlmaW5hbCBTdHJpbmcgbiA9IHBhY2tGaWxlLmdldE5hbWUoKTsKIAkJa2VlcEZpbGUgPSBuZXcgRmlsZShwLCBuLnN1YnN0cmluZygwLCBuLmxlbmd0aCgpIC0gNSkgKyAiLmtlZXAiKTsgLy8kTk9OLU5MUy0xJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1JldmVyc2VJbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUGFja1JldmVyc2VJbmRleC5qYXZhCmluZGV4IDk0NGFmMjYuLmRmZTIzYmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1BhY2tSZXZlcnNlSW5kZXguamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9QYWNrUmV2ZXJzZUluZGV4LmphdmEKQEAgLTg4LDcgKzg4LDcgQEAgcHVibGljIGNsYXNzIFBhY2tSZXZlcnNlSW5kZXggewogCSAqIEBwYXJhbSBwYWNrSW5kZXgKIAkgKiAgICAgICAgICAgIGZvcndhcmQgaW5kZXggLSBlbnRyaWVzIHRvIChyZXZlcnNlKSBpbmRleC4KIAkgKi8KLQlwdWJsaWMgUGFja1JldmVyc2VJbmRleChmaW5hbCBQYWNrSW5kZXggcGFja0luZGV4KSB7CisJcHVibGljIFBhY2tSZXZlcnNlSW5kZXgoUGFja0luZGV4IHBhY2tJbmRleCkgewogCQlpbmRleCA9IHBhY2tJbmRleDsKIAogCQlmaW5hbCBsb25nIGNudCA9IGluZGV4LmdldE9iamVjdENvdW50KCk7CkBAIC0xMDcsNyArMTA3LDcgQEAgcHVibGljIFBhY2tSZXZlcnNlSW5kZXgoZmluYWwgUGFja0luZGV4IHBhY2tJbmRleCkgewogCiAJCWxvbmcgbWF4T2Zmc2V0ID0gMDsKIAkJaW50IGl0aCA9IDA7Ci0JCWZvciAoZmluYWwgTXV0YWJsZUVudHJ5IG1lIDogaW5kZXgpIHsKKwkJZm9yIChNdXRhYmxlRW50cnkgbWUgOiBpbmRleCkgewogCQkJZmluYWwgbG9uZyBvID0gbWUuZ2V0T2Zmc2V0KCk7CiAJCQlvZmZzZXRzQnlTaGExW2l0aCsrXSA9IG87CiAJCQlpZiAobyA+IG1heE9mZnNldCkKQEAgLTE1NSw3ICsxNTUsNyBAQCBwdWJsaWMgUGFja1JldmVyc2VJbmRleChmaW5hbCBQYWNrSW5kZXggcGFja0luZGV4KSB7CiAJICogICAgICAgICAgICBzdGFydCBvZmZzZXQgb2Ygb2JqZWN0IHRvIGZpbmQuCiAJICogQHJldHVybiBvYmplY3QgaWQgZm9yIHRoaXMgb2Zmc2V0LCBvciBudWxsIGlmIG5vIG9iamVjdCB3YXMgZm91bmQuCiAJICovCi0JcHVibGljIE9iamVjdElkIGZpbmRPYmplY3QoZmluYWwgbG9uZyBvZmZzZXQpIHsKKwlwdWJsaWMgT2JqZWN0SWQgZmluZE9iamVjdChsb25nIG9mZnNldCkgewogCQlmaW5hbCBpbnQgaXRoID0gYmluYXJ5U2VhcmNoKG9mZnNldCk7CiAJCWlmIChpdGggPCAwKQogCQkJcmV0dXJuIG51bGw7CkBAIC0xNzcsNyArMTc3LDcgQEAgcHVibGljIE9iamVjdElkIGZpbmRPYmplY3QoZmluYWwgbG9uZyBvZmZzZXQpIHsKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvcnJ1cHRPYmplY3RFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB3aGVuIHRoZXJlIGlzIG5vIG9iamVjdCB3aXRoIHRoZSBwcm92aWRlZCBvZmZzZXQuCiAJICovCi0JcHVibGljIGxvbmcgZmluZE5leHRPZmZzZXQoZmluYWwgbG9uZyBvZmZzZXQsIGZpbmFsIGxvbmcgbWF4T2Zmc2V0KQorCXB1YmxpYyBsb25nIGZpbmROZXh0T2Zmc2V0KGxvbmcgb2Zmc2V0LCBsb25nIG1heE9mZnNldCkKIAkJCXRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IGl0aCA9IGJpbmFyeVNlYXJjaChvZmZzZXQpOwogCQlpZiAoaXRoIDwgMCkKQEAgLTE5NSw3ICsxOTUsNyBAQCBpbnQgZmluZFBvc3Rpb24obG9uZyBvZmZzZXQpIHsKIAkJcmV0dXJuIGJpbmFyeVNlYXJjaChvZmZzZXQpOwogCX0KIAotCXByaXZhdGUgaW50IGJpbmFyeVNlYXJjaChmaW5hbCBsb25nIG9mZnNldCkgeworCXByaXZhdGUgaW50IGJpbmFyeVNlYXJjaChsb25nIG9mZnNldCkgewogCQlpbnQgYnVja2V0ID0gKGludCkgKG9mZnNldCAvIGJ1Y2tldFNpemUpOwogCQlpbnQgbG93ID0gYnVja2V0ID09IDAgPyAwIDogb2Zmc2V0SW5kZXhbYnVja2V0IC0gMV07CiAJCWludCBoaWdoID0gb2Zmc2V0SW5kZXhbYnVja2V0XTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5LmphdmEKaW5kZXggMTA2Yzg0Yi4uNmExOGRmOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmRGlyZWN0b3J5LmphdmEKQEAgLTIwOSw3ICsyMDksNyBAQCBwdWJsaWMgY2xhc3MgUmVmRGlyZWN0b3J5IGV4dGVuZHMgUmVmRGF0YWJhc2UgewogCiAJcHJpdmF0ZSBMaXN0PEludGVnZXI+IHJldHJ5U2xlZXBNcyA9IFJFVFJZX1NMRUVQX01TOwogCi0JUmVmRGlyZWN0b3J5KGZpbmFsIEZpbGVSZXBvc2l0b3J5IGRiKSB7CisJUmVmRGlyZWN0b3J5KEZpbGVSZXBvc2l0b3J5IGRiKSB7CiAJCWZpbmFsIEZTIGZzID0gZGIuZ2V0RlMoKTsKIAkJcGFyZW50ID0gZGI7CiAJCWdpdERpciA9IGRiLmdldERpcmVjdG9yeSgpOwpAQCAtMzQ2LDcgKzM0Niw3IEBAIHB1YmxpYyBSZWYgZXhhY3RSZWYoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBSZWYgZ2V0UmVmKGZpbmFsIFN0cmluZyBuZWVkbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIFJlZiBnZXRSZWYoU3RyaW5nIG5lZWRsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgUmVmTGlzdDxSZWY+IHBhY2tlZCA9IGdldFBhY2tlZFJlZnMoKTsKIAkJUmVmIHJlZiA9IG51bGw7CiAJCWZvciAoU3RyaW5nIHByZWZpeCA6IFNFQVJDSF9QQVRIKSB7CkBAIC00MzUsNyArNDM1LDcgQEAgcHJpdmF0ZSBjbGFzcyBMb29zZVNjYW5uZXIgewogCiAJCVJlZkxpc3QuQnVpbGRlcjxMb29zZVJlZj4gbmV3TG9vc2U7CiAKLQkJTG9vc2VTY2FubmVyKGZpbmFsIFJlZkxpc3Q8TG9vc2VSZWY+IGN1ckxvb3NlKSB7CisJCUxvb3NlU2Nhbm5lcihSZWZMaXN0PExvb3NlUmVmPiBjdXJMb29zZSkgewogCQkJdGhpcy5jdXJMb29zZSA9IGN1ckxvb3NlOwogCQl9CiAKQEAgLTU0Niw3ICs1NDYsNyBAQCBwcml2YXRlIHZvaWQgc2Nhbk9uZShTdHJpbmcgbmFtZSkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVmIHBlZWwoZmluYWwgUmVmIHJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgUmVmIHBlZWwoUmVmIHJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgUmVmIGxlYWYgPSByZWYuZ2V0TGVhZigpOwogCQlpZiAobGVhZi5pc1BlZWxlZCgpIHx8IGxlYWYuZ2V0T2JqZWN0SWQoKSA9PSBudWxsKQogCQkJcmV0dXJuIHJlZjsKQEAgLTU2OCw3ICs1NjgsNyBAQCBwdWJsaWMgUmVmIHBlZWwoZmluYWwgUmVmIHJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHJlY3JlYXRlKHJlZiwgbmV3TGVhZik7CiAJfQogCi0JcHJpdmF0ZSBPYmplY3RJZFJlZiBkb1BlZWwoZmluYWwgUmVmIGxlYWYpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXByaXZhdGUgT2JqZWN0SWRSZWYgZG9QZWVsKFJlZiBsZWFmKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJdHJ5IChSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsoZ2V0UmVwb3NpdG9yeSgpKSkgewogCQkJUmV2T2JqZWN0IG9iaiA9IHJ3LnBhcnNlQW55KGxlYWYuZ2V0T2JqZWN0SWQoKSk7CkBAIC01ODIsNyArNTgyLDcgQEAgcHJpdmF0ZSBPYmplY3RJZFJlZiBkb1BlZWwoZmluYWwgUmVmIGxlYWYpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgUmVmIHJlY3JlYXRlKGZpbmFsIFJlZiBvbGQsIGZpbmFsIE9iamVjdElkUmVmIGxlYWYpIHsKKwlwcml2YXRlIHN0YXRpYyBSZWYgcmVjcmVhdGUoUmVmIG9sZCwgT2JqZWN0SWRSZWYgbGVhZikgewogCQlpZiAob2xkLmlzU3ltYm9saWMoKSkgewogCQkJUmVmIGRzdCA9IHJlY3JlYXRlKG9sZC5nZXRUYXJnZXQoKSwgbGVhZik7CiAJCQlyZXR1cm4gbmV3IFN5bWJvbGljUmVmKG9sZC5nZXROYW1lKCksIGRzdCk7CkBAIC05NzIsNyArOTcyLDcgQEAgcHJpdmF0ZSBQYWNrZWRSZWZMaXN0IHJlYWRQYWNrZWRSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgUmVmTGlzdDxSZWY+IHBhcnNlUGFja2VkUmVmcyhmaW5hbCBCdWZmZXJlZFJlYWRlciBicikKKwlwcml2YXRlIFJlZkxpc3Q8UmVmPiBwYXJzZVBhY2tlZFJlZnMoQnVmZmVyZWRSZWFkZXIgYnIpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlSZWZMaXN0LkJ1aWxkZXI8UmVmPiBhbGwgPSBuZXcgUmVmTGlzdC5CdWlsZGVyPD4oKTsKIAkJUmVmIGxhc3QgPSBudWxsOwpAQCAtMTAyNCw3ICsxMDI0LDcgQEAgcHJpdmF0ZSBSZWZMaXN0PFJlZj4gcGFyc2VQYWNrZWRSZWZzKGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJyKQogCQlyZXR1cm4gYWxsLnRvUmVmTGlzdCgpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb3B5KGZpbmFsIFN0cmluZyBzcmMsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBlbmQpIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29weShTdHJpbmcgc3JjLCBpbnQgb2ZmLCBpbnQgZW5kKSB7CiAJCS8vIERvbid0IHVzZSBzdWJzdHJpbmcgc2luY2UgaXQgY291bGQgbGVhdmUgYSByZWZlcmVuY2UgdG8gdGhlIG11Y2gKIAkJLy8gbGFyZ2VyIGV4aXN0aW5nIHN0cmluZy4gRm9yY2UgY29uc3RydWN0aW9uIG9mIGEgZnVsbCBuZXcgb2JqZWN0LgogCQlyZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoZW5kIC0gb2ZmKS5hcHBlbmQoc3JjLCBvZmYsIGVuZCkudG9TdHJpbmcoKTsKQEAgLTExOTAsNyArMTE5MCw3IEBAIExvb3NlUmVmIHNjYW5SZWYoTG9vc2VSZWYgcmVmLCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG5ldyBMb29zZVVucGVlbGVkKG90aGVyU25hcHNob3QsIG5hbWUsIGlkKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3ltUmVmKGZpbmFsIGJ5dGVbXSBidWYsIGludCBuKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N5bVJlZihieXRlW10gYnVmLCBpbnQgbikgewogCQlpZiAobiA8IDYpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXJldHVybiAvKiovYnVmWzBdID09ICdyJyAvLwpAQCAtMTI2MywxOCArMTI2MywxOCBAQCBGaWxlIGZpbGVGb3IoU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIG5ldyBGaWxlKGdpdERpciwgbmFtZSk7CiAJfQogCi0Jc3RhdGljIGludCBsZXZlbHNJbihmaW5hbCBTdHJpbmcgbmFtZSkgeworCXN0YXRpYyBpbnQgbGV2ZWxzSW4oU3RyaW5nIG5hbWUpIHsKIAkJaW50IGNvdW50ID0gMDsKIAkJZm9yIChpbnQgcCA9IG5hbWUuaW5kZXhPZignLycpOyBwID49IDA7IHAgPSBuYW1lLmluZGV4T2YoJy8nLCBwICsgMSkpCiAJCQljb3VudCsrOwogCQlyZXR1cm4gY291bnQ7CiAJfQogCi0Jc3RhdGljIHZvaWQgZGVsZXRlKGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgaW50IGRlcHRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIGZpbGUsIGludCBkZXB0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZGVsZXRlKGZpbGUsIGRlcHRoLCBudWxsKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGRlbGV0ZShmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIGludCBkZXB0aCwgTG9ja0ZpbGUgckxjaykKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIGZpbGUsIGludCBkZXB0aCwgTG9ja0ZpbGUgckxjaykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICghZmlsZS5kZWxldGUoKSAmJiBmaWxlLmlzRmlsZSgpKSB7CiAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlSZW5hbWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVJlbmFtZS5qYXZhCmluZGV4IDIwMmU1MWYuLmVjN2VjNzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVJlbmFtZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVJlbmFtZS5qYXZhCkBAIC0xMDQsNyArMTA0LDcgQEAgcHJvdGVjdGVkIFJlc3VsdCBkb1JlbmFtZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW9iaklkID0gc291cmNlLmdldE9sZE9iamVjdElkKCk7CiAJCXVwZGF0ZUhFQUQgPSBuZWVkVG9VcGRhdGVIRUFEKCk7CiAJCXRtcCA9IHJlZmRiLm5ld1RlbXBvcmFyeVVwZGF0ZSgpOwotCQl0cnkgKGZpbmFsIFJldldhbGsgcncgPSBuZXcgUmV2V2FsayhyZWZkYi5nZXRSZXBvc2l0b3J5KCkpKSB7CisJCXRyeSAoUmV2V2FsayBydyA9IG5ldyBSZXZXYWxrKHJlZmRiLmdldFJlcG9zaXRvcnkoKSkpIHsKIAkJCS8vIEZpcnN0IGJhY2t1cCB0aGUgc291cmNlIHNvIGl0cyBuZXZlciB1bnJlYWNoYWJsZS4KIAkJCXRtcC5zZXROZXdPYmplY3RJZChvYmpJZCk7CiAJCQl0bXAuc2V0Rm9yY2VVcGRhdGUodHJ1ZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZEaXJlY3RvcnlVcGRhdGUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVVwZGF0ZS5qYXZhCmluZGV4IDRkNmIyNDUuLjQ1Y2U2MzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVVwZGF0ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1JlZkRpcmVjdG9yeVVwZGF0ZS5qYXZhCkBAIC02MCw3ICs2MCw3IEBAIGNsYXNzIFJlZkRpcmVjdG9yeVVwZGF0ZSBleHRlbmRzIFJlZlVwZGF0ZSB7CiAJcHJpdmF0ZSBib29sZWFuIHNob3VsZERlcmVmOwogCXByaXZhdGUgTG9ja0ZpbGUgbG9jazsKIAotCVJlZkRpcmVjdG9yeVVwZGF0ZShmaW5hbCBSZWZEaXJlY3RvcnkgciwgZmluYWwgUmVmIHJlZikgeworCVJlZkRpcmVjdG9yeVVwZGF0ZShSZWZEaXJlY3RvcnkgciwgUmVmIHJlZikgewogCQlzdXBlcihyZWYpOwogCQlkYXRhYmFzZSA9IHI7CiAJfQpAQCAtMTA2LDcgKzEwNiw3IEBAIHByb3RlY3RlZCB2b2lkIHVubG9jaygpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlc3VsdCBkb1VwZGF0ZShmaW5hbCBSZXN1bHQgc3RhdHVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByb3RlY3RlZCBSZXN1bHQgZG9VcGRhdGUoUmVzdWx0IHN0YXR1cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJV3JpdGVDb25maWcgd2MgPSBkYXRhYmFzZS5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCkKIAkJCQkuZ2V0KFdyaXRlQ29uZmlnLktFWSk7CiAKQEAgLTE0OCw3ICsxNDgsNyBAQCBwcml2YXRlIFN0cmluZyB0b1Jlc3VsdFN0cmluZyhSZXN1bHQgc3RhdHVzKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCBSZXN1bHQgZG9EZWxldGUoZmluYWwgUmVzdWx0IHN0YXR1cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgUmVzdWx0IGRvRGVsZXRlKFJlc3VsdCBzdGF0dXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChnZXRSZWYoKS5nZXRTdG9yYWdlKCkgIT0gUmVmLlN0b3JhZ2UuTkVXKQogCQkJZGF0YWJhc2UuZGVsZXRlKHRoaXMpOwogCQlyZXR1cm4gc3RhdHVzOwpAQCAtMTU2LDcgKzE1Niw3IEBAIHByb3RlY3RlZCBSZXN1bHQgZG9EZWxldGUoZmluYWwgUmVzdWx0IHN0YXR1cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJlc3VsdCBkb0xpbmsoZmluYWwgU3RyaW5nIHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgUmVzdWx0IGRvTGluayhTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlXcml0ZUNvbmZpZyB3YyA9IGRhdGFiYXNlLmdldFJlcG9zaXRvcnkoKS5nZXRDb25maWcoKQogCQkJCS5nZXQoV3JpdGVDb25maWcuS0VZKTsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvUmVmbG9nV3JpdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZsb2dXcml0ZXIuamF2YQppbmRleCBmZDZiNDI3Li4xMzFmNzE2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZsb2dXcml0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9SZWZsb2dXcml0ZXIuamF2YQpAQCAtMjIwLDYgKzIyMCwyMiBAQCBwdWJsaWMgUmVmbG9nV3JpdGVyIGxvZyhSZWZVcGRhdGUgdXBkYXRlLCBTdHJpbmcgbXNnLAogCQlyZXR1cm4gQ29uc3RhbnRzLmVuY29kZShyLnRvU3RyaW5nKCkpOwogCX0KIAorCXByaXZhdGUgRmlsZU91dHB1dFN0cmVhbSBnZXRGaWxlT3V0cHV0U3RyZWFtKEZpbGUgbG9nKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgeworCQkJcmV0dXJuIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvZywgdHJ1ZSk7CisJCX0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlcnIpIHsKKwkJCUZpbGUgZGlyID0gbG9nLmdldFBhcmVudEZpbGUoKTsKKwkJCWlmIChkaXIuZXhpc3RzKCkpIHsKKwkJCQl0aHJvdyBlcnI7CisJCQl9CisJCQlpZiAoIWRpci5ta2RpcnMoKSAmJiAhZGlyLmlzRGlyZWN0b3J5KCkpIHsKKwkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5jYW5ub3RDcmVhdGVEaXJlY3RvcnksIGRpcikpOworCQkJfQorCQkJcmV0dXJuIG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvZywgdHJ1ZSk7CisJCX0KKwl9CisKIAlwcml2YXRlIFJlZmxvZ1dyaXRlciBsb2coU3RyaW5nIHJlZk5hbWUsIGJ5dGVbXSByZWMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgbG9nID0gcmVmZGIubG9nRm9yKHJlZk5hbWUpOwogCQlib29sZWFuIHdyaXRlID0gZm9yY2VXcml0ZQpAQCAtMjI5LDI5ICsyNDUsMTcgQEAgcHJpdmF0ZSBSZWZsb2dXcml0ZXIgbG9nKFN0cmluZyByZWZOYW1lLCBieXRlW10gcmVjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIHRoaXM7CiAKIAkJV3JpdGVDb25maWcgd2MgPSByZWZkYi5nZXRSZXBvc2l0b3J5KCkuZ2V0Q29uZmlnKCkuZ2V0KFdyaXRlQ29uZmlnLktFWSk7Ci0JCUZpbGVPdXRwdXRTdHJlYW0gb3V0OwotCQl0cnkgewotCQkJb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obG9nLCB0cnVlKTsKLQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGVycikgewotCQkJRmlsZSBkaXIgPSBsb2cuZ2V0UGFyZW50RmlsZSgpOwotCQkJaWYgKGRpci5leGlzdHMoKSkKLQkJCQl0aHJvdyBlcnI7Ci0JCQlpZiAoIWRpci5ta2RpcnMoKSAmJiAhZGlyLmlzRGlyZWN0b3J5KCkpCi0JCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAotCQkJCQkJSkdpdFRleHQuZ2V0KCkuY2Fubm90Q3JlYXRlRGlyZWN0b3J5LCBkaXIpKTsKLQkJCW91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGxvZywgdHJ1ZSk7Ci0JCX0KLQkJdHJ5IHsKKwkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIG91dCA9IGdldEZpbGVPdXRwdXRTdHJlYW0obG9nKSkgewogCQkJaWYgKHdjLmdldEZTeW5jUmVmRmlsZXMoKSkgewogCQkJCUZpbGVDaGFubmVsIGZjID0gb3V0LmdldENoYW5uZWwoKTsKIAkJCQlCeXRlQnVmZmVyIGJ1ZiA9IEJ5dGVCdWZmZXIud3JhcChyZWMpOwotCQkJCXdoaWxlICgwIDwgYnVmLnJlbWFpbmluZygpKQorCQkJCXdoaWxlICgwIDwgYnVmLnJlbWFpbmluZygpKSB7CiAJCQkJCWZjLndyaXRlKGJ1Zik7CisJCQkJfQogCQkJCWZjLmZvcmNlKHRydWUpOwotCQkJfSBlbHNlCisJCQl9IGVsc2UgewogCQkJCW91dC53cml0ZShyZWMpOwotCQl9IGZpbmFsbHkgewotCQkJb3V0LmNsb3NlKCk7CisJCQl9CiAJCX0KIAkJcmV0dXJuIHRoaXM7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVW5wYWNrZWRPYmplY3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1VucGFja2VkT2JqZWN0LmphdmEKaW5kZXggYWRiMDVlNC4uY2Y0NzRhZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvVW5wYWNrZWRPYmplY3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9VbnBhY2tlZE9iamVjdC5qYXZhCkBAIC0yNjYsNyArMjY2LDcgQEAgc3RhdGljIHZvaWQgY2hlY2tWYWxpZEVuZE9mU3RyZWFtKElucHV0U3RyZWFtIGluLCBJbmZsYXRlciBpbmYsCiAJCX0KIAl9CiAKLQlzdGF0aWMgYm9vbGVhbiBpc1N0YW5kYXJkRm9ybWF0KGZpbmFsIGJ5dGVbXSBoZHIpIHsKKwlzdGF0aWMgYm9vbGVhbiBpc1N0YW5kYXJkRm9ybWF0KGJ5dGVbXSBoZHIpIHsKIAkJLyoKIAkJICogV2UgbXVzdCBkZXRlcm1pbmUgaWYgdGhlIGJ1ZmZlciBjb250YWlucyB0aGUgc3RhbmRhcmQKIAkJICogemxpYi1kZWZsYXRlZCBzdHJlYW0gb3IgdGhlIGV4cGVyaW1lbnRhbCBmb3JtYXQgYmFzZWQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZS5qYXZhCmluZGV4IGU3MTI4NGYuLjhjZjFkNGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGUuamF2YQpAQCAtMTU3LDcgKzE1Nyw3IEBAIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBiaXRzKGludCBuZXdTaXplKSB7CiAJICogICAgICAgICAgICAgc2V0dGluZ3MsIHVzdWFsbHkgdG9vIGxvdyBvZiBhIGxpbWl0LgogCSAqLwogCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlY29uZmlndXJlKGZpbmFsIFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgeworCXB1YmxpYyBzdGF0aWMgdm9pZCByZWNvbmZpZ3VyZShXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKIAkJZmluYWwgV2luZG93Q2FjaGUgbmMgPSBuZXcgV2luZG93Q2FjaGUoY2ZnKTsKIAkJZmluYWwgV2luZG93Q2FjaGUgb2MgPSBjYWNoZTsKIAkJaWYgKG9jICE9IG51bGwpCkBAIC0xNzgsNyArMTc4LDcgQEAgcHVibGljIHN0YXRpYyBXaW5kb3dDYWNoZSBnZXRJbnN0YW5jZSgpIHsKIAkJcmV0dXJuIGNhY2hlOwogCX0KIAotCXN0YXRpYyBmaW5hbCBCeXRlV2luZG93IGdldChmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIG9mZnNldCkKKwlzdGF0aWMgZmluYWwgQnl0ZVdpbmRvdyBnZXQoUGFja0ZpbGUgcGFjaywgbG9uZyBvZmZzZXQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBXaW5kb3dDYWNoZSBjID0gY2FjaGU7CiAJCWZpbmFsIEJ5dGVXaW5kb3cgciA9IGMuZ2V0T3JMb2FkKHBhY2ssIGMudG9TdGFydChvZmZzZXQpKTsKQEAgLTE5Myw3ICsxOTMsNyBAQCBzdGF0aWMgZmluYWwgQnl0ZVdpbmRvdyBnZXQoZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBvZmZzZXQpCiAJCXJldHVybiByOwogCX0KIAotCXN0YXRpYyBmaW5hbCB2b2lkIHB1cmdlKGZpbmFsIFBhY2tGaWxlIHBhY2spIHsKKwlzdGF0aWMgZmluYWwgdm9pZCBwdXJnZShQYWNrRmlsZSBwYWNrKSB7CiAJCWNhY2hlLnJlbW92ZUFsbChwYWNrKTsKIAl9CiAKQEAgLTIzMiw3ICsyMzIsNyBAQCBzdGF0aWMgZmluYWwgdm9pZCBwdXJnZShmaW5hbCBQYWNrRmlsZSBwYWNrKSB7CiAKIAlwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgb3BlbkJ5dGVzOwogCi0JcHJpdmF0ZSBXaW5kb3dDYWNoZShmaW5hbCBXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKKwlwcml2YXRlIFdpbmRvd0NhY2hlKFdpbmRvd0NhY2hlQ29uZmlnIGNmZykgewogCQl0YWJsZVNpemUgPSB0YWJsZVNpemUoY2ZnKTsKIAkJZmluYWwgaW50IGxvY2tDb3VudCA9IGxvY2tDb3VudChjZmcpOwogCQlpZiAodGFibGVTaXplIDwgMSkKQEAgLTI4NiwxMSArMjg2LDExIEBAIHB1YmxpYyBsb25nIGdldE9wZW5CeXRlcygpIHsKIAkJcmV0dXJuIG9wZW5CeXRlcy5nZXQoKTsKIAl9CiAKLQlwcml2YXRlIGludCBoYXNoKGZpbmFsIGludCBwYWNrSGFzaCwgZmluYWwgbG9uZyBvZmYpIHsKKwlwcml2YXRlIGludCBoYXNoKGludCBwYWNrSGFzaCwgbG9uZyBvZmYpIHsKIAkJcmV0dXJuIHBhY2tIYXNoICsgKGludCkgKG9mZiA+Pj4gd2luZG93U2l6ZVNoaWZ0KTsKIAl9CiAKLQlwcml2YXRlIEJ5dGVXaW5kb3cgbG9hZChmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIG9mZnNldCkKKwlwcml2YXRlIEJ5dGVXaW5kb3cgbG9hZChQYWNrRmlsZSBwYWNrLCBsb25nIG9mZnNldCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChwYWNrLmJlZ2luV2luZG93Q2FjaGUoKSkKIAkJCW9wZW5GaWxlcy5pbmNyZW1lbnRBbmRHZXQoKTsKQEAgLTMxMCwxOCArMzEwLDE4IEBAIHByaXZhdGUgQnl0ZVdpbmRvdyBsb2FkKGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgb2Zmc2V0KQogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZWYgY3JlYXRlUmVmKGZpbmFsIFBhY2tGaWxlIHAsIGZpbmFsIGxvbmcgbywgZmluYWwgQnl0ZVdpbmRvdyB2KSB7CisJcHJpdmF0ZSBSZWYgY3JlYXRlUmVmKFBhY2tGaWxlIHAsIGxvbmcgbywgQnl0ZVdpbmRvdyB2KSB7CiAJCWZpbmFsIFJlZiByZWYgPSBuZXcgUmVmKHAsIG8sIHYsIHF1ZXVlKTsKIAkJb3BlbkJ5dGVzLmFkZEFuZEdldChyZWYuc2l6ZSk7CiAJCXJldHVybiByZWY7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNsZWFyKGZpbmFsIFJlZiByZWYpIHsKKwlwcml2YXRlIHZvaWQgY2xlYXIoUmVmIHJlZikgewogCQlvcGVuQnl0ZXMuYWRkQW5kR2V0KC1yZWYuc2l6ZSk7CiAJCWNsb3NlKHJlZi5wYWNrKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgY2xvc2UoZmluYWwgUGFja0ZpbGUgcGFjaykgeworCXByaXZhdGUgdm9pZCBjbG9zZShQYWNrRmlsZSBwYWNrKSB7CiAJCWlmIChwYWNrLmVuZFdpbmRvd0NhY2hlKCkpCiAJCQlvcGVuRmlsZXMuZGVjcmVtZW50QW5kR2V0KCk7CiAJfQpAQCAtMzMwLDExICszMzAsMTEgQEAgcHJpdmF0ZSBib29sZWFuIGlzRnVsbCgpIHsKIAkJcmV0dXJuIG1heEZpbGVzIDwgb3BlbkZpbGVzLmdldCgpIHx8IG1heEJ5dGVzIDwgb3BlbkJ5dGVzLmdldCgpOwogCX0KIAotCXByaXZhdGUgbG9uZyB0b1N0YXJ0KGZpbmFsIGxvbmcgb2Zmc2V0KSB7CisJcHJpdmF0ZSBsb25nIHRvU3RhcnQobG9uZyBvZmZzZXQpIHsKIAkJcmV0dXJuIChvZmZzZXQgPj4+IHdpbmRvd1NpemVTaGlmdCkgPDwgd2luZG93U2l6ZVNoaWZ0OwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCB0YWJsZVNpemUoZmluYWwgV2luZG93Q2FjaGVDb25maWcgY2ZnKSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IHRhYmxlU2l6ZShXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKIAkJZmluYWwgaW50IHdzeiA9IGNmZy5nZXRQYWNrZWRHaXRXaW5kb3dTaXplKCk7CiAJCWZpbmFsIGxvbmcgbGltaXQgPSBjZmcuZ2V0UGFja2VkR2l0TGltaXQoKTsKIAkJaWYgKHdzeiA8PSAwKQpAQCAtMzQ0LDcgKzM0NCw3IEBAIHByaXZhdGUgc3RhdGljIGludCB0YWJsZVNpemUoZmluYWwgV2luZG93Q2FjaGVDb25maWcgY2ZnKSB7CiAJCXJldHVybiAoaW50KSBNYXRoLm1pbig1ICogKGxpbWl0IC8gd3N6KSAvIDIsIDIwMDAwMDAwMDApOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGludCBsb2NrQ291bnQoZmluYWwgV2luZG93Q2FjaGVDb25maWcgY2ZnKSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IGxvY2tDb3VudChXaW5kb3dDYWNoZUNvbmZpZyBjZmcpIHsKIAkJcmV0dXJuIE1hdGgubWF4KGNmZy5nZXRQYWNrZWRHaXRPcGVuRmlsZXMoKSwgMzIpOwogCX0KIApAQCAtMzYwLDcgKzM2MCw3IEBAIHByaXZhdGUgc3RhdGljIGludCBsb2NrQ291bnQoZmluYWwgV2luZG93Q2FjaGVDb25maWcgY2ZnKSB7CiAJICogICAgICAgICAgICAgdGhlIG9iamVjdCByZWZlcmVuY2Ugd2FzIG5vdCBpbiB0aGUgY2FjaGUgYW5kIGNvdWxkIG5vdCBiZQogCSAqICAgICAgICAgICAgIG9idGFpbmVkIGJ5IHtAbGluayAjbG9hZChQYWNrRmlsZSwgbG9uZyl9LgogCSAqLwotCXByaXZhdGUgQnl0ZVdpbmRvdyBnZXRPckxvYWQoZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBwb3NpdGlvbikKKwlwcml2YXRlIEJ5dGVXaW5kb3cgZ2V0T3JMb2FkKFBhY2tGaWxlIHBhY2ssIGxvbmcgcG9zaXRpb24pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBpbnQgc2xvdCA9IHNsb3QocGFjaywgcG9zaXRpb24pOwogCQlmaW5hbCBFbnRyeSBlMSA9IHRhYmxlLmdldChzbG90KTsKQEAgLTM5OSw3ICszOTksNyBAQCBwcml2YXRlIEJ5dGVXaW5kb3cgZ2V0T3JMb2FkKGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgcG9zaXRpb24pCiAJCXJldHVybiB2OwogCX0KIAotCXByaXZhdGUgQnl0ZVdpbmRvdyBzY2FuKEVudHJ5IG4sIGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgcG9zaXRpb24pIHsKKwlwcml2YXRlIEJ5dGVXaW5kb3cgc2NhbihFbnRyeSBuLCBQYWNrRmlsZSBwYWNrLCBsb25nIHBvc2l0aW9uKSB7CiAJCWZvciAoOyBuICE9IG51bGw7IG4gPSBuLm5leHQpIHsKIAkJCWZpbmFsIFJlZiByID0gbi5yZWY7CiAJCQlpZiAoci5wYWNrID09IHBhY2sgJiYgci5wb3NpdGlvbiA9PSBwb3NpdGlvbikgewpAQCAtNDE1LDcgKzQxNSw3IEBAIHByaXZhdGUgQnl0ZVdpbmRvdyBzY2FuKEVudHJ5IG4sIGZpbmFsIFBhY2tGaWxlIHBhY2ssIGZpbmFsIGxvbmcgcG9zaXRpb24pIHsKIAkJcmV0dXJuIG51bGw7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGhpdChmaW5hbCBSZWYgcikgeworCXByaXZhdGUgdm9pZCBoaXQoUmVmIHIpIHsKIAkJLy8gV2UgZG9uJ3QgbmVlZCB0byBiZSAxMDAlIGFjY3VyYXRlIGhlcmUuIEl0cyBzdWZmaWNpZW50IHRoYXQgYXQgbGVhc3QKIAkJLy8gb25lIHRocmVhZCBwZXJmb3JtcyB0aGUgaW5jcmVtZW50LiBBbnkgb3RoZXIgY29uY3VycmVudCBhY2Nlc3MgYXQKIAkJLy8gZXhhY3RseSB0aGUgc2FtZSB0aW1lIGNhbiBzaW1wbHkgdXNlIHRoZSBzYW1lIGNsb2NrIHZhbHVlLgpAQCAtNDg3LDcgKzQ4Nyw3IEBAIHByaXZhdGUgdm9pZCByZW1vdmVBbGwoKSB7CiAJICogQHBhcmFtIHBhY2sKIAkgKiAgICAgICAgICAgIHRoZSBmaWxlIHRvIHB1cmdlIGFsbCBlbnRyaWVzIG9mLgogCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBbGwoZmluYWwgUGFja0ZpbGUgcGFjaykgeworCXByaXZhdGUgdm9pZCByZW1vdmVBbGwoUGFja0ZpbGUgcGFjaykgewogCQlmb3IgKGludCBzID0gMDsgcyA8IHRhYmxlU2l6ZTsgcysrKSB7CiAJCQlmaW5hbCBFbnRyeSBlMSA9IHRhYmxlLmdldChzKTsKIAkJCWJvb2xlYW4gaGFzRGVhZCA9IGZhbHNlOwpAQCAtNTIxLDExICs1MjEsMTEgQEAgcHJpdmF0ZSB2b2lkIGdjKCkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSBpbnQgc2xvdChmaW5hbCBQYWNrRmlsZSBwYWNrLCBmaW5hbCBsb25nIHBvc2l0aW9uKSB7CisJcHJpdmF0ZSBpbnQgc2xvdChQYWNrRmlsZSBwYWNrLCBsb25nIHBvc2l0aW9uKSB7CiAJCXJldHVybiAoaGFzaChwYWNrLmhhc2gsIHBvc2l0aW9uKSA+Pj4gMSkgJSB0YWJsZVNpemU7CiAJfQogCi0JcHJpdmF0ZSBMb2NrIGxvY2soZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBwb3NpdGlvbikgeworCXByaXZhdGUgTG9jayBsb2NrKFBhY2tGaWxlIHBhY2ssIGxvbmcgcG9zaXRpb24pIHsKIAkJcmV0dXJuIGxvY2tzWyhoYXNoKHBhY2suaGFzaCwgcG9zaXRpb24pID4+PiAxKSAlIGxvY2tzLmxlbmd0aF07CiAJfQogCkBAIC01NTYsNyArNTU2LDcgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50cnkgewogCQkgKi8KIAkJdm9sYXRpbGUgYm9vbGVhbiBkZWFkOwogCi0JCUVudHJ5KGZpbmFsIEVudHJ5IG4sIGZpbmFsIFJlZiByKSB7CisJCUVudHJ5KEVudHJ5IG4sIFJlZiByKSB7CiAJCQluZXh0ID0gbjsKIAkJCXJlZiA9IHI7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dpbmRvd0N1cnNvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q3Vyc29yLmphdmEKaW5kZXggNTY5YmZlOC4uMDEwYzE0MiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q3Vyc29yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV2luZG93Q3Vyc29yLmphdmEKQEAgLTM0Nyw3ICszNDcsNyBAQCBwcml2YXRlIHZvaWQgcHJlcGFyZUluZmxhdGVyKCkgewogCQkJaW5mLnJlc2V0KCk7CiAJfQogCi0Jdm9pZCBwaW4oZmluYWwgUGFja0ZpbGUgcGFjaywgZmluYWwgbG9uZyBwb3NpdGlvbikKKwl2b2lkIHBpbihQYWNrRmlsZSBwYWNrLCBsb25nIHBvc2l0aW9uKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgQnl0ZVdpbmRvdyB3ID0gd2luZG93OwogCQlpZiAodyA9PSBudWxsIHx8ICF3LmNvbnRhaW5zKHBhY2ssIHBvc2l0aW9uKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV3JpdGVDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9maWxlL1dyaXRlQ29uZmlnLmphdmEKaW5kZXggZDljYmJkOC4uMjMwNTVlZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL2ZpbGUvV3JpdGVDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvZmlsZS9Xcml0ZUNvbmZpZy5qYXZhCkBAIC01Nyw3ICs1Nyw3IEBAIGNsYXNzIFdyaXRlQ29uZmlnIHsKIAogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBmc3luY1JlZkZpbGVzOwogCi0JcHJpdmF0ZSBXcml0ZUNvbmZpZyhmaW5hbCBDb25maWcgcmMpIHsKKwlwcml2YXRlIFdyaXRlQ29uZmlnKENvbmZpZyByYykgewogCQljb21wcmVzc2lvbiA9IHJjLmdldChDb3JlQ29uZmlnLktFWSkuZ2V0Q29tcHJlc3Npb24oKTsKIAkJZnN5bmNPYmplY3RGaWxlcyA9IHJjLmdldEJvb2xlYW4oImNvcmUiLCAiZnN5bmNvYmplY3RmaWxlcyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCWZzeW5jUmVmRmlsZXMgPSByYy5nZXRCb29sZWFuKCJjb3JlIiwgImZzeW5jcmVmZmlsZXMiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svQmluYXJ5RGVsdGEuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0JpbmFyeURlbHRhLmphdmEKaW5kZXggMjU2NTkzMS4uYzdlNWFkNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svQmluYXJ5RGVsdGEuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9CaW5hcnlEZWx0YS5qYXZhCkBAIC02NCw3ICs2NCw3IEBAIHB1YmxpYyBjbGFzcyBCaW5hcnlEZWx0YSB7CiAJICogICAgICAgICAgICB0aGUgZGVsdGEgc3RyZWFtLCBvciBhdCBsZWFzdCB0aGUgaGVhZGVyIG9mIGl0LgogCSAqIEByZXR1cm4gdGhlIGJhc2Ugb2JqZWN0J3Mgc2l6ZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGxvbmcgZ2V0QmFzZVNpemUoZmluYWwgYnl0ZVtdIGRlbHRhKSB7CisJcHVibGljIHN0YXRpYyBsb25nIGdldEJhc2VTaXplKGJ5dGVbXSBkZWx0YSkgewogCQlpbnQgcCA9IDA7CiAJCWxvbmcgYmFzZUxlbiA9IDA7CiAJCWludCBjLCBzaGlmdCA9IDA7CkBAIC04Myw3ICs4Myw3IEBAIHB1YmxpYyBzdGF0aWMgbG9uZyBnZXRCYXNlU2l6ZShmaW5hbCBieXRlW10gZGVsdGEpIHsKIAkgKiAgICAgICAgICAgIHRoZSBkZWx0YSBzdHJlYW0sIG9yIGF0IGxlYXN0IHRoZSBoZWFkZXIgb2YgaXQuCiAJICogQHJldHVybiB0aGUgcmVzdWx0aW5nIG9iamVjdCdzIHNpemUuCiAJICovCi0JcHVibGljIHN0YXRpYyBsb25nIGdldFJlc3VsdFNpemUoZmluYWwgYnl0ZVtdIGRlbHRhKSB7CisJcHVibGljIHN0YXRpYyBsb25nIGdldFJlc3VsdFNpemUoYnl0ZVtdIGRlbHRhKSB7CiAJCWludCBwID0gMDsKIAogCQkvLyBTa2lwIGxlbmd0aCBvZiB0aGUgYmFzZSBvYmplY3QuCkBAIC0xMTQsNyArMTE0LDcgQEAgcHVibGljIHN0YXRpYyBsb25nIGdldFJlc3VsdFNpemUoZmluYWwgYnl0ZVtdIGRlbHRhKSB7CiAJICogICAgICAgICAgICBhbm90aGVyLgogCSAqIEByZXR1cm4gcGF0Y2hlZCBiYXNlCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gYXBwbHkoZmluYWwgYnl0ZVtdIGJhc2UsIGZpbmFsIGJ5dGVbXSBkZWx0YSkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIGFwcGx5KGJ5dGVbXSBiYXNlLCBieXRlW10gZGVsdGEpIHsKIAkJcmV0dXJuIGFwcGx5KGJhc2UsIGRlbHRhLCBudWxsKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0RlbHRhSW5kZXhTY2FubmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9EZWx0YUluZGV4U2Nhbm5lci5qYXZhCmluZGV4IDk2OWQwMmIuLjk0NGE5ZTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0RlbHRhSW5kZXhTY2FubmVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svRGVsdGFJbmRleFNjYW5uZXIuamF2YQpAQCAtODksNyArODksNyBAQCBjbGFzcyBEZWx0YUluZGV4U2Nhbm5lciB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgc2NhbihieXRlW10gcmF3LCBmaW5hbCBpbnQgZW5kKSB7CisJcHJpdmF0ZSB2b2lkIHNjYW4oYnl0ZVtdIHJhdywgaW50IGVuZCkgewogCQkvLyBXZSBzY2FuIHRoZSBpbnB1dCBiYWNrd2FyZHMsIGFuZCBhbHdheXMgaW5zZXJ0IG9udG8gdGhlCiAJCS8vIGZyb250IG9mIHRoZSBjaGFpbi4gVGhpcyBlbnN1cmVzIHRoYXQgY2hhaW5zIHdpbGwgaGF2ZSBsb3dlcgogCQkvLyBvZmZzZXRzIGF0IHRoZSBmcm9udCBvZiB0aGUgY2hhaW4sIGFsbG93aW5nIHVzIHRvIHByZWZlciB0aGUKQEAgLTEyMCw3ICsxMjAsNyBAQCBwcml2YXRlIHZvaWQgc2NhbihieXRlW10gcmF3LCBmaW5hbCBpbnQgZW5kKSB7CiAJCX0gd2hpbGUgKDAgPD0gcHRyKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgdGFibGVTaXplKGZpbmFsIGludCB3b3JzdENhc2VCbG9ja0NudCkgeworCXByaXZhdGUgc3RhdGljIGludCB0YWJsZVNpemUoaW50IHdvcnN0Q2FzZUJsb2NrQ250KSB7CiAJCWludCBzaGlmdCA9IDMyIC0gSW50ZWdlci5udW1iZXJPZkxlYWRpbmdaZXJvcyh3b3JzdENhc2VCbG9ja0NudCk7CiAJCWludCBzeiA9IDEgPDwgKHNoaWZ0IC0gMSk7CiAJCWlmIChzeiA8IHdvcnN0Q2FzZUJsb2NrQ250KQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svRGVsdGFXaW5kb3cuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL0RlbHRhV2luZG93LmphdmEKaW5kZXggNzNiMjg1YS4uYTA0NzUzNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svRGVsdGFXaW5kb3cuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9EZWx0YVdpbmRvdy5qYXZhCkBAIC0yNjYsNyArMjY2LDcgQEAgcHJpdmF0ZSB2b2lkIHNlYXJjaEluV2luZG93KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZGVsdGFCdWYgPSBudWxsOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBkZWx0YShmaW5hbCBEZWx0YVdpbmRvd0VudHJ5IHNyYykKKwlwcml2YXRlIGJvb2xlYW4gZGVsdGEoRGVsdGFXaW5kb3dFbnRyeSBzcmMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkvLyBJZiB0aGUgc2l6ZXMgYXJlIHJhZGljYWxseSBkaWZmZXJlbnQsIHRoaXMgaXMgYSBiYWQgcGFpcmluZy4KIAkJaWYgKHJlcy5zaXplKCkgPCBzcmMuc2l6ZSgpID4+PiA0KQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svT2JqZWN0VG9QYWNrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9PYmplY3RUb1BhY2suamF2YQppbmRleCBlOGM3NTEwLi5hMzBiZjk4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9PYmplY3RUb1BhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9PYmplY3RUb1BhY2suamF2YQpAQCAtMTAzLDcgKzEwMyw3IEBAIHB1YmxpYyBjbGFzcyBPYmplY3RUb1BhY2sgZXh0ZW5kcyBQYWNrZWRPYmplY3RJbmZvIHsKIAkgKiBAcGFyYW0gdHlwZQogCSAqICAgICAgICAgICAgcmVhbCB0eXBlIGNvZGUgb2YgdGhlIG9iamVjdCwgbm90IGl0cyBpbi1wYWNrIHR5cGUuCiAJICovCi0JcHVibGljIE9iamVjdFRvUGFjayhBbnlPYmplY3RJZCBzcmMsIGZpbmFsIGludCB0eXBlKSB7CisJcHVibGljIE9iamVjdFRvUGFjayhBbnlPYmplY3RJZCBzcmMsIGludCB0eXBlKSB7CiAJCXN1cGVyKHNyYyk7CiAJCWZsYWdzID0gdHlwZSA8PCBUWVBFX1NISUZUOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tPdXRwdXRTdHJlYW0uamF2YQppbmRleCBmZDljMWEwLi43ZjM4YTdiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja091dHB1dFN0cmVhbS5qYXZhCkBAIC0xMDcsNyArMTA3LDcgQEAgcHVibGljIFBhY2tPdXRwdXRTdHJlYW0oZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHdyaXRlTW9uaXRvciwKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWNvdW50Kys7CiAJCW91dC53cml0ZShiKTsKIAkJbWQudXBkYXRlKChieXRlKSBiKTsKQEAgLTExNSw3ICsxMTUsNyBAQCBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pCisJcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl3aGlsZSAoMCA8IGxlbikgewogCQkJZmluYWwgaW50IG4gPSBNYXRoLm1pbihsZW4sIEJZVEVTX1RPX1dSSVRFX0JFRk9SRV9DQU5DRUxfQ0hFQ0spOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja1dyaXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3BhY2svUGFja1dyaXRlci5qYXZhCmluZGV4IDQyZGYxYTYuLjM2ZDZmMGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9wYWNrL1BhY2tXcml0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcGFjay9QYWNrV3JpdGVyLmphdmEKQEAgLTMwMyw2ICszMDMsOCBAQCBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPFBhY2tXcml0ZXI+IGdldEluc3RhbmNlcygpIHsKIAogCXByaXZhdGUgT2JqZWN0Q291bnRDYWxsYmFjayBjYWxsYmFjazsKIAorCXByaXZhdGUgbG9uZyBmaWx0ZXJCbG9iTGltaXQgPSAtMTsKKwogCS8qKgogCSAqIENyZWF0ZSB3cml0ZXIgZm9yIHNwZWNpZmllZCByZXBvc2l0b3J5LgogCSAqIDxwPgpAQCAtMzEyLDcgKzMxNCw3IEBAIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8UGFja1dyaXRlcj4gZ2V0SW5zdGFuY2VzKCkgewogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICByZXBvc2l0b3J5IHdoZXJlIG9iamVjdHMgYXJlIHN0b3JlZC4KIAkgKi8KLQlwdWJsaWMgUGFja1dyaXRlcihmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgUGFja1dyaXRlcihSZXBvc2l0b3J5IHJlcG8pIHsKIAkJdGhpcyhyZXBvLCByZXBvLm5ld09iamVjdFJlYWRlcigpKTsKIAl9CiAKQEAgLTMyNSw3ICszMjcsNyBAQCBwdWJsaWMgUGFja1dyaXRlcihmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKIAkgKiBAcGFyYW0gcmVhZGVyCiAJICogICAgICAgICAgICByZWFkZXIgdG8gcmVhZCBmcm9tIHRoZSByZXBvc2l0b3J5IHdpdGguCiAJICovCi0JcHVibGljIFBhY2tXcml0ZXIoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcikgeworCXB1YmxpYyBQYWNrV3JpdGVyKE9iamVjdFJlYWRlciByZWFkZXIpIHsKIAkJdGhpcyhuZXcgUGFja0NvbmZpZygpLCByZWFkZXIpOwogCX0KIApAQCAtMzQwLDcgKzM0Miw3IEBAIHB1YmxpYyBQYWNrV3JpdGVyKGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpIHsKIAkgKiBAcGFyYW0gcmVhZGVyCiAJICogICAgICAgICAgICByZWFkZXIgdG8gcmVhZCBmcm9tIHRoZSByZXBvc2l0b3J5IHdpdGguCiAJICovCi0JcHVibGljIFBhY2tXcml0ZXIoZmluYWwgUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKSB7CisJcHVibGljIFBhY2tXcml0ZXIoUmVwb3NpdG9yeSByZXBvLCBPYmplY3RSZWFkZXIgcmVhZGVyKSB7CiAJCXRoaXMobmV3IFBhY2tDb25maWcocmVwbyksIHJlYWRlcik7CiAJfQogCkBAIC0zNTUsNyArMzU3LDcgQEAgcHVibGljIFBhY2tXcml0ZXIoZmluYWwgUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKSB7CiAJICogQHBhcmFtIHJlYWRlcgogCSAqICAgICAgICAgICAgcmVhZGVyIHRvIHJlYWQgZnJvbSB0aGUgcmVwb3NpdG9yeSB3aXRoLgogCSAqLwotCXB1YmxpYyBQYWNrV3JpdGVyKGZpbmFsIFBhY2tDb25maWcgY29uZmlnLCBmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKSB7CisJcHVibGljIFBhY2tXcml0ZXIoUGFja0NvbmZpZyBjb25maWcsIE9iamVjdFJlYWRlciByZWFkZXIpIHsKIAkJdGhpcyhjb25maWcsIHJlYWRlciwgbnVsbCk7CiAJfQogCkBAIC01MTAsNyArNTEyLDcgQEAgcHVibGljIGJvb2xlYW4gaXNUaGluKCkgewogCSAqICAgICAgICAgICAgZGV0ZXJtaW5lZCBieSBzZXQ7IHRoaXMga2luZCBvZiBwYWNrIGlzIHVzZWQgb25seSBmb3IKIAkgKiAgICAgICAgICAgIHRyYW5zcG9ydDsgdHJ1ZSAtIHRvIHByb2R1Y2UgdGhpbiBwYWNrLCBmYWxzZSAtIG90aGVyd2lzZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaGluKGZpbmFsIGJvb2xlYW4gcGFja3RoaW4pIHsKKwlwdWJsaWMgdm9pZCBzZXRUaGluKGJvb2xlYW4gcGFja3RoaW4pIHsKIAkJdGhpbiA9IHBhY2t0aGluOwogCX0KIApAQCAtNjAxLDcgKzYwMyw3IEBAIHB1YmxpYyBib29sZWFuIGlzSWdub3JlTWlzc2luZ1VuaW50ZXJlc3RpbmcoKSB7CiAJICogICAgICAgICAgICBwYWNrOyBmYWxzZSBvdGhlcndpc2UgLSBub24gZXhpc3RpbmcgdW5pbnRlcmVzdGluZyBvYmplY3RzIG1heQogCSAqICAgICAgICAgICAgY2F1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLk1pc3NpbmdPYmplY3RFeGNlcHRpb259CiAJICovCi0JcHVibGljIHZvaWQgc2V0SWdub3JlTWlzc2luZ1VuaW50ZXJlc3RpbmcoZmluYWwgYm9vbGVhbiBpZ25vcmUpIHsKKwlwdWJsaWMgdm9pZCBzZXRJZ25vcmVNaXNzaW5nVW5pbnRlcmVzdGluZyhib29sZWFuIGlnbm9yZSkgewogCQlpZ25vcmVNaXNzaW5nVW5pbnRlcmVzdGluZyA9IGlnbm9yZTsKIAl9CiAKQEAgLTYzOSw2ICs2NDEsMTQgQEAgcHVibGljIHZvaWQgc2V0U2hhbGxvd1BhY2soaW50IGRlcHRoLAogCX0KIAogCS8qKgorCSAqIEBwYXJhbSBieXRlcyBleGNsdWRlIGJsb2JzIG9mIHNpemUgZ3JlYXRlciB0aGFuIHRoaXMKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHZvaWQgc2V0RmlsdGVyQmxvYkxpbWl0KGxvbmcgYnl0ZXMpIHsKKwkJZmlsdGVyQmxvYkxpbWl0ID0gYnl0ZXM7CisJfQorCisJLyoqCiAJICogUmV0dXJucyBvYmplY3RzIG51bWJlciBpbiBhIHBhY2sgZmlsZSB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoaXMgd3JpdGVyLgogCSAqCiAJICogQHJldHVybiBudW1iZXIgb2Ygb2JqZWN0cyBpbiBwYWNrLgpAQCAtOTE0LDcgKzkyNCw3IEBAIHB1YmxpYyB2b2lkIHByZXBhcmVQYWNrKFByb2dyZXNzTW9uaXRvciBjb3VudGluZ01vbml0b3IsCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBjYWNoZWQgcGFjayBjYW5ub3QgYmUgZXhhbWluZWQuCiAJICovCi0JcHVibGljIGJvb2xlYW4gd2lsbEluY2x1ZGUoZmluYWwgQW55T2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGJvb2xlYW4gd2lsbEluY2x1ZGUoQW55T2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCU9iamVjdFRvUGFjayBvYmogPSBvYmplY3RzTWFwLmdldChpZCk7CiAJCXJldHVybiBvYmogIT0gbnVsbCAmJiAhb2JqLmlzRWRnZSgpOwogCX0KQEAgLTk4MSw3ICs5OTEsNyBAQCBwdWJsaWMgaW50IGdldEluZGV4VmVyc2lvbigpIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggZGF0YSBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byB0aGUgc3VwcGxpZWQgc3RyZWFtLgogCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlSW5kZXgoZmluYWwgT3V0cHV0U3RyZWFtIGluZGV4U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIHdyaXRlSW5kZXgoT3V0cHV0U3RyZWFtIGluZGV4U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoaXNJbmRleERpc2FibGVkKCkpCiAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuY2FjaGVkUGFja3NQcmV2ZW50c0luZGV4Q3JlYXRpb24pOwogCkBAIC0xMDAzLDcgKzEwMTMsNyBAQCBwdWJsaWMgdm9pZCB3cml0ZUluZGV4KGZpbmFsIE91dHB1dFN0cmVhbSBpbmRleFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggZGF0YSBjb3VsZCBub3QgYmUgd3JpdHRlbiB0byB0aGUgc3VwcGxpZWQgc3RyZWFtLgogCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlQml0bWFwSW5kZXgoZmluYWwgT3V0cHV0U3RyZWFtIGJpdG1hcEluZGV4U3RyZWFtKQorCXB1YmxpYyB2b2lkIHdyaXRlQml0bWFwSW5kZXgoT3V0cHV0U3RyZWFtIGJpdG1hcEluZGV4U3RyZWFtKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKHdyaXRlQml0bWFwcyA9PSBudWxsKQogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmJpdG1hcHNNdXN0QmVQcmVwYXJlZCk7CkBAIC0xNTE2LDcgKzE1MjYsNyBAQCBwcml2YXRlIHZvaWQgcGFyYWxsZWxEZWx0YVNlYXJjaChQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJCS8vIFRoZSBjYWxsZXIgZ2F2ZSB1cyBhbiBleGVjdXRvciwgYnV0IGl0IG1pZ2h0IG5vdCBkbwogCQkJLy8gYXN5bmNocm9ub3VzIGV4ZWN1dGlvbi4gIFdyYXAgZXZlcnl0aGluZyBhbmQgaG9wZSBpdAogCQkJLy8gY2FuIHNjaGVkdWxlIHRoZXNlIGZvciB1cy4KLQkJCWZvciAoZmluYWwgRGVsdGFUYXNrIHRhc2sgOiB0YXNrQmxvY2sudGFza3MpIHsKKwkJCWZvciAoRGVsdGFUYXNrIHRhc2sgOiB0YXNrQmxvY2sudGFza3MpIHsKIAkJCQlleGVjdXRvci5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKIAkJCQkJQE92ZXJyaWRlCiAJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKQEAgLTE3MjMsNyArMTczMyw3IEBAIHByaXZhdGUgdm9pZCB3cml0ZURlbHRhT2JqZWN0RGVmbGF0ZShQYWNrT3V0cHV0U3RyZWFtIG91dCwKIAkJdHlwZVN0YXRzLmRlbHRhQnl0ZXMgKz0gb3V0Lmxlbmd0aCgpIC0gb3RwLmdldE9mZnNldCgpOwogCX0KIAotCXByaXZhdGUgVGVtcG9yYXJ5QnVmZmVyLkhlYXAgZGVsdGEoZmluYWwgT2JqZWN0VG9QYWNrIG90cCkKKwlwcml2YXRlIFRlbXBvcmFyeUJ1ZmZlci5IZWFwIGRlbHRhKE9iamVjdFRvUGFjayBvdHApCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlEZWx0YUluZGV4IGluZGV4ID0gbmV3IERlbHRhSW5kZXgoYnVmZmVyKG90cC5nZXREZWx0YUJhc2VJZCgpKSk7CiAJCWJ5dGVbXSByZXMgPSBidWZmZXIob3RwKTsKQEAgLTE5NjAsNyArMTk3MCw3IEBAIHByaXZhdGUgdm9pZCBmaW5kT2JqZWN0c1RvUGFjayhATm9uTnVsbCBQcm9ncmVzc01vbml0b3IgY291bnRpbmdNb25pdG9yLAogCQkJCWJ5dGVbXSBwYXRoQnVmID0gd2Fsa2VyLmdldFBhdGhCdWZmZXIoKTsKIAkJCQlpbnQgcGF0aExlbiA9IHdhbGtlci5nZXRQYXRoTGVuZ3RoKCk7CiAJCQkJYmFzZXMuYWRkQmFzZShvLmdldFR5cGUoKSwgcGF0aEJ1ZiwgcGF0aExlbiwgcGF0aEhhc2gpOwotCQkJCWFkZE9iamVjdChvLCBwYXRoSGFzaCk7CisJCQkJZmlsdGVyQW5kQWRkT2JqZWN0KG8sIG8uZ2V0VHlwZSgpLCBwYXRoSGFzaCk7CiAJCQkJY291bnRpbmdNb25pdG9yLnVwZGF0ZSgxKTsKIAkJCX0KIAkJfSBlbHNlIHsKQEAgLTE5NzAsNyArMTk4MCw3IEBAIHByaXZhdGUgdm9pZCBmaW5kT2JqZWN0c1RvUGFjayhATm9uTnVsbCBQcm9ncmVzc01vbml0b3IgY291bnRpbmdNb25pdG9yLAogCQkJCQljb250aW51ZTsKIAkJCQlpZiAoZXhjbHVkZShvKSkKIAkJCQkJY29udGludWU7Ci0JCQkJYWRkT2JqZWN0KG8sIHdhbGtlci5nZXRQYXRoSGFzaENvZGUoKSk7CisJCQkJZmlsdGVyQW5kQWRkT2JqZWN0KG8sIG8uZ2V0VHlwZSgpLCB3YWxrZXIuZ2V0UGF0aEhhc2hDb2RlKCkpOwogCQkJCWNvdW50aW5nTW9uaXRvci51cGRhdGUoMSk7CiAJCQl9CiAJCX0KQEAgLTIwMDMsNyArMjAxMyw3IEBAIHByaXZhdGUgdm9pZCBmaW5kT2JqZWN0c1RvUGFja1VzaW5nQml0bWFwcygKIAkJCQluZWVkQml0bWFwLnJlbW92ZShvYmplY3RJZCk7CiAJCQkJY29udGludWU7CiAJCQl9Ci0JCQlhZGRPYmplY3Qob2JqZWN0SWQsIG9iai5nZXRUeXBlKCksIDApOworCQkJZmlsdGVyQW5kQWRkT2JqZWN0KG9iamVjdElkLCBvYmouZ2V0VHlwZSgpLCAwKTsKIAkJfQogCiAJCWlmICh0aGluKQpAQCAtMjA0MCwxMyArMjA1MCwxMyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHBydW5lRWRnZXNGcm9tT2JqZWN0TGlzdChMaXN0PE9iamVjdFRvUGFjaz4gbGlzdCkgewogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBvYmplY3QgaXMgYW4gdW5zdXBwb3J0ZWQgdHlwZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhZGRPYmplY3QoZmluYWwgUmV2T2JqZWN0IG9iamVjdCkKKwlwdWJsaWMgdm9pZCBhZGRPYmplY3QoUmV2T2JqZWN0IG9iamVjdCkKIAkJCXRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uIHsKIAkJaWYgKCFleGNsdWRlKG9iamVjdCkpCiAJCQlhZGRPYmplY3Qob2JqZWN0LCAwKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYWRkT2JqZWN0KGZpbmFsIFJldk9iamVjdCBvYmplY3QsIGZpbmFsIGludCBwYXRoSGFzaENvZGUpIHsKKwlwcml2YXRlIHZvaWQgYWRkT2JqZWN0KFJldk9iamVjdCBvYmplY3QsIGludCBwYXRoSGFzaENvZGUpIHsKIAkJYWRkT2JqZWN0KG9iamVjdCwgb2JqZWN0LmdldFR5cGUoKSwgcGF0aEhhc2hDb2RlKTsKIAl9CiAKQEAgLTIwNjIsNiArMjA3MiwyMSBAQCBwcml2YXRlIHZvaWQgYWRkT2JqZWN0KAogCQlvYmplY3RzTWFwLmFkZChvdHApOwogCX0KIAorCS8vIEFkZHMgdGhlIGdpdmVuIG9iamVjdCBhcyBhbiBvYmplY3QgdG8gYmUgcGFja2VkLCBmaXJzdCBwZXJmb3JtaW5nCisJLy8gZmlsdGVyaW5nIG9uIGJsb2JzIGF0IG9yIGV4Y2VlZGluZyBhIGdpdmVuIHNpemUuCisJcHJpdmF0ZSB2b2lkIGZpbHRlckFuZEFkZE9iamVjdChATm9uTnVsbCBBbnlPYmplY3RJZCBzcmMsIGludCB0eXBlLAorCQkJaW50IHBhdGhIYXNoQ29kZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworCQkvLyBDaGVjayBpZiB0aGlzIG9iamVjdCBuZWVkcyB0byBiZSByZWplY3RlZCwgZG9pbmcgdGhlIGNoZWFwZXIKKwkJLy8gY2hlY2tzIGZpcnN0LgorCQlib29sZWFuIHJlamVjdCA9IGZpbHRlckJsb2JMaW1pdCA+PSAwICYmCisJCQl0eXBlID09IE9CSl9CTE9CICYmCisJCQlyZWFkZXIuZ2V0T2JqZWN0U2l6ZShzcmMsIE9CSl9CTE9CKSA+IGZpbHRlckJsb2JMaW1pdDsKKwkJaWYgKCFyZWplY3QpIHsKKwkJCWFkZE9iamVjdChzcmMsIHR5cGUsIHBhdGhIYXNoQ29kZSk7CisJCX0KKwl9CisKIAlwcml2YXRlIGJvb2xlYW4gZXhjbHVkZShBbnlPYmplY3RJZCBvYmplY3RJZCkgewogCQlpZiAoZXhjbHVkZUluUGFja3MgPT0gbnVsbCkKIAkJCXJldHVybiBmYWxzZTsKQEAgLTIyMjMsMjkwICsyMjQ4LDYgQEAgcHJpdmF0ZSBib29sZWFuIHJldXNlRGVsdGFGb3IoT2JqZWN0VG9QYWNrIG90cCkgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQkvKioKLQkgKiBTdW1tYXJ5IG9mIGhvdyBQYWNrV3JpdGVyIGNyZWF0ZWQgdGhlIHBhY2suCi0JICoKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFBhY2tTdGF0aXN0aWNzfSBpbnN0ZWFkLgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBjbGFzcyBTdGF0aXN0aWNzIHsKLQkJLyoqIFN0YXRpc3RpY3MgYWJvdXQgYSBzaW5nbGUgY2xhc3Mgb2Ygb2JqZWN0LiAqLwotCQlwdWJsaWMgc3RhdGljIGNsYXNzIE9iamVjdFR5cGUgewotCQkJLy8gQWxsIHJlcXVlc3RzIGFyZSBmb3J3YXJkZWQgdG8gdGhpcyBvYmplY3QuCi0JCQlwcml2YXRlIFBhY2tTdGF0aXN0aWNzLk9iamVjdFR5cGUgb2JqZWN0VHlwZTsKLQotCQkJLyoqCi0JCQkgKiBXcmFwcyBhbgotCQkJICoge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrLlBhY2tTdGF0aXN0aWNzLk9iamVjdFR5cGV9Ci0JCQkgKiBpbnN0YW5jZSB0byBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIEFQSS4KLQkJCSAqCi0JCQkgKiBAcGFyYW0gdHlwZQotCQkJICogICAgICAgICAgICB0aGUgd3JhcHBlZCBpbnN0YW5jZQotCQkJICovCi0JCQlwdWJsaWMgT2JqZWN0VHlwZShQYWNrU3RhdGlzdGljcy5PYmplY3RUeXBlIHR5cGUpIHsKLQkJCQlvYmplY3RUeXBlID0gdHlwZTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAcmV0dXJuIHRvdGFsIG51bWJlciBvZiBvYmplY3RzIG91dHB1dC4gVGhpcyB0b3RhbCBpbmNsdWRlcyB0aGUKLQkJCSAqICAgICAgICAgdmFsdWUgb2Yge0BsaW5rICNnZXREZWx0YXMoKX0uCi0JCQkgKi8KLQkJCXB1YmxpYyBsb25nIGdldE9iamVjdHMoKSB7Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGUuZ2V0T2JqZWN0cygpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIGRlbHRhcyBvdXRwdXQuIFRoaXMgbWF5IGJlIGxvd2VyIHRoYW4gdGhlCi0JCQkgKiAgICAgICAgIGFjdHVhbCBudW1iZXIgb2YgZGVsdGFzIGlmIGEgY2FjaGVkIHBhY2sgd2FzIHJldXNlZC4KLQkJCSAqLwotCQkJcHVibGljIGxvbmcgZ2V0RGVsdGFzKCkgewotCQkJCXJldHVybiBvYmplY3RUeXBlLmdldERlbHRhcygpOwotCQkJfQotCi0JCQkvKioKLQkJCSAqIEByZXR1cm4gbnVtYmVyIG9mIG9iamVjdHMgd2hvc2UgZXhpc3RpbmcgcmVwcmVzZW50YXRpb24gd2FzCi0JCQkgKiAgICAgICAgIHJldXNlZCBpbiB0aGUgb3V0cHV0LiBUaGlzIGNvdW50IGluY2x1ZGVzCi0JCQkgKiAgICAgICAgIHtAbGluayAjZ2V0UmV1c2VkRGVsdGFzKCl9LgotCQkJICovCi0JCQlwdWJsaWMgbG9uZyBnZXRSZXVzZWRPYmplY3RzKCkgewotCQkJCXJldHVybiBvYmplY3RUeXBlLmdldFJldXNlZE9iamVjdHMoKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAcmV0dXJuIG51bWJlciBvZiBkZWx0YXMgd2hvc2UgZXhpc3RpbmcgcmVwcmVzZW50YXRpb24gd2FzIHJldXNlZAotCQkJICogICAgICAgICBpbiB0aGUgb3V0cHV0LCBhcyB0aGVpciBiYXNlIG9iamVjdCB3YXMgYWxzbyBvdXRwdXQgb3IKLQkJCSAqICAgICAgICAgd2FzIGFzc3VtZWQgcHJlc2VudCBmb3IgYSB0aGluIHBhY2suIFRoaXMgbWF5IGJlIGxvd2VyCi0JCQkgKiAgICAgICAgIHRoYW4gdGhlIGFjdHVhbCBudW1iZXIgb2YgcmV1c2VkIGRlbHRhcyBpZiBhIGNhY2hlZCBwYWNrCi0JCQkgKiAgICAgICAgIHdhcyByZXVzZWQuCi0JCQkgKi8KLQkJCXB1YmxpYyBsb25nIGdldFJldXNlZERlbHRhcygpIHsKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZS5nZXRSZXVzZWREZWx0YXMoKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAcmV0dXJuIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuLiBUaGlzIHNpemUgaW5jbHVkZXMgdGhlCi0JCQkgKiAgICAgICAgIG9iamVjdCBoZWFkZXJzIGFzIHdlbGwgYXMgdGhlIGNvbXByZXNzZWQgZGF0YS4gVGhpcyBzaXplCi0JCQkgKiAgICAgICAgIGFsc28gaW5jbHVkZXMgYWxsIG9mIHtAbGluayAjZ2V0RGVsdGFCeXRlcygpfS4KLQkJCSAqLwotCQkJcHVibGljIGxvbmcgZ2V0Qnl0ZXMoKSB7Ci0JCQkJcmV0dXJuIG9iamVjdFR5cGUuZ2V0Qnl0ZXMoKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBAcmV0dXJuIG51bWJlciBvZiBkZWx0YSBieXRlcyB3cml0dGVuLiBUaGlzIHNpemUgaW5jbHVkZXMgdGhlCi0JCQkgKiAgICAgICAgIG9iamVjdCBoZWFkZXJzIGZvciB0aGUgZGVsdGEgb2JqZWN0cy4KLQkJCSAqLwotCQkJcHVibGljIGxvbmcgZ2V0RGVsdGFCeXRlcygpIHsKLQkJCQlyZXR1cm4gb2JqZWN0VHlwZS5nZXREZWx0YUJ5dGVzKCk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBBbGwgcmVxdWVzdHMgYXJlIGZvcndhcmRlZCB0byB0aGlzIG9iamVjdC4KLQkJcHJpdmF0ZSBQYWNrU3RhdGlzdGljcyBzdGF0aXN0aWNzOwotCi0JCS8qKgotCQkgKiBXcmFwcyBhIHtAbGluayBQYWNrU3RhdGlzdGljc30gb2JqZWN0IHRvIG1haW50YWluIGJhY2t3YXJkcwotCQkgKiBjb21wYXRpYmlsaXR5IHdpdGggZXhpc3RpbmcgQVBJLgotCQkgKgotCQkgKiBAcGFyYW0gc3RhdHMKLQkJICogICAgICAgICAgICB0aGUgd3JhcHBlZCBQYWNrU3RhdGl0aWNzIG9iamVjdAotCQkgKi8KLQkJcHVibGljIFN0YXRpc3RpY3MoUGFja1N0YXRpc3RpY3Mgc3RhdHMpIHsKLQkJCXN0YXRpc3RpY3MgPSBzdGF0czsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHVubW9kaWZpYWJsZSBjb2xsZWN0aW9uIG9mIG9iamVjdHMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlCi0JCSAqICAgICAgICAgcGFjay4gTWF5IGJlIG51bGwgaWYgdGhlIHBhY2sgd2FzIGhhbmQtY3JhZnRlZCBpbiBhIHVuaXQKLQkJICogICAgICAgICB0ZXN0LgotCQkgKi8KLQkJcHVibGljIFNldDxPYmplY3RJZD4gZ2V0SW50ZXJlc3RpbmdPYmplY3RzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0SW50ZXJlc3RpbmdPYmplY3RzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB1bm1vZGlmaWFibGUgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkCi0JCSAqICAgICAgICAgZnJvbSB0aGUgcGFjaywgYXMgdGhlIHBlZXIgdGhhdCB3aWxsIHJlY2VpdmUgdGhlIHBhY2sgYWxyZWFkeQotCQkgKiAgICAgICAgIGhhcyB0aGVzZSBvYmplY3RzLgotCQkgKi8KLQkJcHVibGljIFNldDxPYmplY3RJZD4gZ2V0VW5pbnRlcmVzdGluZ09iamVjdHMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRVbmludGVyZXN0aW5nT2JqZWN0cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdW5tb2RpZmlhYmxlIGNvbGxlY3Rpb24gb2YgdGhlIGNhY2hlZCBwYWNrcyB0aGF0IHdlcmUgcmV1c2VkCi0JCSAqICAgICAgICAgaW4gdGhlIG91dHB1dCwgaWYgYW55IHdlcmUgc2VsZWN0ZWQgZm9yIHJldXNlLgotCQkgKi8KLQkJcHVibGljIENvbGxlY3Rpb248Q2FjaGVkUGFjaz4gZ2V0UmV1c2VkUGFja3MoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRSZXVzZWRQYWNrcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gbnVtYmVyIG9mIG9iamVjdHMgaW4gdGhlIG91dHB1dCBwYWNrIHRoYXQgd2VudCB0aHJvdWdoIHRoZQotCQkgKiAgICAgICAgIGRlbHRhIHNlYXJjaCBwcm9jZXNzIGluIG9yZGVyIHRvIGZpbmQgYSBwb3RlbnRpYWwgZGVsdGEgYmFzZS4KLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0RGVsdGFTZWFyY2hOb25FZGdlT2JqZWN0cygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldERlbHRhU2VhcmNoTm9uRWRnZU9iamVjdHMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIG51bWJlciBvZiBvYmplY3RzIGluIHRoZSBvdXRwdXQgcGFjayB0aGF0IHdlbnQgdGhyb3VnaCBkZWx0YQotCQkgKiAgICAgICAgIGJhc2Ugc2VhcmNoIGFuZCBmb3VuZCBhIHN1aXRhYmxlIGJhc2UuIFRoaXMgaXMgYSBzdWJzZXQgb2YKLQkJICogICAgICAgICB7QGxpbmsgI2dldERlbHRhU2VhcmNoTm9uRWRnZU9iamVjdHMoKX0uCi0JCSAqLwotCQlwdWJsaWMgaW50IGdldERlbHRhc0ZvdW5kKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0RGVsdGFzRm91bmQoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRvdGFsIG51bWJlciBvZiBvYmplY3RzIG91dHB1dC4gVGhpcyB0b3RhbCBpbmNsdWRlcyB0aGUgdmFsdWUKLQkJICogICAgICAgICBvZiB7QGxpbmsgI2dldFRvdGFsRGVsdGFzKCl9LgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0VG90YWxPYmplY3RzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VG90YWxPYmplY3RzKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aGUgY291bnQgb2Ygb2JqZWN0cyB0aGF0IG5lZWRlZCB0byBiZSBkaXNjb3ZlcmVkIHRocm91Z2ggYW4KLQkJICogICAgICAgICBvYmplY3Qgd2FsayBiZWNhdXNlIHRoZXkgd2VyZSBub3QgZm91bmQgaW4gYml0bWFwIGluZGljZXMuCi0JCSAqICAgICAgICAgUmV0dXJucyAtMSBpZiBubyBiaXRtYXAgaW5kaWNlcyB3ZXJlIGZvdW5kLgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0Qml0bWFwSW5kZXhNaXNzZXMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRCaXRtYXBJbmRleE1pc3NlcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIGRlbHRhcyBvdXRwdXQuIFRoaXMgbWF5IGJlIGxvd2VyIHRoYW4gdGhlCi0JCSAqICAgICAgICAgYWN0dWFsIG51bWJlciBvZiBkZWx0YXMgaWYgYSBjYWNoZWQgcGFjayB3YXMgcmV1c2VkLgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0VG90YWxEZWx0YXMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUb3RhbERlbHRhcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gbnVtYmVyIG9mIG9iamVjdHMgd2hvc2UgZXhpc3RpbmcgcmVwcmVzZW50YXRpb24gd2FzIHJldXNlZCBpbgotCQkgKiAgICAgICAgIHRoZSBvdXRwdXQuIFRoaXMgY291bnQgaW5jbHVkZXMge0BsaW5rICNnZXRSZXVzZWREZWx0YXMoKX0uCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRSZXVzZWRPYmplY3RzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0UmV1c2VkT2JqZWN0cygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gbnVtYmVyIG9mIGRlbHRhcyB3aG9zZSBleGlzdGluZyByZXByZXNlbnRhdGlvbiB3YXMgcmV1c2VkIGluCi0JCSAqICAgICAgICAgdGhlIG91dHB1dCwgYXMgdGhlaXIgYmFzZSBvYmplY3Qgd2FzIGFsc28gb3V0cHV0IG9yIHdhcwotCQkgKiAgICAgICAgIGFzc3VtZWQgcHJlc2VudCBmb3IgYSB0aGluIHBhY2suIFRoaXMgbWF5IGJlIGxvd2VyIHRoYW4gdGhlCi0JCSAqICAgICAgICAgYWN0dWFsIG51bWJlciBvZiByZXVzZWQgZGVsdGFzIGlmIGEgY2FjaGVkIHBhY2sgd2FzIHJldXNlZC4KLQkJICovCi0JCXB1YmxpYyBsb25nIGdldFJldXNlZERlbHRhcygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFJldXNlZERlbHRhcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4uIFRoaXMgc2l6ZSBpbmNsdWRlcyB0aGUgcGFjawotCQkgKiAgICAgICAgIGhlYWRlciwgdHJhaWxlciwgdGhpbiBwYWNrLCBhbmQgcmV1c2VkIGNhY2hlZCBwYWNrKHMpLgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0VG90YWxCeXRlcygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFRvdGFsQnl0ZXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHNpemUgb2YgdGhlIHRoaW4gcGFjayBpbiBieXRlcywgaWYgYSB0aGluIHBhY2sgd2FzIGdlbmVyYXRlZC4KLQkJICogICAgICAgICBBIHRoaW4gcGFjayBpcyBjcmVhdGVkIHdoZW4gdGhlIGNsaWVudCBhbHJlYWR5IGhhcyBvYmplY3RzCi0JCSAqICAgICAgICAgYW5kIHNvbWUgZGVsdGFzIGFyZSBjcmVhdGVkIGFnYWluc3QgdGhvc2Ugb2JqZWN0cywgb3IgaWYgYQotCQkgKiAgICAgICAgIGNhY2hlZCBwYWNrIGlzIGJlaW5nIHVzZWQgYW5kIHNvbWUgZGVsdGFzIHdpbGwgcmVmZXJlbmNlCi0JCSAqICAgICAgICAgb2JqZWN0cyBpbiB0aGUgY2FjaGVkIHBhY2suIFRoaXMgc2l6ZSBkb2VzIG5vdCBpbmNsdWRlIHRoZQotCQkgKiAgICAgICAgIHBhY2sgaGVhZGVyIG9yIHRyYWlsZXIuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRUaGluUGFja0J5dGVzKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VGhpblBhY2tCeXRlcygpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSB0eXBlQ29kZQotCQkgKiAgICAgICAgICAgIG9iamVjdCB0eXBlIGNvZGUsIGUuZy4gT0JKX0NPTU1JVCBvciBPQkpfVFJFRS4KLQkJICogQHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHR5cGUgb2Ygb2JqZWN0IGluIHRoZSBwYWNrLgotCQkgKi8KLQkJcHVibGljIE9iamVjdFR5cGUgYnlPYmplY3RUeXBlKGludCB0eXBlQ29kZSkgewotCQkJcmV0dXJuIG5ldyBPYmplY3RUeXBlKHN0YXRpc3RpY3MuYnlPYmplY3RUeXBlKHR5cGVDb2RlKSk7Ci0JCX0KLQotCQkvKiogQHJldHVybiB0cnVlIGlmIHRoZSByZXN1bHRpbmcgcGFjayBmaWxlIHdhcyBhIHNoYWxsb3cgcGFjay4gKi8KLQkJcHVibGljIGJvb2xlYW4gaXNTaGFsbG93KCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuaXNTaGFsbG93KCk7Ci0JCX0KLQotCQkvKiogQHJldHVybiBkZXB0aCAoaW4gY29tbWl0cykgdGhlIHBhY2sgaW5jbHVkZXMgaWYgc2hhbGxvdy4gKi8KLQkJcHVibGljIGludCBnZXREZXB0aCgpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldERlcHRoKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aW1lIGluIG1pbGxpc2Vjb25kcyBzcGVudCBlbnVtZXJhdGluZyB0aGUgb2JqZWN0cyB0aGF0IG5lZWQKLQkJICogICAgICAgICB0byBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LiBUaGlzIHRpbWUgaW5jbHVkZXMgYW55IHJlc3RhcnRzCi0JCSAqICAgICAgICAgdGhhdCBvY2N1ciB3aGVuIGEgY2FjaGVkIHBhY2sgaXMgc2VsZWN0ZWQgZm9yIHJldXNlLgotCQkgKi8KLQkJcHVibGljIGxvbmcgZ2V0VGltZUNvdW50aW5nKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VGltZUNvdW50aW5nKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiB0aW1lIGluIG1pbGxpc2Vjb25kcyBzcGVudCBtYXRjaGluZyBleGlzdGluZyByZXByZXNlbnRhdGlvbnMKLQkJICogICAgICAgICBhZ2FpbnN0IG9iamVjdHMgdGhhdCB3aWxsIGJlIHRyYW5zbWl0dGVkLCBvciB0aGF0IHRoZSBjbGllbnQKLQkJICogICAgICAgICBjYW4gYmUgYXNzdW1lZCB0byBhbHJlYWR5IGhhdmUuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRUaW1lU2VhcmNoaW5nRm9yUmV1c2UoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUaW1lU2VhcmNoaW5nRm9yUmV1c2UoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNwZW50IGZpbmRpbmcgdGhlIHNpemVzIG9mIGFsbCBvYmplY3RzCi0JCSAqICAgICAgICAgdGhhdCB3aWxsIGVudGVyIHRoZSBkZWx0YSBjb21wcmVzc2lvbiBzZWFyY2ggd2luZG93LiBUaGUKLQkJICogICAgICAgICBzaXplcyBuZWVkIHRvIGJlIGtub3duIHRvIGJldHRlciBtYXRjaCBzaW1pbGFyIG9iamVjdHMKLQkJICogICAgICAgICB0b2dldGhlciBhbmQgaW1wcm92ZSBkZWx0YSBjb21wcmVzc2lvbiByYXRpb3MuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRUaW1lU2VhcmNoaW5nRm9yU2l6ZXMoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUaW1lU2VhcmNoaW5nRm9yU2l6ZXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNwZW50IG9uIGRlbHRhIGNvbXByZXNzaW9uLiBUaGlzIGlzCi0JCSAqICAgICAgICAgb2JzZXJ2ZWQgd2FsbC1jbG9jayB0aW1lIGFuZCBkb2VzIG5vdCBhY2N1cmF0ZWx5IHRyYWNrIENQVQotCQkgKiAgICAgICAgIHRpbWUgdXNlZCB3aGVuIG11bHRpcGxlIHRocmVhZHMgd2VyZSB1c2VkIHRvIHBlcmZvcm0gdGhlCi0JCSAqICAgICAgICAgZGVsdGEgY29tcHJlc3Npb24uCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRUaW1lQ29tcHJlc3NpbmcoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUaW1lQ29tcHJlc3NpbmcoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIHRpbWUgaW4gbWlsbGlzZWNvbmRzIHNwZW50IHdyaXRpbmcgdGhlIHBhY2sgb3V0cHV0LCBmcm9tCi0JCSAqICAgICAgICAgc3RhcnQgb2YgaGVhZGVyIHVudGlsIGVuZCBvZiB0cmFpbGVyLiBUaGUgdHJhbnNmZXIgc3BlZWQgY2FuCi0JCSAqICAgICAgICAgYmUgYXBwcm94aW1hdGVkIGJ5IGRpdmlkaW5nIHtAbGluayAjZ2V0VG90YWxCeXRlcygpfSBieSB0aGlzCi0JCSAqICAgICAgICAgdmFsdWUuCi0JCSAqLwotCQlwdWJsaWMgbG9uZyBnZXRUaW1lV3JpdGluZygpIHsKLQkJCXJldHVybiBzdGF0aXN0aWNzLmdldFRpbWVXcml0aW5nKCk7Ci0JCX0KLQotCQkvKiogQHJldHVybiB0b3RhbCB0aW1lIHNwZW50IHByb2Nlc3NpbmcgdGhpcyBwYWNrLiAqLwotCQlwdWJsaWMgbG9uZyBnZXRUaW1lVG90YWwoKSB7Ci0JCQlyZXR1cm4gc3RhdGlzdGljcy5nZXRUaW1lVG90YWwoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIGdldCB0aGUgYXZlcmFnZSBvdXRwdXQgc3BlZWQgaW4gdGVybXMgb2YgYnl0ZXMtcGVyLXNlY29uZC4KLQkJICogICAgICAgICB7QGNvZGUgZ2V0VG90YWxCeXRlcygpIC8gKGdldFRpbWVXcml0aW5nKCkgLyAxMDAwLjApfS4KLQkJICovCi0JCXB1YmxpYyBkb3VibGUgZ2V0VHJhbnNmZXJSYXRlKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0VHJhbnNmZXJSYXRlKCk7Ci0JCX0KLQotCQkvKiogQHJldHVybiBmb3JtYXR0ZWQgbWVzc2FnZSBzdHJpbmcgZm9yIGRpc3BsYXkgdG8gY2xpZW50cy4gKi8KLQkJcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQkJcmV0dXJuIHN0YXRpc3RpY3MuZ2V0TWVzc2FnZSgpOwotCQl9Ci0JfQotCiAJcHJpdmF0ZSBjbGFzcyBNdXRhYmxlU3RhdGUgewogCQkvKiogRXN0aW1hdGVkIHNpemUgb2YgYSBzaW5nbGUgT2JqZWN0VG9QYWNrIGluc3RhbmNlLiAqLwogCQkvLyBBc3N1bWUgNjQtYml0IHBvaW50ZXJzLCBzaW5jZSB0aGlzIGlzIGp1c3QgYW4gZXN0aW1hdGUuCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvQmxvY2tSZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9CbG9ja1JlYWRlci5qYXZhCmluZGV4IGNlMmJhNGEuLjk0MmQ3MmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9CbG9ja1JlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9CbG9ja1JlYWRlci5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5CbG9ja1dyaXRlci5jb21wYXJlOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuUmVmdGFibGVDb25zdGFudHMuRklMRV9CTE9DS19UWVBFOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGUuUmVmdGFibGVDb25zdGFudHMuRklMRV9IRUFERVJfTEVOOwpAQCAtMTM4LDcgKzEzOCw3IEBAIFN0cmluZyBuYW1lKCkgewogCQlpZiAoYmxvY2tUeXBlID09IExPR19CTE9DS19UWVBFKSB7CiAJCQlsZW4gLT0gOTsKIAkJfQotCQlyZXR1cm4gUmF3UGFyc2VVdGlscy5kZWNvZGUoVVRGXzgsIG5hbWVCdWYsIDAsIGxlbik7CisJCXJldHVybiBSYXdQYXJzZVV0aWxzLmRlY29kZShDSEFSU0VULCBuYW1lQnVmLCAwLCBsZW4pOwogCX0KIAogCWJvb2xlYW4gbWF0Y2goYnl0ZVtdIG1hdGNoLCBib29sZWFuIG1hdGNoSXNQcmVmaXgpIHsKQEAgLTE3MSw3ICsxNzEsNyBAQCBsb25nIHJlYWRVcGRhdGVJbmRleERlbHRhKCkgewogCX0KIAogCVJlZiByZWFkUmVmKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIG5hbWUgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShVVEZfOCwgbmFtZUJ1ZiwgMCwgbmFtZUxlbik7CisJCVN0cmluZyBuYW1lID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ0hBUlNFVCwgbmFtZUJ1ZiwgMCwgbmFtZUxlbik7CiAJCXN3aXRjaCAodmFsdWVUeXBlICYgVkFMVUVfVFlQRV9NQVNLKSB7CiAJCWNhc2UgVkFMVUVfTk9ORTogLy8gZGVsZXRlCiAJCQlyZXR1cm4gbmV3UmVmKG5hbWUpOwpAQCAtMjY2LDcgKzI2Niw3IEBAIHByaXZhdGUgT2JqZWN0SWQgcmVhZFZhbHVlSWQoKSB7CiAJcHJpdmF0ZSBTdHJpbmcgcmVhZFZhbHVlU3RyaW5nKCkgewogCQlpbnQgbGVuID0gcmVhZFZhcmludDMyKCk7CiAJCWludCBlbmQgPSBwdHIgKyBsZW47Ci0JCVN0cmluZyBzID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoVVRGXzgsIGJ1ZiwgcHRyLCBlbmQpOworCQlTdHJpbmcgcyA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKENIQVJTRVQsIGJ1ZiwgcHRyLCBlbmQpOwogCQlwdHIgPSBlbmQ7CiAJCXJldHVybiBzOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9CbG9ja1dyaXRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL0Jsb2NrV3JpdGVyLmphdmEKaW5kZXggYjMxNzNlOC4uM2Q4ZmJmNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL0Jsb2NrV3JpdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL0Jsb2NrV3JpdGVyLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLlJlZnRhYmxlQ29uc3RhbnRzLkZJTEVfSEVBREVSX0xFTjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLlJlZnRhYmxlQ29uc3RhbnRzLklOREVYX0JMT0NLX1RZUEU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5MT0dfQkxPQ0tfVFlQRTsKQEAgLTQ0MCw3ICs0NDAsNyBAQCB2b2lkIHdyaXRlVmFsdWUoUmVmdGFibGVPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAogCQlwcml2YXRlIHN0YXRpYyBieXRlW10gbmFtZVV0ZjgoUmVmIHJlZikgewotCQkJcmV0dXJuIHJlZi5nZXROYW1lKCkuZ2V0Qnl0ZXMoVVRGXzgpOworCQkJcmV0dXJuIHJlZi5nZXROYW1lKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCX0KIAl9CiAKQEAgLTU1OSwxMyArNTU5LDEzIEBAIHN0YXRpYyBjbGFzcyBMb2dFbnRyeSBleHRlbmRzIEVudHJ5IHsKIAkJCXRoaXMubmV3SWQgPSBuZXdJZDsKIAkJCXRoaXMudGltZVNlY3MgPSB3aG8uZ2V0V2hlbigpLmdldFRpbWUoKSAvIDEwMDBMOwogCQkJdGhpcy50eiA9IChzaG9ydCkgd2hvLmdldFRpbWVab25lT2Zmc2V0KCk7Ci0JCQl0aGlzLm5hbWUgPSB3aG8uZ2V0TmFtZSgpLmdldEJ5dGVzKFVURl84KTsKLQkJCXRoaXMuZW1haWwgPSB3aG8uZ2V0RW1haWxBZGRyZXNzKCkuZ2V0Qnl0ZXMoVVRGXzgpOwotCQkJdGhpcy5tc2cgPSBtZXNzYWdlLmdldEJ5dGVzKFVURl84KTsKKwkJCXRoaXMubmFtZSA9IHdoby5nZXROYW1lKCkuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CisJCQl0aGlzLmVtYWlsID0gd2hvLmdldEVtYWlsQWRkcmVzcygpLmdldEJ5dGVzKENIQVJTRVQpOworCQkJdGhpcy5tc2cgPSBtZXNzYWdlLmdldEJ5dGVzKENIQVJTRVQpOwogCQl9CiAKIAkJc3RhdGljIGJ5dGVbXSBrZXkoU3RyaW5nIHJlZiwgbG9uZyBpbmRleCkgewotCQkJYnl0ZVtdIG5hbWUgPSByZWYuZ2V0Qnl0ZXMoVVRGXzgpOworCQkJYnl0ZVtdIG5hbWUgPSByZWYuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCQlieXRlW10ga2V5ID0gQXJyYXlzLmNvcHlPZihuYW1lLCBuYW1lLmxlbmd0aCArIDEgKyA4KTsKIAkJCU5CLmVuY29kZUludDY0KGtleSwga2V5Lmxlbmd0aCAtIDgsIHJldmVyc2VVcGRhdGVJbmRleChpbmRleCkpOwogCQkJcmV0dXJuIGtleTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZU91dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL1JlZnRhYmxlT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggMWZjNDNjOS4uNDRiYmIxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL1JlZnRhYmxlT3V0cHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRhYmxlL1JlZnRhYmxlT3V0cHV0U3RyZWFtLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucmVmdGFibGU7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLlJlZnRhYmxlQ29uc3RhbnRzLkZJTEVfSEVBREVSX0xFTjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLlJlZnRhYmxlQ29uc3RhbnRzLklOREVYX0JMT0NLX1RZUEU7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5SZWZ0YWJsZUNvbnN0YW50cy5MT0dfQkxPQ0tfVFlQRTsKQEAgLTE2MCw3ICsxNjAsNyBAQCB2b2lkIHdyaXRlSWQoT2JqZWN0SWQgaWQpIHsKIAl9CiAKIAl2b2lkIHdyaXRlVmFyaW50U3RyaW5nKFN0cmluZyBzKSB7Ci0JCXdyaXRlVmFyaW50U3RyaW5nKHMuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJd3JpdGVWYXJpbnRTdHJpbmcocy5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJfQogCiAJdm9pZCB3cml0ZVZhcmludFN0cmluZyhieXRlW10gbXNnKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdGFibGUvUmVmdGFibGVSZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZVJlYWRlci5qYXZhCmluZGV4IDc0ODc3MTkuLjUzNTY5NTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZVJlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0YWJsZS9SZWZ0YWJsZVJlYWRlci5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQuaW50ZXJuYWwuc3RvcmFnZS5yZWZ0YWJsZS5CbG9ja1JlYWRlci5kZWNvZGVCbG9ja0xlbjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLlJlZnRhYmxlQ29uc3RhbnRzLkZJTEVfQkxPQ0tfVFlQRTsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5zdG9yYWdlLnJlZnRhYmxlLlJlZnRhYmxlQ29uc3RhbnRzLkZJTEVfRk9PVEVSX0xFTjsKQEAgLTE4Miw3ICsxODIsNyBAQCBwdWJsaWMgUmVmQ3Vyc29yIGFsbFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCXB1YmxpYyBSZWZDdXJzb3Igc2Vla1JlZihTdHJpbmcgcmVmTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaW5pdFJlZkluZGV4KCk7CiAKLQkJYnl0ZVtdIGtleSA9IHJlZk5hbWUuZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10ga2V5ID0gcmVmTmFtZS5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJYm9vbGVhbiBwcmVmaXggPSBrZXlba2V5Lmxlbmd0aCAtIDFdID09ICcvJzsKIAogCQlSZWZDdXJzb3JJbXBsIGkgPSBuZXcgUmVmQ3Vyc29ySW1wbChyZWZFbmQsIGtleSwgcHJlZml4KTsKQEAgLTIyMyw3ICsyMjMsNyBAQCBwdWJsaWMgTG9nQ3Vyc29yIHNlZWtMb2coU3RyaW5nIHJlZk5hbWUsIGxvbmcgdXBkYXRlSW5kZXgpCiAJCWluaXRMb2dJbmRleCgpOwogCQlpZiAobG9nUG9zaXRpb24gPiAwKSB7CiAJCQlieXRlW10ga2V5ID0gTG9nRW50cnkua2V5KHJlZk5hbWUsIHVwZGF0ZUluZGV4KTsKLQkJCWJ5dGVbXSBtYXRjaCA9IHJlZk5hbWUuZ2V0Qnl0ZXMoVVRGXzgpOworCQkJYnl0ZVtdIG1hdGNoID0gcmVmTmFtZS5nZXRCeXRlcyhDSEFSU0VUKTsKIAkJCUxvZ0N1cnNvckltcGwgaSA9IG5ldyBMb2dDdXJzb3JJbXBsKGxvZ0VuZCwgbWF0Y2gpOwogCQkJaS5ibG9jayA9IHNlZWsoTE9HX0JMT0NLX1RZUEUsIGtleSwgbG9nSW5kZXgsIGxvZ1Bvc2l0aW9uLCBsb2dFbmQpOwogCQkJcmV0dXJuIGk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlLmphdmEKaW5kZXggZTlhYTExMC4uNTc1MWRkNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9pbnRlcm5hbC9zdG9yYWdlL3JlZnRyZWUvUmVmVHJlZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWUuamF2YQpAQCAtMjc5LDcgKzI3OSw3IEBAIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFJlZihDb21tYW5kIGNtZCkgewogCQlyZXR1cm4gSEVBRC5lcXVhbHMobikgfHwgUmVwb3NpdG9yeS5pc1ZhbGlkUmVmTmFtZShuKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYXBwbHkoRGlyQ2FjaGVFZGl0b3IgZWQsIGZpbmFsIENvbW1hbmQgY21kKSB7CisJcHJpdmF0ZSB2b2lkIGFwcGx5KERpckNhY2hlRWRpdG9yIGVkLCBDb21tYW5kIGNtZCkgewogCQlTdHJpbmcgcGF0aCA9IHJlZlBhdGgoY21kLmdldFJlZk5hbWUoKSk7CiAJCVJlZiBvbGRSZWYgPSBjbWQuZ2V0T2xkUmVmKCk7CiAJCWZpbmFsIFJlZiBuZXdSZWYgPSBjbWQuZ2V0TmV3UmVmKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2ludGVybmFsL3N0b3JhZ2UvcmVmdHJlZS9SZWZUcmVlRGF0YWJhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWVEYXRhYmFzZS5qYXZhCmluZGV4IDE4MzQ2OGYuLjI3ZGFhZjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWVEYXRhYmFzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvaW50ZXJuYWwvc3RvcmFnZS9yZWZ0cmVlL1JlZlRyZWVEYXRhYmFzZS5qYXZhCkBAIC0yODIsNyArMjgyLDcgQEAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0SWQgaWRPZihATnVsbGFibGUgUmVmIHNyYykgewogCXB1YmxpYyBMaXN0PFJlZj4gZ2V0QWRkaXRpb25hbFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlDb2xsZWN0aW9uPFJlZj4gdHhuUmVmczsKIAkJaWYgKHR4bk5hbWVzcGFjZSAhPSBudWxsKSB7Ci0JCQl0eG5SZWZzID0gYm9vdHN0cmFwLmdldFJlZnModHhuTmFtZXNwYWNlKS52YWx1ZXMoKTsKKwkJCXR4blJlZnMgPSBib290c3RyYXAuZ2V0UmVmc0J5UHJlZml4KHR4bk5hbWVzcGFjZSk7CiAJCX0gZWxzZSB7CiAJCQlSZWYgciA9IGJvb3RzdHJhcC5leGFjdFJlZih0eG5Db21taXR0ZWQpOwogCQkJaWYgKHIgIT0gbnVsbCAmJiByLmdldE9iamVjdElkKCkgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2aWF0ZWRPYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQWJicmV2aWF0ZWRPYmplY3RJZC5qYXZhCmluZGV4IDQyNWY3ZjYuLmQxMDVkMGQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FiYnJldmlhdGVkT2JqZWN0SWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BYmJyZXZpYXRlZE9iamVjdElkLmphdmEKQEAgLTc0LDcgKzc0LDcgQEAgcHVibGljIGZpbmFsIGNsYXNzIEFiYnJldmlhdGVkT2JqZWN0SWQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byB0ZXN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3RyaW5nIGNhbiBjb252ZXJ0ZWQgaW50byBhbiBBYmJyZXZpYXRlZE9iamVjdElkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0lkKGZpbmFsIFN0cmluZyBpZCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0lkKFN0cmluZyBpZCkgewogCQlpZiAoaWQubGVuZ3RoKCkgPCAyIHx8IENvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCA8IGlkLmxlbmd0aCgpKQogCQkJcmV0dXJuIGZhbHNlOwogCQl0cnkgewpAQCAtMTMxLDcgKzEzMSw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgQWJicmV2aWF0ZWRPYmplY3RJZCBmcm9tT2JqZWN0SWQoQW55T2JqZWN0SWQgaWQpIHsKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tLiBNdXN0IGJlICZsdDs9IDQwIGNoYXJhY3RlcnMuCiAJICogQHJldHVybiB0aGUgY29udmVydGVkIG9iamVjdCBpZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEFiYnJldmlhdGVkT2JqZWN0SWQgZnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgc3RyKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBBYmJyZXZpYXRlZE9iamVjdElkIGZyb21TdHJpbmcoU3RyaW5nIHN0cikgewogCQlpZiAoc3RyLmxlbmd0aCgpID4gQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkSWQsIHN0cikpOwogCQlmaW5hbCBieXRlW10gYiA9IENvbnN0YW50cy5lbmNvZGVBU0NJSShzdHIpOwpAQCAtMTY1LDcgKzE2NSw3IEBAIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBoZXhVSW50MzIoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCwgZmluYWwgaW50IGVuZCkgewogCQlyZXR1cm4gciA8PCAoOCAtIG4pICogNDsKIAl9CiAKLQlzdGF0aWMgaW50IG1hc2soZmluYWwgaW50IG5pYmJsZXMsIGZpbmFsIGludCB3b3JkLCBmaW5hbCBpbnQgdikgeworCXN0YXRpYyBpbnQgbWFzayhpbnQgbmliYmxlcywgaW50IHdvcmQsIGludCB2KSB7CiAJCWZpbmFsIGludCBiID0gKHdvcmQgLSAxKSAqIDg7CiAJCWlmIChiICsgOCA8PSBuaWJibGVzKSB7CiAJCQkvLyBXZSBoYXZlIGFsbCBvZiB0aGUgYml0cyByZXF1aXJlZCBmb3IgdGhpcyB3b3JkLgpAQCAtMjQ0LDcgKzI0NCw3IEBAIHB1YmxpYyBPYmplY3RJZCB0b09iamVjdElkKCkgewogCSAqICAgICAgICAgJmd0OzAgaWYgdGhpcyBhYmJyZXZpYXRpb24gbmFtZXMgYW4gb2JqZWN0IHRoYXQgaXMgYWZ0ZXIKIAkgKiAgICAgICAgIDxjb2RlPm90aGVyPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoZmluYWwgQW55T2JqZWN0SWQgb3RoZXIpIHsKKwlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoQW55T2JqZWN0SWQgb3RoZXIpIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDMyKHcxLCBtYXNrKDEsIG90aGVyLncxKSk7CkBAIC0yODAsNyArMjgwLDcgQEAgcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGZpbmFsIEFueU9iamVjdElkIG90aGVyKSB7CiAJICogICAgICAgICAmZ3Q7MCBpZiB0aGlzIGFiYnJldmlhdGlvbiBuYW1lcyBhbiBvYmplY3QgdGhhdCBpcyBhZnRlcgogCSAqICAgICAgICAgPGNvZGU+b3RoZXI8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBwcmVmaXhDb21wYXJlKGJ5dGVbXSBicywgaW50IHApIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDMyKHcxLCBtYXNrKDEsIE5CLmRlY29kZUludDMyKGJzLCBwKSkpOwpAQCAtMzE2LDcgKzMxNiw3IEBAIHB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CiAJICogICAgICAgICAmZ3Q7MCBpZiB0aGlzIGFiYnJldmlhdGlvbiBuYW1lcyBhbiBvYmplY3QgdGhhdCBpcyBhZnRlcgogCSAqICAgICAgICAgPGNvZGU+b3RoZXI8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBmaW5hbCBpbnQgcHJlZml4Q29tcGFyZShmaW5hbCBpbnRbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgZmluYWwgaW50IHByZWZpeENvbXBhcmUoaW50W10gYnMsIGludCBwKSB7CiAJCWludCBjbXA7CiAKIAkJY21wID0gTkIuY29tcGFyZVVJbnQzMih3MSwgbWFzaygxLCBic1twXSkpOwpAQCAtMzQ3LDcgKzM0Nyw3IEBAIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Rmlyc3RCeXRlKCkgewogCQlyZXR1cm4gdzEgPj4+IDI0OwogCX0KIAotCXByaXZhdGUgaW50IG1hc2soZmluYWwgaW50IHdvcmQsIGZpbmFsIGludCB2KSB7CisJcHJpdmF0ZSBpbnQgbWFzayhpbnQgd29yZCwgaW50IHYpIHsKIAkJcmV0dXJuIG1hc2sobmliYmxlcywgd29yZCwgdik7CiAJfQogCkBAIC0zNTksNyArMzU5LDcgQEAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCWlmIChvIGluc3RhbmNlb2YgQWJicmV2aWF0ZWRPYmplY3RJZCkgewogCQkJZmluYWwgQWJicmV2aWF0ZWRPYmplY3RJZCBiID0gKEFiYnJldmlhdGVkT2JqZWN0SWQpIG87CiAJCQlyZXR1cm4gbmliYmxlcyA9PSBiLm5pYmJsZXMgJiYgdzEgPT0gYi53MSAmJiB3MiA9PSBiLncyCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BbnlPYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQW55T2JqZWN0SWQuamF2YQppbmRleCA1ODQ3NzY1Li45NzhkZDNhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9BbnlPYmplY3RJZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0FueU9iamVjdElkLmphdmEKQEAgLTczLDE3ICs3MywxOSBAQCBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIEFueU9iamVjdElkIGZpcnN0T2JqZWN0SWQsCiAJCWlmIChmaXJzdE9iamVjdElkID09IHNlY29uZE9iamVjdElkKQogCQkJcmV0dXJuIHRydWU7CiAKLQkJLy8gV2UgdGVzdCB3b3JkIDIgZmlyc3QgYXMgb2RkcyBhcmUgc29tZW9uZSBhbHJlYWR5IHVzZWQgb3VyCi0JCS8vIHdvcmQgMSBhcyBhIGhhc2ggY29kZSwgYW5kIGFwcGx5aW5nIHRoYXQgY2FtZSB1cCB3aXRoIHRoZXNlCi0JCS8vIHR3byBpbnN0YW5jZXMgd2UgYXJlIGNvbXBhcmluZyBmb3IgZXF1YWxpdHkuIFRoZXJlZm9yZSB0aGUKLQkJLy8gZmlyc3QgdHdvIHdvcmRzIGFyZSB2ZXJ5IGxpa2VseSB0byBiZSBpZGVudGljYWwuIFdlIHdhbnQgdG8KLQkJLy8gYnJlYWsgYXdheSBmcm9tIGNvbGxpc2lvbnMgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4KKwkJLy8gV2UgdGVzdCB3b3JkIDMgZmlyc3Qgc2luY2UgdGhlIGdpdCBmaWxlLWJhc2VkIE9EQgorCQkvLyB1c2VzIHRoZSBmaXJzdCBieXRlIG9mIHcxLCBhbmQgd2UgdXNlIHcyIGFzIHRoZQorCQkvLyBoYXNoIGNvZGUsIG9uZSBvZiB0aG9zZSBwcm9iYWJseSBjYW1lIHVwIHdpdGggdGhlc2UKKwkJLy8gdHdvIGluc3RhbmNlcyB3aGljaCB3ZSBhcmUgY29tcGFyaW5nIGZvciBlcXVhbGl0eS4KKwkJLy8gVGhlcmVmb3JlIHRoZSBmaXJzdCB0d28gd29yZHMgYXJlIHZlcnkgbGlrZWx5IHRvIGJlCisJCS8vIGlkZW50aWNhbC4gV2Ugd2FudCB0byBicmVhayBhd2F5IGZyb20gY29sbGlzaW9ucyBhcworCQkvLyBxdWlja2x5IGFzIHBvc3NpYmxlLgogCQkvLwotCQlyZXR1cm4gZmlyc3RPYmplY3RJZC53MiA9PSBzZWNvbmRPYmplY3RJZC53MgotCQkJCSYmIGZpcnN0T2JqZWN0SWQudzMgPT0gc2Vjb25kT2JqZWN0SWQudzMKKwkJcmV0dXJuIGZpcnN0T2JqZWN0SWQudzMgPT0gc2Vjb25kT2JqZWN0SWQudzMKIAkJCQkmJiBmaXJzdE9iamVjdElkLnc0ID09IHNlY29uZE9iamVjdElkLnc0CiAJCQkJJiYgZmlyc3RPYmplY3RJZC53NSA9PSBzZWNvbmRPYmplY3RJZC53NQotCQkJCSYmIGZpcnN0T2JqZWN0SWQudzEgPT0gc2Vjb25kT2JqZWN0SWQudzE7CisJCQkJJiYgZmlyc3RPYmplY3RJZC53MSA9PSBzZWNvbmRPYmplY3RJZC53MQorCQkJCSYmIGZpcnN0T2JqZWN0SWQudzIgPT0gc2Vjb25kT2JqZWN0SWQudzI7CiAJfQogCiAJaW50IHcxOwpAQCAtMTU5LDcgKzE2MSw3IEBAIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Qnl0ZShpbnQgaW5kZXgpIHsKIAkgKiBDb21wYXJlIHRoaXMgT2JqZWN0SWQgdG8gYW5vdGhlciBhbmQgb2J0YWluIGEgc29ydCBvcmRlcmluZy4KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBBbnlPYmplY3RJZCBvdGhlcikgeworCXB1YmxpYyBmaW5hbCBpbnQgY29tcGFyZVRvKEFueU9iamVjdElkIG90aGVyKSB7CiAJCWlmICh0aGlzID09IG90aGVyKQogCQkJcmV0dXJuIDA7CiAKQEAgLTE5NSw3ICsxOTcsNyBAQCBwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBBbnlPYmplY3RJZCBvdGhlcikgewogCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhpcyBvYmplY3QgaXMKIAkgKiAgICAgICAgIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oYnl0ZVtdIGJzLCBpbnQgcCkgewogCQlpbnQgY21wOwogCiAJCWNtcCA9IE5CLmNvbXBhcmVVSW50MzIodzEsIE5CLmRlY29kZUludDMyKGJzLCBwKSk7CkBAIC0yMjgsNyArMjMwLDcgQEAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgewogCSAqIEByZXR1cm4gYSBuZWdhdGl2ZSBpbnRlZ2VyLCB6ZXJvLCBvciBhIHBvc2l0aXZlIGludGVnZXIgYXMgdGhpcyBvYmplY3QgaXMKIAkgKiAgICAgICAgIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIG9iamVjdC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhmaW5hbCBpbnRbXSBicywgZmluYWwgaW50IHApIHsKKwlwdWJsaWMgZmluYWwgaW50IGNvbXBhcmVUbyhpbnRbXSBicywgaW50IHApIHsKIAkJaW50IGNtcDsKIAogCQljbXAgPSBOQi5jb21wYXJlVUludDMyKHcxLCBic1twXSk7CkBAIC0yNTcsNyArMjU5LDcgQEAgcHVibGljIGZpbmFsIGludCBjb21wYXJlVG8oZmluYWwgaW50W10gYnMsIGZpbmFsIGludCBwKSB7CiAJICogICAgICAgICAgICB0aGUgYWJicmV2aWF0aW9uLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIE9iamVjdElkIGJlZ2lucyB3aXRoIHRoZSBhYmJyZXZpYXRpb247IGVsc2UgZmFsc2UuCiAJICovCi0JcHVibGljIGJvb2xlYW4gc3RhcnRzV2l0aChmaW5hbCBBYmJyZXZpYXRlZE9iamVjdElkIGFiYnIpIHsKKwlwdWJsaWMgYm9vbGVhbiBzdGFydHNXaXRoKEFiYnJldmlhdGVkT2JqZWN0SWQgYWJicikgewogCQlyZXR1cm4gYWJici5wcmVmaXhDb21wYXJlKHRoaXMpID09IDA7CiAJfQogCkBAIC0yNzQsMTMgKzI3NiwxMyBAQCBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgewogCSAqICAgICAgICAgICAgdGhlIG90aGVyIGlkIHRvIGNvbXBhcmUgdG8uIE1heSBiZSBudWxsLgogCSAqIEByZXR1cm4gdHJ1ZSBvbmx5IGlmIGJvdGggT2JqZWN0SWRzIGhhdmUgaWRlbnRpY2FsIGJpdHMuCiAJICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIEFueU9iamVjdElkIG90aGVyKSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKEFueU9iamVjdElkIG90aGVyKSB7CiAJCXJldHVybiBvdGhlciAhPSBudWxsID8gZXF1YWxzKHRoaXMsIG90aGVyKSA6IGZhbHNlOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCWlmIChvIGluc3RhbmNlb2YgQW55T2JqZWN0SWQpCiAJCQlyZXR1cm4gZXF1YWxzKChBbnlPYmplY3RJZCkgbyk7CiAJCWVsc2UKQEAgLTI5Myw3ICsyOTUsNyBAQCBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKIAkgKiBAcGFyYW0gdwogCSAqICAgICAgICAgICAgdGhlIGJ1ZmZlciB0byBjb3B5IHRvLiBNdXN0IGJlIGluIGJpZyBlbmRpYW4gb3JkZXIuCiAJICovCi0JcHVibGljIHZvaWQgY29weVJhd1RvKGZpbmFsIEJ5dGVCdWZmZXIgdykgeworCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhCeXRlQnVmZmVyIHcpIHsKIAkJdy5wdXRJbnQodzEpOwogCQl3LnB1dEludCh3Mik7CiAJCXcucHV0SW50KHczKTsKQEAgLTMwOSw3ICszMTEsNyBAQCBwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgQnl0ZUJ1ZmZlciB3KSB7CiAJICogQHBhcmFtIG8KIAkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2l0aGluIGIgdG8gd3JpdGUgYXQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVJhd1RvKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgbykgeworCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhieXRlW10gYiwgaW50IG8pIHsKIAkJTkIuZW5jb2RlSW50MzIoYiwgbywgdzEpOwogCQlOQi5lbmNvZGVJbnQzMihiLCBvICsgNCwgdzIpOwogCQlOQi5lbmNvZGVJbnQzMihiLCBvICsgOCwgdzMpOwpAQCAtMzI1LDcgKzMyNyw3IEBAIHB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG8pIHsKIAkgKiBAcGFyYW0gbwogCSAqICAgICAgICAgICAgdGhlIG9mZnNldCB3aXRoaW4gYiB0byB3cml0ZSBhdC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgaW50W10gYiwgZmluYWwgaW50IG8pIHsKKwlwdWJsaWMgdm9pZCBjb3B5UmF3VG8oaW50W10gYiwgaW50IG8pIHsKIAkJYltvXSA9IHcxOwogCQliW28gKyAxXSA9IHcyOwogCQliW28gKyAyXSA9IHczOwpAQCAtMzQxLDcgKzM0Myw3IEBAIHB1YmxpYyB2b2lkIGNvcHlSYXdUbyhmaW5hbCBpbnRbXSBiLCBmaW5hbCBpbnQgbykgewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBzdHJlYW0gd3JpdGluZyBmYWlsZWQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVJhd1RvKGZpbmFsIE91dHB1dFN0cmVhbSB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGNvcHlSYXdUbyhPdXRwdXRTdHJlYW0gdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJd3JpdGVSYXdJbnQodywgdzEpOwogCQl3cml0ZVJhd0ludCh3LCB3Mik7CiAJCXdyaXRlUmF3SW50KHcsIHczKTsKQEAgLTM0OSw3ICszNTEsNyBAQCBwdWJsaWMgdm9pZCBjb3B5UmF3VG8oZmluYWwgT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdyaXRlUmF3SW50KHcsIHc1KTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlUmF3SW50KGZpbmFsIE91dHB1dFN0cmVhbSB3LCBpbnQgdikKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlUmF3SW50KE91dHB1dFN0cmVhbSB3LCBpbnQgdikKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUodiA+Pj4gMjQpOwogCQl3LndyaXRlKHYgPj4+IDE2KTsKQEAgLTM2NSw3ICszNjcsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIHdyaXRlUmF3SW50KGZpbmFsIE91dHB1dFN0cmVhbSB3LCBpbnQgdikKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBPdXRwdXRTdHJlYW0gdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oT3V0cHV0U3RyZWFtIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUodG9IZXhCeXRlQXJyYXkoKSk7CiAJfQogCkBAIC00MDgsNyArNDEwLDcgQEAgcHVibGljIHZvaWQgY29weVRvKEJ5dGVCdWZmZXIgYikgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBoZXhieXRlID0geyAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsCiAJCQknNycsICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnIH07CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEhleEJ5dGUoZmluYWwgYnl0ZVtdIGRzdCwgZmluYWwgaW50IHAsIGludCB3KSB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBmb3JtYXRIZXhCeXRlKGJ5dGVbXSBkc3QsIGludCBwLCBpbnQgdykgewogCQlpbnQgbyA9IHAgKyA3OwogCQl3aGlsZSAobyA+PSBwICYmIHcgIT0gMCkgewogCQkJZHN0W28tLV0gPSBoZXhieXRlW3cgJiAweGZdOwpAQCAtNDI2LDcgKzQyOCw3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgZm9ybWF0SGV4Qnl0ZShmaW5hbCBieXRlW10gZHN0LCBmaW5hbCBpbnQgcCwgaW50IHcpIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIHdyaXRpbmcgZmFpbGVkLgogCSAqLwotCXB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5VG8oV3JpdGVyIHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXcud3JpdGUodG9IZXhDaGFyQXJyYXkoKSk7CiAJfQogCkBAIC00NDIsNyArNDQ0LDcgQEAgcHVibGljIHZvaWQgY29weVRvKGZpbmFsIFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBzdHJlYW0gd3JpdGluZyBmYWlsZWQuCiAJICovCi0JcHVibGljIHZvaWQgY29weVRvKGZpbmFsIGNoYXJbXSB0bXAsIGZpbmFsIFdyaXRlciB3KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGNvcHlUbyhjaGFyW10gdG1wLCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdG9IZXhDaGFyQXJyYXkodG1wKTsKIAkJdy53cml0ZSh0bXAsIDAsIENvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCk7CiAJfQpAQCAtNDU3LDcgKzQ1OSw3IEBAIHB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBjaGFyW10gdG1wLCBmaW5hbCBXcml0ZXIgdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gdwogCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBhcHBlbmQgb250by4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5VG8oZmluYWwgY2hhcltdIHRtcCwgZmluYWwgU3RyaW5nQnVpbGRlciB3KSB7CisJcHVibGljIHZvaWQgY29weVRvKGNoYXJbXSB0bXAsIFN0cmluZ0J1aWxkZXIgdykgewogCQl0b0hleENoYXJBcnJheSh0bXApOwogCQl3LmFwcGVuZCh0bXAsIDAsIENvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCk7CiAJfQpAQCAtNDY4LDcgKzQ3MCw3IEBAIHB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBjaGFyW10gdG1wLCBmaW5hbCBTdHJpbmdCdWlsZGVyIHcpIHsKIAkJcmV0dXJuIGRzdDsKIAl9CiAKLQlwcml2YXRlIHZvaWQgdG9IZXhDaGFyQXJyYXkoZmluYWwgY2hhcltdIGRzdCkgeworCXByaXZhdGUgdm9pZCB0b0hleENoYXJBcnJheShjaGFyW10gZHN0KSB7CiAJCWZvcm1hdEhleENoYXIoZHN0LCAwLCB3MSk7CiAJCWZvcm1hdEhleENoYXIoZHN0LCA4LCB3Mik7CiAJCWZvcm1hdEhleENoYXIoZHN0LCAxNiwgdzMpOwpAQCAtNDc5LDcgKzQ4MSw3IEBAIHByaXZhdGUgdm9pZCB0b0hleENoYXJBcnJheShmaW5hbCBjaGFyW10gZHN0KSB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGhleGNoYXIgPSB7ICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywKIAkJCSc3JywgJzgnLCAnOScsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicgfTsKIAotCXN0YXRpYyB2b2lkIGZvcm1hdEhleENoYXIoZmluYWwgY2hhcltdIGRzdCwgZmluYWwgaW50IHAsIGludCB3KSB7CisJc3RhdGljIHZvaWQgZm9ybWF0SGV4Q2hhcihjaGFyW10gZHN0LCBpbnQgcCwgaW50IHcpIHsKIAkJaW50IG8gPSBwICsgNzsKIAkJd2hpbGUgKG8gPj0gcCAmJiB3ICE9IDApIHsKIAkJCWRzdFtvLS1dID0gaGV4Y2hhclt3ICYgMHhmXTsKQEAgLTUyNyw3ICs1MjksNyBAQCBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWUoKSB7CiAJICogICAgICAgICAgICBsZW5ndGggb2YgdGhlIGFiYnJldmlhdGVkIHN0cmluZy4KIAkgKiBAcmV0dXJuIFNIQS0xIGFiYnJldmlhdGlvbi4KIAkgKi8KLQlwdWJsaWMgQWJicmV2aWF0ZWRPYmplY3RJZCBhYmJyZXZpYXRlKGZpbmFsIGludCBsZW4pIHsKKwlwdWJsaWMgQWJicmV2aWF0ZWRPYmplY3RJZCBhYmJyZXZpYXRlKGludCBsZW4pIHsKIAkJZmluYWwgaW50IGEgPSBBYmJyZXZpYXRlZE9iamVjdElkLm1hc2sobGVuLCAxLCB3MSk7CiAJCWZpbmFsIGludCBiID0gQWJicmV2aWF0ZWRPYmplY3RJZC5tYXNrKGxlbiwgMiwgdzIpOwogCQlmaW5hbCBpbnQgYyA9IEFiYnJldmlhdGVkT2JqZWN0SWQubWFzayhsZW4sIDMsIHczKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JhdGNoUmVmVXBkYXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CYXRjaFJlZlVwZGF0ZS5qYXZhCmluZGV4IDY5MTlmN2UuLjkyNWI2YmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JhdGNoUmVmVXBkYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQmF0Y2hSZWZVcGRhdGUuamF2YQpAQCAtNDYsNiArNDYsNyBAQAogCiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlY2VpdmVDb21tYW5kLlJlc3VsdC5OT1RfQVRURU1QVEVEOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5SZWNlaXZlQ29tbWFuZC5SZXN1bHQuUkVKRUNURURfT1RIRVJfUkVBU09OOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnMudG9Db2xsZWN0aW9uOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTE3OSw3ICsxODAsNyBAQCBwdWJsaWMgUGVyc29uSWRlbnQgZ2V0UmVmTG9nSWRlbnQoKSB7CiAJICogICAgICAgICAgICBjb25maWd1cmF0aW9uLgogCSAqIEByZXR1cm4ge0Bjb2RlIHRoaXN9LgogCSAqLwotCXB1YmxpYyBCYXRjaFJlZlVwZGF0ZSBzZXRSZWZMb2dJZGVudChmaW5hbCBQZXJzb25JZGVudCBwaSkgeworCXB1YmxpYyBCYXRjaFJlZlVwZGF0ZSBzZXRSZWZMb2dJZGVudChQZXJzb25JZGVudCBwaSkgewogCQlyZWZMb2dJZGVudCA9IHBpOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC01MjgsOCArNTI5LDkgQEAgcHVibGljIHZvaWQgZXhlY3V0ZShSZXZXYWxrIHdhbGssIFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAogCQl9CiAJCWlmICghY29tbWFuZHMyLmlzRW1wdHkoKSkgewogCQkJLy8gV2hhdCBwYXJ0IG9mIHRoZSBuYW1lIHNwYWNlIGlzIGFscmVhZHkgdGFrZW4KLQkJCUNvbGxlY3Rpb248U3RyaW5nPiB0YWtlbk5hbWVzID0gbmV3IEhhc2hTZXQ8PihyZWZkYi5nZXRSZWZzKAotCQkJCQlSZWZEYXRhYmFzZS5BTEwpLmtleVNldCgpKTsKKwkJCUNvbGxlY3Rpb248U3RyaW5nPiB0YWtlbk5hbWVzID0gcmVmZGIuZ2V0UmVmcygpLnN0cmVhbSgpCisJCQkJCS5tYXAoUmVmOjpnZXROYW1lKQorCQkJCQkuY29sbGVjdCh0b0NvbGxlY3Rpb24oSGFzaFNldDo6bmV3KSk7CiAJCQlDb2xsZWN0aW9uPFN0cmluZz4gdGFrZW5QcmVmaXhlcyA9IGdldFRha2VuUHJlZml4ZXModGFrZW5OYW1lcyk7CiAKIAkJCS8vIE5vdyB0byB0aGUgdXBkYXRlIHRoYXQgbWF5IHJlcXVpcmUgbW9yZSByb29tIGluIHRoZSBuYW1lIHNwYWNlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CaXRtYXBJbmRleC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQml0bWFwSW5kZXguamF2YQppbmRleCBmYzM1NGRiLi45ZjY0ZjM1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CaXRtYXBJbmRleC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JpdG1hcEluZGV4LmphdmEKQEAgLTEyMSwxOSArMTIxLDYgQEAgcHVibGljIGludGVyZmFjZSBCaXRtYXAgZXh0ZW5kcyBJdGVyYWJsZTxCaXRtYXBPYmplY3Q+IHsKIAkgKiByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgYnVpbGRlci4KIAkgKi8KIAlwdWJsaWMgaW50ZXJmYWNlIEJpdG1hcEJ1aWxkZXIgZXh0ZW5kcyBCaXRtYXAgewotCQkvKioKLQkJICogQWRkcyB0aGUgaWQgYW5kIHRoZSBleGlzdGluZyBiaXRtYXAgZm9yIHRoZSBpZCwgaWYgb25lIGV4aXN0cywgdG8gdGhlCi0JCSAqIGJpdG1hcC4KLQkJICoKLQkJICogQHBhcmFtIG9iamVjdElkCi0JCSAqICAgICAgICAgICAgdGhlIG9iamVjdCBJRAotCQkgKiBAcGFyYW0gdHlwZQotCQkgKiAgICAgICAgICAgIHRoZSBHaXQgb2JqZWN0IHR5cGUuIFNlZSB7QGxpbmsgQ29uc3RhbnRzfS4KLQkJICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSB3YXMgbm90IGNvbnRhaW5lZCBvciBhYmxlIHRvIGJlIGxvYWRlZC4KLQkJICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjb3J9IG9yIHtAbGluayAjYWRkT2JqZWN0fSBpbnN0ZWFkLgotCQkgKi8KLQkJQERlcHJlY2F0ZWQKLQkJYm9vbGVhbiBhZGQoQW55T2JqZWN0SWQgb2JqZWN0SWQsIGludCB0eXBlKTsKIAogCQkvKioKIAkJICogV2hldGhlciB0aGUgYml0bWFwIGhhcyB0aGUgaWQgc2V0LgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQmxvYkJhc2VkQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CbG9iQmFzZWRDb25maWcuamF2YQppbmRleCAzZmY5MmRjLi5lMDA4YmUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CbG9iQmFzZWRDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9CbG9iQmFzZWRDb25maWcuamF2YQpAQCAtNDUsNiArNDUsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOworCiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKQEAgLTc2LDEzICs3OCwxMiBAQCBwdWJsaWMgY2xhc3MgQmxvYkJhc2VkQ29uZmlnIGV4dGVuZHMgQ29uZmlnIHsKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbmZpZ0ludmFsaWRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBpcyBub3QgYSB2YWxpZCBjb25maWd1cmF0aW9uIGZvcm1hdC4KIAkgKi8KLQlwdWJsaWMgQmxvYkJhc2VkQ29uZmlnKENvbmZpZyBiYXNlLCBmaW5hbCBieXRlW10gYmxvYikKKwlwdWJsaWMgQmxvYkJhc2VkQ29uZmlnKENvbmZpZyBiYXNlLCBieXRlW10gYmxvYikKIAkJCXRocm93cyBDb25maWdJbnZhbGlkRXhjZXB0aW9uIHsKIAkJc3VwZXIoYmFzZSk7CiAJCWZpbmFsIFN0cmluZyBkZWNvZGVkOwogCQlpZiAoaXNVdGY4KGJsb2IpKSB7Ci0JCQlkZWNvZGVkID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoUmF3UGFyc2VVdGlscy5VVEY4X0NIQVJTRVQsCi0JCQkJCWJsb2IsIDMsIGJsb2IubGVuZ3RoKTsKKwkJCWRlY29kZWQgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShDSEFSU0VULCBibG9iLCAzLCBibG9iLmxlbmd0aCk7CiAJCX0gZWxzZSB7CiAJCQlkZWNvZGVkID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoYmxvYik7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0JyYW5jaENvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnLmphdmEKaW5kZXggNTk2ZGEwMy4uYmU1M2M0YiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQnJhbmNoQ29uZmlnLmphdmEKQEAgLTEwNyw3ICsxMDcsNyBAQCBwdWJsaWMgYm9vbGVhbiBtYXRjaENvbmZpZ1ZhbHVlKFN0cmluZyBzKSB7CiAJICogQHBhcmFtIGJyYW5jaE5hbWUKIAkgKiAgICAgICAgICAgIHRoZSBzaG9ydCBicmFuY2ggbmFtZSBvZiB0aGUgc2VjdGlvbiB0byByZWFkCiAJICovCi0JcHVibGljIEJyYW5jaENvbmZpZyhmaW5hbCBDb25maWcgY29uZmlnLCBTdHJpbmcgYnJhbmNoTmFtZSkgeworCXB1YmxpYyBCcmFuY2hDb25maWcoQ29uZmlnIGNvbmZpZywgU3RyaW5nIGJyYW5jaE5hbWUpIHsKIAkJdGhpcy5jb25maWcgPSBjb25maWc7CiAJCXRoaXMuYnJhbmNoTmFtZSA9IGJyYW5jaE5hbWU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0QnVpbGRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29tbWl0QnVpbGRlci5qYXZhCmluZGV4IDIyMTdmZGUuLjU5YTEzZjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbW1pdEJ1aWxkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db21taXRCdWlsZGVyLmphdmEKQEAgLTI0Myw3ICsyNDMsNyBAQCBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CiAJICogQHBhcmFtIG5ld01lc3NhZ2UKIAkgKiAgICAgICAgICAgIHRoZSBjb21taXQgbWVzc2FnZS4gU2hvdWxkIG5vdCBiZSBudWxsLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE1lc3NhZ2UoZmluYWwgU3RyaW5nIG5ld01lc3NhZ2UpIHsKKwlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBuZXdNZXNzYWdlKSB7CiAJCW1lc3NhZ2UgPSBuZXdNZXNzYWdlOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWcuamF2YQppbmRleCA0ZDU1OGM5Li4wZTAxY2NhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWcuamF2YQpAQCAtNTEsNiArNTEsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSU0VUOworCiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CkBAIC0zNzQsNyArMzc2LDcgQEAgcHVibGljIDxUIGV4dGVuZHMgRW51bTw/Pj4gVCBnZXRFbnVtKGZpbmFsIFN0cmluZyBzZWN0aW9uLAogCX0KIAogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIDxUPiBUW10gYWxsVmFsdWVzT2YoZmluYWwgVCB2YWx1ZSkgeworCXByaXZhdGUgc3RhdGljIDxUPiBUW10gYWxsVmFsdWVzT2YoVCB2YWx1ZSkgewogCQl0cnkgewogCQkJcmV0dXJuIChUW10pIHZhbHVlLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJ2YWx1ZXMiKS5pbnZva2UobnVsbCk7IC8vJE5PTi1OTFMtMSQKIAkJfSBjYXRjaCAoRXhjZXB0aW9uIGVycikgewpAQCAtNTEzLDcgKzUxNSw3IEBAIHB1YmxpYyBMaXN0PFJlZlNwZWM+IGdldFJlZlNwZWNzKFN0cmluZyBzZWN0aW9uLCBTdHJpbmcgc3Vic2VjdGlvbiwKIAkgKiAgICAgICAgIG9yZGVyIHRoZXkgYXJlIGRlY2xhcmVkIGJ5IHRoZSBjb25maWd1cmF0aW9uIHN0YXJ0aW5nIGZyb20gdGhpcwogCSAqICAgICAgICAgaW5zdGFuY2UgYW5kIHByb2dyZXNzaW5nIHRocm91Z2ggdGhlIGJhc2UuCiAJICovCi0JcHVibGljIFNldDxTdHJpbmc+IGdldFN1YnNlY3Rpb25zKGZpbmFsIFN0cmluZyBzZWN0aW9uKSB7CisJcHVibGljIFNldDxTdHJpbmc+IGdldFN1YnNlY3Rpb25zKFN0cmluZyBzZWN0aW9uKSB7CiAJCXJldHVybiBnZXRTdGF0ZSgpLmdldFN1YnNlY3Rpb25zKHNlY3Rpb24pOwogCX0KIApAQCAtNTk5LDcgKzYwMSw3IEBAIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXROYW1lcyhTdHJpbmcgc2VjdGlvbiwgU3RyaW5nIHN1YnNlY3Rpb24sCiAJICogQHJldHVybiB0aGUgcGFyc2VkIG9iamVjdCBpbnN0YW5jZSwgd2hpY2ggaXMgY2FjaGVkIGluc2lkZSB0aGlzIGNvbmZpZy4KIAkgKi8KIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgPFQ+IFQgZ2V0KGZpbmFsIFNlY3Rpb25QYXJzZXI8VD4gcGFyc2VyKSB7CisJcHVibGljIDxUPiBUIGdldChTZWN0aW9uUGFyc2VyPFQ+IHBhcnNlcikgewogCQlmaW5hbCBDb25maWdTbmFwc2hvdCBteVN0YXRlID0gZ2V0U3RhdGUoKTsKIAkJVCBvYmogPSAoVCkgbXlTdGF0ZS5jYWNoZS5nZXQocGFyc2VyKTsKIAkJaWYgKG9iaiA9PSBudWxsKSB7CkBAIC02MTksNyArNjIxLDcgQEAgcHVibGljIDxUPiBUIGdldChmaW5hbCBTZWN0aW9uUGFyc2VyPFQ+IHBhcnNlcikgewogCSAqICAgICAgICAgICAgcGFyc2VyIHVzZWQgdG8gb2J0YWluIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdC4KIAkgKiBAc2VlICNnZXQoU2VjdGlvblBhcnNlcikKIAkgKi8KLQlwdWJsaWMgdm9pZCB1bmNhY2hlKGZpbmFsIFNlY3Rpb25QYXJzZXI8Pz4gcGFyc2VyKSB7CisJcHVibGljIHZvaWQgdW5jYWNoZShTZWN0aW9uUGFyc2VyPD8+IHBhcnNlcikgewogCQlzdGF0ZS5nZXQoKS5jYWNoZS5yZW1vdmUocGFyc2VyKTsKIAl9CiAKQEAgLTEwMDgsNyArMTAxMCw3IEBAIHByaXZhdGUgc3RhdGljIGludCBmaW5kU2VjdGlvbkVuZChmaW5hbCBMaXN0PENvbmZpZ0xpbmU+IGVudHJpZXMsCiAJICovCiAJcHVibGljIFN0cmluZyB0b1RleHQoKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgb3V0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLQkJZm9yIChmaW5hbCBDb25maWdMaW5lIGUgOiBzdGF0ZS5nZXQoKS5lbnRyeUxpc3QpIHsKKwkJZm9yIChDb25maWdMaW5lIGUgOiBzdGF0ZS5nZXQoKS5lbnRyeUxpc3QpIHsKIAkJCWlmIChlLnByZWZpeCAhPSBudWxsKQogCQkJCW91dC5hcHBlbmQoZS5wcmVmaXgpOwogCQkJaWYgKGUuc2VjdGlvbiAhPSBudWxsICYmIGUubmFtZSA9PSBudWxsKSB7CkBAIC0xMDU3LDExICsxMDU5LDExIEBAIHB1YmxpYyBTdHJpbmcgdG9UZXh0KCkgewogCSAqICAgICAgICAgICAgIHRoZSB0ZXh0IHN1cHBsaWVkIGlzIG5vdCBmb3JtYXR0ZWQgY29ycmVjdGx5LiBObyBjaGFuZ2VzIHdlcmUKIAkgKiAgICAgICAgICAgICBtYWRlIHRvIHtAY29kZSB0aGlzfS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tVGV4dChmaW5hbCBTdHJpbmcgdGV4dCkgdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGZyb21UZXh0KFN0cmluZyB0ZXh0KSB0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCXN0YXRlLnNldChuZXdTdGF0ZShmcm9tVGV4dFJlY3Vyc2UodGV4dCwgMSkpKTsKIAl9CiAKLQlwcml2YXRlIExpc3Q8Q29uZmlnTGluZT4gZnJvbVRleHRSZWN1cnNlKGZpbmFsIFN0cmluZyB0ZXh0LCBpbnQgZGVwdGgpCisJcHJpdmF0ZSBMaXN0PENvbmZpZ0xpbmU+IGZyb21UZXh0UmVjdXJzZShTdHJpbmcgdGV4dCwgaW50IGRlcHRoKQogCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlpZiAoZGVwdGggPiBNQVhfREVQVEgpIHsKIAkJCXRocm93IG5ldyBDb25maWdJbnZhbGlkRXhjZXB0aW9uKApAQCAtMTE2Niw4ICsxMTY4LDcgQEAgcHJpdmF0ZSB2b2lkIGFkZEluY2x1ZGVkQ29uZmlnKGZpbmFsIExpc3Q8Q29uZmlnTGluZT4gbmV3RW50cmllcywKIAogCQlTdHJpbmcgZGVjb2RlZDsKIAkJaWYgKGlzVXRmOChieXRlcykpIHsKLQkJCWRlY29kZWQgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShSYXdQYXJzZVV0aWxzLlVURjhfQ0hBUlNFVCwgYnl0ZXMsIDMsCi0JCQkJCWJ5dGVzLmxlbmd0aCk7CisJCQlkZWNvZGVkID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ0hBUlNFVCwgYnl0ZXMsIDMsIGJ5dGVzLmxlbmd0aCk7CiAJCX0gZWxzZSB7CiAJCQlkZWNvZGVkID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoYnl0ZXMpOwogCQl9CkBAIC0xMTg0LDcgKzExODUsNyBAQCBwcml2YXRlIENvbmZpZ1NuYXBzaG90IG5ld1N0YXRlKCkgewogCQkJCWdldEJhc2VTdGF0ZSgpKTsKIAl9CiAKLQlwcml2YXRlIENvbmZpZ1NuYXBzaG90IG5ld1N0YXRlKGZpbmFsIExpc3Q8Q29uZmlnTGluZT4gZW50cmllcykgeworCXByaXZhdGUgQ29uZmlnU25hcHNob3QgbmV3U3RhdGUoTGlzdDxDb25maWdMaW5lPiBlbnRyaWVzKSB7CiAJCXJldHVybiBuZXcgQ29uZmlnU25hcHNob3QoQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChlbnRyaWVzKSwKIAkJCQlnZXRCYXNlU3RhdGUoKSk7CiAJfQpAQCAtMTIwOSw3ICsxMjEwLDcgQEAgcHJvdGVjdGVkIGJvb2xlYW4gaXNVdGY4KGZpbmFsIGJ5dGVbXSBieXRlcykgewogCQkJCSYmIGJ5dGVzWzFdID09IChieXRlKSAweEJCICYmIGJ5dGVzWzJdID09IChieXRlKSAweEJGOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkU2VjdGlvbk5hbWUoZmluYWwgU3RyaW5nUmVhZGVyIGluKQorCXByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkU2VjdGlvbk5hbWUoU3RyaW5nUmVhZGVyIGluKQogCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIG5hbWUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlmb3IgKDs7KSB7CkBAIC0xMjQ4LDcgKzEyNDksNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZFNlY3Rpb25OYW1lKGZpbmFsIFN0cmluZ1JlYWRlciBpbikKIAkJcmV0dXJuIG5hbWUudG9TdHJpbmcoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZEtleU5hbWUoZmluYWwgU3RyaW5nUmVhZGVyIGluKQorCXByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkS2V5TmFtZShTdHJpbmdSZWFkZXIgaW4pCiAJCQl0aHJvd3MgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgbmFtZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWZvciAoOzspIHsKQEAgLTEzMzUsNyArMTMzNiw3IEBAIHByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkU3Vic2VjdGlvbk5hbWUoU3RyaW5nUmVhZGVyIGluKQogCQlyZXR1cm4gci50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkVmFsdWUoZmluYWwgU3RyaW5nUmVhZGVyIGluKQorCXByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkVmFsdWUoU3RyaW5nUmVhZGVyIGluKQogCQkJdGhyb3dzIENvbmZpZ0ludmFsaWRFeGNlcHRpb24gewogCQlTdHJpbmdCdWlsZGVyIHZhbHVlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJU3RyaW5nQnVpbGRlciB0cmFpbGluZ1NwYWNlcyA9IG51bGw7CkBAIC0xNDUxLDcgKzE0NTIsNyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHJpbmdSZWFkZXIgewogCiAJCXByaXZhdGUgaW50IHBvczsKIAotCQlTdHJpbmdSZWFkZXIoZmluYWwgU3RyaW5nIGluKSB7CisJCVN0cmluZ1JlYWRlcihTdHJpbmcgaW4pIHsKIAkJCWJ1ZiA9IGluLnRvQ2hhckFycmF5KCk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnTGluZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uZmlnTGluZS5qYXZhCmluZGV4IGQ1ZjFkOGYuLjkzN2JhOTIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvbmZpZ0xpbmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25maWdMaW5lLmphdmEKQEAgLTczLDcgKzczLDcgQEAgY2xhc3MgQ29uZmlnTGluZSB7CiAJLyoqIFRoZSB0ZXh0IGNvbnRlbnQgYWZ0ZXIgZW50cnkuICovCiAJU3RyaW5nIHN1ZmZpeDsKIAotCUNvbmZpZ0xpbmUgZm9yVmFsdWUoZmluYWwgU3RyaW5nIG5ld1ZhbHVlKSB7CisJQ29uZmlnTGluZSBmb3JWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKIAkJZmluYWwgQ29uZmlnTGluZSBlID0gbmV3IENvbmZpZ0xpbmUoKTsKIAkJZS5wcmVmaXggPSBwcmVmaXg7CiAJCWUuc2VjdGlvbiA9IHNlY3Rpb247CkBAIC05MSwxMiArOTEsMTIgQEAgJiYgZXFTYW1lQ2FzZShzdWJzZWN0aW9uLCBhU3Vic2VjdGlvbikKIAkJCQkmJiBlcUlnbm9yZUNhc2UobmFtZSwgYUtleSk7CiAJfQogCi0JYm9vbGVhbiBtYXRjaChmaW5hbCBTdHJpbmcgYVNlY3Rpb24sIGZpbmFsIFN0cmluZyBhU3Vic2VjdGlvbikgeworCWJvb2xlYW4gbWF0Y2goU3RyaW5nIGFTZWN0aW9uLCBTdHJpbmcgYVN1YnNlY3Rpb24pIHsKIAkJcmV0dXJuIGVxSWdub3JlQ2FzZShzZWN0aW9uLCBhU2VjdGlvbikKIAkJCQkmJiBlcVNhbWVDYXNlKHN1YnNlY3Rpb24sIGFTdWJzZWN0aW9uKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxSWdub3JlQ2FzZShmaW5hbCBTdHJpbmcgYSwgZmluYWwgU3RyaW5nIGIpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxSWdub3JlQ2FzZShTdHJpbmcgYSwgU3RyaW5nIGIpIHsKIAkJaWYgKGEgPT0gbnVsbCAmJiBiID09IG51bGwpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpCkBAIC0xMDQsNyArMTA0LDcgQEAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcUlnbm9yZUNhc2UoZmluYWwgU3RyaW5nIGEsIGZpbmFsIFN0cmluZyBiKSB7CiAJCXJldHVybiBTdHJpbmdVdGlscy5lcXVhbHNJZ25vcmVDYXNlKGEsIGIpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXFTYW1lQ2FzZShmaW5hbCBTdHJpbmcgYSwgZmluYWwgU3RyaW5nIGIpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxU2FtZUNhc2UoU3RyaW5nIGEsIFN0cmluZyBiKSB7CiAJCWlmIChhID09IG51bGwgJiYgYiA9PSBudWxsKQogCQkJcmV0dXJuIHRydWU7CiAJCWlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YQppbmRleCAxMGFiZDllLi45MDIzYmQ4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db25zdGFudHMuamF2YQpAQCAtNDUsNiArNDUsOCBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCitpbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKKwogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKQEAgLTIyNiwxMCArMjI4LDEwIEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBDb25zdGFudHMgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIFBBQ0tfU0lHTkFUVVJFID0geyAnUCcsICdBJywgJ0MnLCAnSycgfTsKIAogCS8qKiBOYXRpdmUgY2hhcmFjdGVyIGVuY29kaW5nIGZvciBjb21taXQgbWVzc2FnZXMsIGZpbGUgbmFtZXMuLi4gKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSQUNURVJfRU5DT0RJTkcgPSAiVVRGLTgiOworCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hhcnNldCBDSEFSU0VUOwogCiAJLyoqIE5hdGl2ZSBjaGFyYWN0ZXIgZW5jb2RpbmcgZm9yIGNvbW1pdCBtZXNzYWdlcywgZmlsZSBuYW1lcy4uLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hhcnNldCBDSEFSU0VUOworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJBQ1RFUl9FTkNPRElORzsKIAogCS8qKiBEZWZhdWx0IG1haW4gYnJhbmNoIG5hbWUgKi8KIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVNURVIgPSAibWFzdGVyIjsKQEAgLTQ3NSw3ICs0NzcsNyBAQCBwdWJsaWMgc3RhdGljIE1lc3NhZ2VEaWdlc3QgbmV3TWVzc2FnZURpZ2VzdCgpIHsKIAkgKiBAcGFyYW0gdHlwZUNvZGUgdGhlIHR5cGUgY29kZSwgZnJvbSBhIHBhY2sgcmVwcmVzZW50YXRpb24uCiAJICogQHJldHVybiB0aGUgY2Fub25pY2FsIHN0cmluZyBuYW1lIG9mIHRoaXMgdHlwZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0eXBlU3RyaW5nKGZpbmFsIGludCB0eXBlQ29kZSkgeworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHR5cGVTdHJpbmcoaW50IHR5cGVDb2RlKSB7CiAJCXN3aXRjaCAodHlwZUNvZGUpIHsKIAkJY2FzZSBPQkpfQ09NTUlUOgogCQkJcmV0dXJuIFRZUEVfQ09NTUlUOwpAQCAtNTAwLDcgKzUwMiw3IEBAIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHR5cGVTdHJpbmcoZmluYWwgaW50IHR5cGVDb2RlKSB7CiAJICogQHBhcmFtIHR5cGVDb2RlIHRoZSB0eXBlIGNvZGUsIGZyb20gYSBwYWNrIHJlcHJlc2VudGF0aW9uLgogCSAqIEByZXR1cm4gdGhlIGNhbm9uaWNhbCBBU0NJSSBlbmNvZGVkIG5hbWUgb2YgdGhpcyB0eXBlLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZWRUeXBlU3RyaW5nKGZpbmFsIGludCB0eXBlQ29kZSkgeworCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZWRUeXBlU3RyaW5nKGludCB0eXBlQ29kZSkgewogCQlzd2l0Y2ggKHR5cGVDb2RlKSB7CiAJCWNhc2UgT0JKX0NPTU1JVDoKIAkJCXJldHVybiBFTkNPREVEX1RZUEVfQ09NTUlUOwpAQCAtNTk5LDcgKzYwMSw3IEBAIHB1YmxpYyBzdGF0aWMgaW50IGRlY29kZVR5cGVTdHJpbmcoZmluYWwgQW55T2JqZWN0SWQgaWQsCiAJICogQHJldHVybiBhIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlucHV0IGludGVnZXIuIFRoZSByZXR1cm5lZCBhcnJheQogCSAqICAgICAgICAgaXMgdGhlIHNtYWxsZXN0IGFycmF5IHRoYXQgd2lsbCBob2xkIHRoZSB2YWx1ZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVBU0NJSShmaW5hbCBsb25nIHMpIHsKKwlwdWJsaWMgc3RhdGljIGJ5dGVbXSBlbmNvZGVBU0NJSShsb25nIHMpIHsKIAkJcmV0dXJuIGVuY29kZUFTQ0lJKExvbmcudG9TdHJpbmcocykpOwogCX0KIApAQCAtNjE1LDcgKzYxNyw3IEBAIHB1YmxpYyBzdGF0aWMgaW50IGRlY29kZVR5cGVTdHJpbmcoZmluYWwgQW55T2JqZWN0SWQgaWQsCiAJICogICAgICAgICAgICAgdGhlIGlucHV0IHN0cmluZyBjb250YWlucyBvbmUgb3IgbW9yZSBjaGFyYWN0ZXJzIG91dHNpZGUgb2YKIAkgKiAgICAgICAgICAgICB0aGUgNy1iaXQgQVNDSUkgY2hhcmFjdGVyIHNwYWNlLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZUFTQ0lJKGZpbmFsIFN0cmluZyBzKSB7CisJcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlQVNDSUkoU3RyaW5nIHMpIHsKIAkJZmluYWwgYnl0ZVtdIHIgPSBuZXcgYnl0ZVtzLmxlbmd0aCgpXTsKIAkJZm9yIChpbnQgayA9IHIubGVuZ3RoIC0gMTsgayA+PSAwOyBrLS0pIHsKIAkJCWZpbmFsIGNoYXIgYyA9IHMuY2hhckF0KGspOwpAQCAtNjM1LDcgKzYzNyw3IEBAIHB1YmxpYyBzdGF0aWMgaW50IGRlY29kZVR5cGVTdHJpbmcoZmluYWwgQW55T2JqZWN0SWQgaWQsCiAJICogICAgICAgICBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZyAoVVRGLTgpLgogCSAqIEBzZWUgI0NIQVJBQ1RFUl9FTkNPRElORwogCSAqLwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGVuY29kZShmaW5hbCBTdHJpbmcgc3RyKSB7CisJcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlKFN0cmluZyBzdHIpIHsKIAkJZmluYWwgQnl0ZUJ1ZmZlciBiYiA9IENvbnN0YW50cy5DSEFSU0VULmVuY29kZShzdHIpOwogCQlmaW5hbCBpbnQgbGVuID0gYmIubGltaXQoKTsKIAkJaWYgKGJiLmhhc0FycmF5KCkgJiYgYmIuYXJyYXlPZmZzZXQoKSA9PSAwKSB7CkBAIC02NTIsNyArNjU0LDggQEAgcHVibGljIHN0YXRpYyBpbnQgZGVjb2RlVHlwZVN0cmluZyhmaW5hbCBBbnlPYmplY3RJZCBpZCwKIAlzdGF0aWMgewogCQlpZiAoT0JKRUNUX0lEX0xFTkdUSCAhPSBuZXdNZXNzYWdlRGlnZXN0KCkuZ2V0RGlnZXN0TGVuZ3RoKCkpCiAJCQl0aHJvdyBuZXcgTGlua2FnZUVycm9yKEpHaXRUZXh0LmdldCgpLmluY29ycmVjdE9CSkVDVF9JRF9MRU5HVEgpOwotCQlDSEFSU0VUID0gQ2hhcnNldC5mb3JOYW1lKENIQVJBQ1RFUl9FTkNPRElORyk7CisJCUNIQVJTRVQgPSBVVEZfODsKKwkJQ0hBUkFDVEVSX0VOQ09ESU5HID0gQ0hBUlNFVC5uYW1lKCk7CiAJfQogCiAJLyoqIG5hbWUgb2YgdGhlIGZpbGUgY29udGFpbmluZyB0aGUgY29tbWl0IG1zZyBmb3IgYSBtZXJnZSBjb21taXQgKi8KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvcmVDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0NvcmVDb25maWcuamF2YQppbmRleCAzMmE4OTRmLi45OGRlM2E5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Db3JlQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvQ29yZUNvbmZpZy5qYXZhCkBAIC0xNjYsNyArMTY2LDcgQEAgcHVibGljIHN0YXRpYyBlbnVtIEhpZGVEb3RGaWxlcyB7CiAJCURPVEdJVE9OTFkKIAl9CiAKLQlwcml2YXRlIENvcmVDb25maWcoZmluYWwgQ29uZmlnIHJjKSB7CisJcHJpdmF0ZSBDb3JlQ29uZmlnKENvbmZpZyByYykgewogCQljb21wcmVzc2lvbiA9IHJjLmdldEludChDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwKIAkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9DT01QUkVTU0lPTiwgREVGQVVMVF9DT01QUkVTU0lPTik7CiAJCXBhY2tJbmRleFZlcnNpb24gPSByYy5nZXRJbnQoQ29uZmlnQ29uc3RhbnRzLkNPTkZJR19QQUNLX1NFQ1RJT04sCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9EZWZhdWx0VHlwZWRDb25maWdHZXR0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0RlZmF1bHRUeXBlZENvbmZpZ0dldHRlci5qYXZhCmluZGV4IDY4Zjg4MWQuLjg5MWM3ZjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0RlZmF1bHRUeXBlZENvbmZpZ0dldHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0RlZmF1bHRUeXBlZENvbmZpZ0dldHRlci5qYXZhCkBAIC0yNzAsOCArMjcwLDggQEAgcHVibGljIGxvbmcgZ2V0VGltZVVuaXQoQ29uZmlnIGNvbmZpZywgU3RyaW5nIHNlY3Rpb24sIFN0cmluZyBzdWJzZWN0aW9uLAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXRjaChmaW5hbCBTdHJpbmcgYSwgZmluYWwgU3RyaW5nLi4uIGNhc2VzKSB7Ci0JCWZvciAoZmluYWwgU3RyaW5nIGIgOiBjYXNlcykgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbWF0Y2goU3RyaW5nIGEsIFN0cmluZy4uLiBjYXNlcykgeworCQlmb3IgKFN0cmluZyBiIDogY2FzZXMpIHsKIAkJCWlmIChiICE9IG51bGwgJiYgYi5lcXVhbHNJZ25vcmVDYXNlKGEpKSB7CiAJCQkJcmV0dXJuIHRydWU7CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9GaWxlTW9kZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvRmlsZU1vZGUuamF2YQppbmRleCA3ODUyMzcxLi5kNGM0ZDViIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9GaWxlTW9kZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0ZpbGVNb2RlLmphdmEKQEAgLTg4LDcgKzg4LDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIEZpbGVNb2RlIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVNb2RlIFRSRUUgPSBuZXcgRmlsZU1vZGUoVFlQRV9UUkVFLAogCQkJQ29uc3RhbnRzLk9CSl9UUkVFKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IG1vZGVCaXRzKSB7CisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhpbnQgbW9kZUJpdHMpIHsKIAkJCXJldHVybiAobW9kZUJpdHMgJiBUWVBFX01BU0spID09IFRZUEVfVFJFRTsKIAkJfQogCX07CkBAIC05Nyw3ICs5Nyw3IEBAIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBpbnQgbW9kZUJpdHMpIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVNb2RlIFNZTUxJTksgPSBuZXcgRmlsZU1vZGUoVFlQRV9TWU1MSU5LLAogCQkJQ29uc3RhbnRzLk9CSl9CTE9CKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IG1vZGVCaXRzKSB7CisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhpbnQgbW9kZUJpdHMpIHsKIAkJCXJldHVybiAobW9kZUJpdHMgJiBUWVBFX01BU0spID09IFRZUEVfU1lNTElOSzsKIAkJfQogCX07CkBAIC0xMDYsNyArMTA2LDcgQEAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZU1vZGUgUkVHVUxBUl9GSUxFID0gbmV3IEZpbGVNb2RlKDAxMDA2NDQsCiAJCQlDb25zdGFudHMuT0JKX0JMT0IpIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBpbnQgbW9kZUJpdHMpIHsKKwkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGludCBtb2RlQml0cykgewogCQkJcmV0dXJuIChtb2RlQml0cyAmIFRZUEVfTUFTSykgPT0gVFlQRV9GSUxFICYmIChtb2RlQml0cyAmIDAxMTEpID09IDA7CiAJCX0KIAl9OwpAQCAtMTE1LDcgKzExNSw3IEBAIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBpbnQgbW9kZUJpdHMpIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVNb2RlIEVYRUNVVEFCTEVfRklMRSA9IG5ldyBGaWxlTW9kZSgwMTAwNzU1LAogCQkJQ29uc3RhbnRzLk9CSl9CTE9CKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IG1vZGVCaXRzKSB7CisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhpbnQgbW9kZUJpdHMpIHsKIAkJCXJldHVybiAobW9kZUJpdHMgJiBUWVBFX01BU0spID09IFRZUEVfRklMRSAmJiAobW9kZUJpdHMgJiAwMTExKSAhPSAwOwogCQl9CiAJfTsKQEAgLTEyNCw3ICsxMjQsNyBAQCBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IG1vZGVCaXRzKSB7CiAJcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTW9kZSBHSVRMSU5LID0gbmV3IEZpbGVNb2RlKFRZUEVfR0lUTElOSywKIAkJCUNvbnN0YW50cy5PQkpfQ09NTUlUKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IG1vZGVCaXRzKSB7CisJCXB1YmxpYyBib29sZWFuIGVxdWFscyhpbnQgbW9kZUJpdHMpIHsKIAkJCXJldHVybiAobW9kZUJpdHMgJiBUWVBFX01BU0spID09IFRZUEVfR0lUTElOSzsKIAkJfQogCX07CkBAIC0xMzMsNyArMTMzLDcgQEAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZU1vZGUgTUlTU0lORyA9IG5ldyBGaWxlTW9kZShUWVBFX01JU1NJTkcsCiAJCQlDb25zdGFudHMuT0JKX0JBRCkgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgeworCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoaW50IG1vZGVCaXRzKSB7CiAJCQlyZXR1cm4gbW9kZUJpdHMgPT0gMDsKIAkJfQogCX07CkBAIC0xNDUsNyArMTQ1LDcgQEAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGludCBtb2RlQml0cykgewogCSAqICAgICAgICAgICAgdGhlIG1vZGUgYml0cyB0aGUgY2FsbGVyIGhhcyBzb21laG93IG9idGFpbmVkLgogCSAqIEByZXR1cm4gdGhlIEZpbGVNb2RlIGluc3RhbmNlIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gYml0cy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEZpbGVNb2RlIGZyb21CaXRzKGZpbmFsIGludCBiaXRzKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBGaWxlTW9kZSBmcm9tQml0cyhpbnQgYml0cykgewogCQlzd2l0Y2ggKGJpdHMgJiBUWVBFX01BU0spIHsKIAkJY2FzZSBUWVBFX01JU1NJTkc6CiAJCQlpZiAoYml0cyA9PSAwKQpAQCAtMTY1LDcgKzE2NSw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgRmlsZU1vZGUgZnJvbUJpdHMoZmluYWwgaW50IGJpdHMpIHsKIAogCQlyZXR1cm4gbmV3IEZpbGVNb2RlKGJpdHMsIENvbnN0YW50cy5PQkpfQkFEKSB7CiAJCQlAT3ZlcnJpZGUKLQkJCXB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBpbnQgYSkgeworCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKGludCBhKSB7CiAJCQkJcmV0dXJuIGJpdHMgPT0gYTsKIAkJCX0KIAkJfTsKQEAgLTE3Nyw3ICsxNzcsNyBAQCBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IGEpIHsKIAogCXByaXZhdGUgZmluYWwgaW50IG9iamVjdFR5cGU7CiAKLQlwcml2YXRlIEZpbGVNb2RlKGludCBtb2RlLCBmaW5hbCBpbnQgZXhwVHlwZSkgeworCXByaXZhdGUgRmlsZU1vZGUoaW50IG1vZGUsIGludCBleHBUeXBlKSB7CiAJCW1vZGVCaXRzID0gbW9kZTsKIAkJb2JqZWN0VHlwZSA9IGV4cFR5cGU7CiAJCWlmIChtb2RlICE9IDApIHsKQEAgLTIwNiw3ICsyMDYsNyBAQCBwcml2YXRlIEZpbGVNb2RlKGludCBtb2RlLCBmaW5hbCBpbnQgZXhwVHlwZSkgewogCSAqICAgICAgICAgICAgYSBpbnQuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBtb2RlIGJpdHMgcmVwcmVzZW50IHRoZSBzYW1lIG1vZGUgYXMgdGhpcyBvYmplY3QKIAkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlcXVhbHMoZmluYWwgaW50IG1vZGViaXRzKTsKKwlwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBlcXVhbHMoaW50IG1vZGViaXRzKTsKIAogCS8qKgogCSAqIENvcHkgdGhpcyBtb2RlIGFzIGEgc2VxdWVuY2Ugb2Ygb2N0YWwgVVMtQVNDSUkgYnl0ZXMuCkBAIC0yMjIsNyArMjIyLDcgQEAgcHJpdmF0ZSBGaWxlTW9kZShpbnQgbW9kZSwgZmluYWwgaW50IGV4cFR5cGUpIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgc3RyZWFtIGVuY291bnRlcmVkIGFuIGVycm9yIGR1cmluZyB0aGUgY29weS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBjb3B5VG8oZmluYWwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGNvcHlUbyhPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCW9zLndyaXRlKG9jdGFsQnl0ZXMpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5kZXhEaWZmLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmYuamF2YQppbmRleCA4NzA4NmNiLi45NGI5ZGRjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmYuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmRleERpZmYuamF2YQpAQCAtNTQyLDEwICs1NDIsOSBAQCBwdWJsaWMgYm9vbGVhbiBkaWZmKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgZXN0V29ya1RyZWVTaXplLAogCQkJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRJZ25vcmVQYXJhbVN1Ym1vZHVsZSwKIAkJCQkJCQlzbXcuZ2V0UGF0aCgpKSwgZSk7CiAJCQkJfQotCQkJCVJlcG9zaXRvcnkgc3ViUmVwbyA9IHNtdy5nZXRSZXBvc2l0b3J5KCk7Ci0JCQkJaWYgKHN1YlJlcG8gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgc3ViUmVwb1BhdGggPSBzbXcuZ2V0UGF0aCgpOwotCQkJCQl0cnkgeworCQkJCXRyeSAoUmVwb3NpdG9yeSBzdWJSZXBvID0gc213LmdldFJlcG9zaXRvcnkoKSkgeworCQkJCQlpZiAoc3ViUmVwbyAhPSBudWxsKSB7CisJCQkJCQlTdHJpbmcgc3ViUmVwb1BhdGggPSBzbXcuZ2V0UGF0aCgpOwogCQkJCQkJT2JqZWN0SWQgc3ViSGVhZCA9IHN1YlJlcG8ucmVzb2x2ZSgiSEVBRCIpOyAvLyROT04tTkxTLTEkCiAJCQkJCQlpZiAoc3ViSGVhZCAhPSBudWxsCiAJCQkJCQkJCSYmICFzdWJIZWFkLmVxdWFscyhzbXcuZ2V0T2JqZWN0SWQoKSkpIHsKQEAgLTU3NCw4ICs1NzMsNiBAQCBwdWJsaWMgYm9vbGVhbiBkaWZmKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBpbnQgZXN0V29ya1RyZWVTaXplLAogCQkJCQkJCQlyZWNvcmRGaWxlTW9kZShzdWJSZXBvUGF0aCwgRmlsZU1vZGUuR0lUTElOSyk7CiAJCQkJCQkJfQogCQkJCQkJfQotCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJc3ViUmVwby5jbG9zZSgpOwogCQkJCQl9CiAJCQkJfQogCQkJfQpAQCAtNzQ1LDcgKzc0Miw3IEBAIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRVbnRyYWNrZWRGb2xkZXJzKCkgewogCSAqIEBwYXJhbSBwYXRoIGEge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9IG9iamVjdC4KIAkgKiBAcmV0dXJuIGZpbGUgbW9kZQogCSAqLwotCXB1YmxpYyBGaWxlTW9kZSBnZXRJbmRleE1vZGUoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwdWJsaWMgRmlsZU1vZGUgZ2V0SW5kZXhNb2RlKFN0cmluZyBwYXRoKSB7CiAJCWZpbmFsIERpckNhY2hlRW50cnkgZW50cnkgPSBkaXJDYWNoZS5nZXRFbnRyeShwYXRoKTsKIAkJcmV0dXJuIGVudHJ5ICE9IG51bGwgPyBlbnRyeS5nZXRGaWxlTW9kZSgpIDogRmlsZU1vZGUuTUlTU0lORzsKIAl9CkBAIC03NTksNyArNzU2LDcgQEAgcHVibGljIEZpbGVNb2RlIGdldEluZGV4TW9kZShmaW5hbCBTdHJpbmcgcGF0aCkgewogCSAqICAgICAgICAgdGhlIGdpdmVuIGZpbGUgbW9kZQogCSAqIEBzaW5jZSAzLjYKIAkgKi8KLQlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UGF0aHNXaXRoSW5kZXhNb2RlKGZpbmFsIEZpbGVNb2RlIG1vZGUpIHsKKwlwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UGF0aHNXaXRoSW5kZXhNb2RlKEZpbGVNb2RlIG1vZGUpIHsKIAkJU2V0PFN0cmluZz4gcGF0aHMgPSBmaWxlTW9kZXMuZ2V0KG1vZGUpOwogCQlpZiAocGF0aHMgPT0gbnVsbCkKIAkJCXBhdGhzID0gbmV3IEhhc2hTZXQ8PigpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5mbGF0ZXJDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvSW5mbGF0ZXJDYWNoZS5qYXZhCmluZGV4IGE5NzcyMWMuLmRkMGYxOGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL0luZmxhdGVyQ2FjaGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9JbmZsYXRlckNhY2hlLmphdmEKQEAgLTg5LDcgKzg5LDcgQEAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIEluZmxhdGVyIGdldEltcGwoKSB7CiAJICogICAgICAgICAgICB0aGUgaW5mbGF0ZXIgdG8gcmV0dXJuLiBNYXkgYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSB0aGlzIG1ldGhvZAogCSAqICAgICAgICAgICAgZG9lcyBub3RoaW5nLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWxlYXNlKGZpbmFsIEluZmxhdGVyIGkpIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgcmVsZWFzZShJbmZsYXRlciBpKSB7CiAJCWlmIChpICE9IG51bGwpIHsKIAkJCWkucmVzZXQoKTsKIAkJCWlmIChyZWxlYXNlSW1wbChpKSkKQEAgLTk3LDcgKzk3LDcgQEAgcHVibGljIHN0YXRpYyB2b2lkIHJlbGVhc2UoZmluYWwgSW5mbGF0ZXIgaSkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIGJvb2xlYW4gcmVsZWFzZUltcGwoZmluYWwgSW5mbGF0ZXIgaSkgeworCXByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBib29sZWFuIHJlbGVhc2VJbXBsKEluZmxhdGVyIGkpIHsKIAkJaWYgKG9wZW5JbmZsYXRlckNvdW50IDwgU1opIHsKIAkJCWluZmxhdGVyQ2FjaGVbb3BlbkluZmxhdGVyQ291bnQrK10gPSBpOwogCQkJcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvTXV0YWJsZU9iamVjdElkLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9NdXRhYmxlT2JqZWN0SWQuamF2YQppbmRleCBlNDkyYWY5Li44Y2YwZmQwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9NdXRhYmxlT2JqZWN0SWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9NdXRhYmxlT2JqZWN0SWQuamF2YQpAQCAtMTYyLDcgKzE2Miw3IEBAIHB1YmxpYyB2b2lkIGZyb21PYmplY3RJZChBbnlPYmplY3RJZCBzcmMpIHsKIAkgKiAgICAgICAgICAgIHRoZSByYXcgYnl0ZSBidWZmZXIgdG8gcmVhZCBmcm9tLiBBdCBsZWFzdCAyMCBieXRlcyBtdXN0IGJlCiAJICogICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHRoaXMgYnl0ZSBhcnJheS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGJ5dGVbXSBicykgeworCXB1YmxpYyB2b2lkIGZyb21SYXcoYnl0ZVtdIGJzKSB7CiAJCWZyb21SYXcoYnMsIDApOwogCX0KIApAQCAtMTc1LDcgKzE3NSw3IEBAIHB1YmxpYyB2b2lkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzKSB7CiAJICogQHBhcmFtIHAKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGJ5dGUgb2YgZGF0YSBmcm9tLgogCSAqLwotCXB1YmxpYyB2b2lkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyB2b2lkIGZyb21SYXcoYnl0ZVtdIGJzLCBpbnQgcCkgewogCQl3MSA9IE5CLmRlY29kZUludDMyKGJzLCBwKTsKIAkJdzIgPSBOQi5kZWNvZGVJbnQzMihicywgcCArIDQpOwogCQl3MyA9IE5CLmRlY29kZUludDMyKGJzLCBwICsgOCk7CkBAIC0xOTAsNyArMTkwLDcgQEAgcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CiAJICogICAgICAgICAgICB0aGUgcmF3IGludCBidWZmZXIgdG8gcmVhZCBmcm9tLiBBdCBsZWFzdCA1IGludGVnZXJzIG11c3QgYmUKIAkgKiAgICAgICAgICAgIGF2YWlsYWJsZSB3aXRoaW4gdGhpcyBpbnRlZ2VycyBhcnJheS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGludFtdIGludHMpIHsKKwlwdWJsaWMgdm9pZCBmcm9tUmF3KGludFtdIGludHMpIHsKIAkJZnJvbVJhdyhpbnRzLCAwKTsKIAl9CiAKQEAgLTIwMyw3ICsyMDMsNyBAQCBwdWJsaWMgdm9pZCBmcm9tUmF3KGZpbmFsIGludFtdIGludHMpIHsKIAkgKiBAcGFyYW0gcAogCSAqICAgICAgICAgICAgcG9zaXRpb24gdG8gcmVhZCB0aGUgZmlyc3QgaW50ZWdlciBvZiBkYXRhIGZyb20uCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVJhdyhmaW5hbCBpbnRbXSBpbnRzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyB2b2lkIGZyb21SYXcoaW50W10gaW50cywgaW50IHApIHsKIAkJdzEgPSBpbnRzW3BdOwogCQl3MiA9IGludHNbcCArIDFdOwogCQl3MyA9IGludHNbcCArIDJdOwpAQCAtMjQzLDcgKzI0Myw3IEBAIHB1YmxpYyB2b2lkIHNldChpbnQgYSwgaW50IGIsIGludCBjLCBpbnQgZCwgaW50IGUpIHsKIAkgKiBAcGFyYW0gb2Zmc2V0CiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tU3RyaW5nKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBvZmZzZXQpIHsKKwlwdWJsaWMgdm9pZCBmcm9tU3RyaW5nKGJ5dGVbXSBidWYsIGludCBvZmZzZXQpIHsKIAkJZnJvbUhleFN0cmluZyhidWYsIG9mZnNldCk7CiAJfQogCkBAIC0yNTMsMTQgKzI1MywxNCBAQCBwdWJsaWMgdm9pZCBmcm9tU3RyaW5nKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBvZmZzZXQpIHsKIAkgKiBAcGFyYW0gc3RyCiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHJlYWQgZnJvbS4gTXVzdCBiZSA0MCBjaGFyYWN0ZXJzIGxvbmcuCiAJICovCi0JcHVibGljIHZvaWQgZnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgc3RyKSB7CisJcHVibGljIHZvaWQgZnJvbVN0cmluZyhTdHJpbmcgc3RyKSB7CiAJCWlmIChzdHIubGVuZ3RoKCkgIT0gQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkuaW52YWxpZElkLCBzdHIpKTsKIAkJZnJvbUhleFN0cmluZyhDb25zdGFudHMuZW5jb2RlQVNDSUkoc3RyKSwgMCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGZyb21IZXhTdHJpbmcoZmluYWwgYnl0ZVtdIGJzLCBpbnQgcCkgeworCXByaXZhdGUgdm9pZCBmcm9tSGV4U3RyaW5nKGJ5dGVbXSBicywgaW50IHApIHsKIAkJdHJ5IHsKIAkJCXcxID0gUmF3UGFyc2VVdGlscy5wYXJzZUhleEludDMyKGJzLCBwKTsKIAkJCXcyID0gUmF3UGFyc2VVdGlscy5wYXJzZUhleEludDMyKGJzLCBwICsgOCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RDaGVja2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RDaGVja2VyLmphdmEKaW5kZXggNWMxNDc1NC4uZDM3ZmIyMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0Q2hlY2tlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdENoZWNrZXIuamF2YQpAQCAtMTIzMCw3ICsxMjMwLDcgQEAgcHVibGljIEJsb2JPYmplY3RDaGVja2VyIG5ld0Jsb2JPYmplY3RDaGVja2VyKCkgewogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29ycnVwdE9iamVjdEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGlmIGFueSBlcnJvciB3YXMgZGV0ZWN0ZWQuCiAJICovCi0JcHVibGljIHZvaWQgY2hlY2tCbG9iKGZpbmFsIGJ5dGVbXSByYXcpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjaGVja0Jsb2IoYnl0ZVtdIHJhdykgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQkvLyBXZSBjYW4gYWx3YXlzIGFzc3VtZSB0aGUgYmxvYiBpcyB2YWxpZC4KIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdERhdGFiYXNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3REYXRhYmFzZS5qYXZhCmluZGV4IGJiZWY1MWQuLjkzYWRkNWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdERhdGFiYXNlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0RGF0YWJhc2UuamF2YQpAQCAtMTIxLDggKzEyMSw4IEBAIHB1YmxpYyB2b2lkIGNyZWF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIG9iamVjdCBzdG9yZSBjYW5ub3QgYmUgYWNjZXNzZWQuCiAJICovCi0JcHVibGljIGJvb2xlYW4gaGFzKGZpbmFsIEFueU9iamVjdElkIG9iamVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIE9iamVjdFJlYWRlciBvciA9IG5ld1JlYWRlcigpKSB7CisJcHVibGljIGJvb2xlYW4gaGFzKEFueU9iamVjdElkIG9iamVjdElkKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl0cnkgKE9iamVjdFJlYWRlciBvciA9IG5ld1JlYWRlcigpKSB7CiAJCQlyZXR1cm4gb3IuaGFzKG9iamVjdElkKTsKIAkJfQogCX0KQEAgLTE0MSw3ICsxNDEsNyBAQCBwdWJsaWMgYm9vbGVhbiBoYXMoZmluYWwgQW55T2JqZWN0SWQgb2JqZWN0SWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIG9iamVjdCBzdG9yZSBjYW5ub3QgYmUgYWNjZXNzZWQuCiAJICovCi0JcHVibGljIE9iamVjdExvYWRlciBvcGVuKGZpbmFsIEFueU9iamVjdElkIG9iamVjdElkKQorCXB1YmxpYyBPYmplY3RMb2FkZXIgb3BlbihBbnlPYmplY3RJZCBvYmplY3RJZCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBvcGVuKG9iamVjdElkLCBPYmplY3RSZWFkZXIuT0JKX0FOWSk7CiAJfQpAQCAtMTcyLDcgKzE3Miw3IEBAIHB1YmxpYyBPYmplY3RMb2FkZXIgb3BlbihmaW5hbCBBbnlPYmplY3RJZCBvYmplY3RJZCkKIAlwdWJsaWMgT2JqZWN0TG9hZGVyIG9wZW4oQW55T2JqZWN0SWQgb2JqZWN0SWQsIGludCB0eXBlSGludCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewotCQl0cnkgKGZpbmFsIE9iamVjdFJlYWRlciBvciA9IG5ld1JlYWRlcigpKSB7CisJCXRyeSAoT2JqZWN0UmVhZGVyIG9yID0gbmV3UmVhZGVyKCkpIHsKIAkJCXJldHVybiBvci5vcGVuKG9iamVjdElkLCB0eXBlSGludCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWQuamF2YQppbmRleCAwZTg1NTQ1Li43NjRmODkwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdElkLmphdmEKQEAgLTg2LDcgKzg2LDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCB6ZXJvSWQoKSB7CiAJICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIHRlc3QuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJpbmcgY2FuIGNvbnZlcnRlZCBpbnRvIGFuIE9iamVjdElkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0lkKGZpbmFsIFN0cmluZyBpZCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0lkKFN0cmluZyBpZCkgewogCQlpZiAoaWQubGVuZ3RoKCkgIT0gQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIKQogCQkJcmV0dXJuIGZhbHNlOwogCQl0cnkgewpAQCAtMTA2LDcgKzEwNiw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBpc0lkKGZpbmFsIFN0cmluZyBpZCkgewogCSAqICAgICAgICAgICAgdGhlIGlkIHRvIGNvbnZlcnQuIE1heSBiZSBudWxsLgogCSAqIEByZXR1cm4gdGhlIGhleCBzdHJpbmcgY29udmVyc2lvbiBvZiB0aGlzIGlkJ3MgY29udGVudC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyB0b1N0cmluZyhmaW5hbCBPYmplY3RJZCBpKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoT2JqZWN0SWQgaSkgewogCQlyZXR1cm4gaSAhPSBudWxsID8gaS5uYW1lKCkgOiBaRVJPSURfU1RSOwogCX0KIApAQCAtMTU3LDcgKzE1Nyw3IEBAIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgYnl0ZVtdIGZpcnN0QnVmZmVyLCBmaW5hbCBpbnQgZmksCiAJICogICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHRoaXMgYnl0ZSBhcnJheS4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoYnl0ZVtdIGJzKSB7CiAJCXJldHVybiBmcm9tUmF3KGJzLCAwKTsKIAl9CiAKQEAgLTE3MSw3ICsxNzEsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoZmluYWwgYnl0ZVtdIGJzKSB7CiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBieXRlIG9mIGRhdGEgZnJvbS4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tUmF3KGJ5dGVbXSBicywgaW50IHApIHsKIAkJZmluYWwgaW50IGEgPSBOQi5kZWNvZGVJbnQzMihicywgcCk7CiAJCWZpbmFsIGludCBiID0gTkIuZGVjb2RlSW50MzIoYnMsIHAgKyA0KTsKIAkJZmluYWwgaW50IGMgPSBOQi5kZWNvZGVJbnQzMihicywgcCArIDgpOwpAQCAtMTg4LDcgKzE4OCw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVJhdyhmaW5hbCBieXRlW10gYnMsIGZpbmFsIGludCBwKSB7CiAJICogICAgICAgICAgICBiZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgaW50IGFycmF5LgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGludFtdIGlzKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tUmF3KGludFtdIGlzKSB7CiAJCXJldHVybiBmcm9tUmF3KGlzLCAwKTsKIAl9CiAKQEAgLTIwMiw3ICsyMDIsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoZmluYWwgaW50W10gaXMpIHsKIAkgKiAgICAgICAgICAgIHBvc2l0aW9uIHRvIHJlYWQgdGhlIGZpcnN0IGludGVnZXIgb2YgZGF0YSBmcm9tLgogCSAqIEByZXR1cm4gdGhlIGNvbnZlcnRlZCBvYmplY3QgaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tUmF3KGZpbmFsIGludFtdIGlzLCBmaW5hbCBpbnQgcCkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVJhdyhpbnRbXSBpcywgaW50IHApIHsKIAkJcmV0dXJuIG5ldyBPYmplY3RJZChpc1twXSwgaXNbcCArIDFdLCBpc1twICsgMl0sIGlzW3AgKyAzXSwgaXNbcCArIDRdKTsKIAl9CiAKQEAgLTIxNiw3ICsyMTYsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdElkIGZyb21SYXcoZmluYWwgaW50W10gaXMsIGZpbmFsIGludCBwKSB7CiAJICogICAgICAgICAgICBwb3NpdGlvbiB0byByZWFkIHRoZSBmaXJzdCBjaGFyYWN0ZXIgZnJvbS4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbVN0cmluZyhmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tU3RyaW5nKGJ5dGVbXSBidWYsIGludCBvZmZzZXQpIHsKIAkJcmV0dXJuIGZyb21IZXhTdHJpbmcoYnVmLCBvZmZzZXQpOwogCX0KIApAQCAtMjI3LDE0ICsyMjcsMTQgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3RJZCBmcm9tU3RyaW5nKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBvZmZzZXQpIHsKIAkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gcmVhZCBmcm9tLiBNdXN0IGJlIDQwIGNoYXJhY3RlcnMgbG9uZy4KIAkgKiBAcmV0dXJuIHRoZSBjb252ZXJ0ZWQgb2JqZWN0IGlkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0SWQgZnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgc3RyKSB7CisJcHVibGljIHN0YXRpYyBPYmplY3RJZCBmcm9tU3RyaW5nKFN0cmluZyBzdHIpIHsKIAkJaWYgKHN0ci5sZW5ndGgoKSAhPSBDb25zdGFudHMuT0JKRUNUX0lEX1NUUklOR19MRU5HVEgpIHsKIAkJCXRocm93IG5ldyBJbnZhbGlkT2JqZWN0SWRFeGNlcHRpb24oc3RyKTsKIAkJfQogCQlyZXR1cm4gZnJvbUhleFN0cmluZyhDb25zdGFudHMuZW5jb2RlQVNDSUkoc3RyKSwgMCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbUhleFN0cmluZyhmaW5hbCBieXRlW10gYnMsIGludCBwKSB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0SWQgZnJvbUhleFN0cmluZyhieXRlW10gYnMsIGludCBwKSB7CiAJCXRyeSB7CiAJCQlmaW5hbCBpbnQgYSA9IFJhd1BhcnNlVXRpbHMucGFyc2VIZXhJbnQzMihicywgcCk7CiAJCQlmaW5hbCBpbnQgYiA9IFJhd1BhcnNlVXRpbHMucGFyc2VIZXhJbnQzMihicywgcCArIDgpOwpAQCAtMjgxLDcgKzI4MSw3IEBAIHB1YmxpYyBPYmplY3RJZChpbnQgbmV3XzEsIGludCBuZXdfMiwgaW50IG5ld18zLCBpbnQgbmV3XzQsIGludCBuZXdfNSkgewogCSAqIEBwYXJhbSBzcmMKIAkgKiAgICAgICAgICAgIGFub3RoZXIgYWxyZWFkeSBwYXJzZWQgT2JqZWN0SWQgdG8gY29weSB0aGUgdmFsdWUgb3V0IG9mLgogCSAqLwotCXByb3RlY3RlZCBPYmplY3RJZChmaW5hbCBBbnlPYmplY3RJZCBzcmMpIHsKKwlwcm90ZWN0ZWQgT2JqZWN0SWQoQW55T2JqZWN0SWQgc3JjKSB7CiAJCXcxID0gc3JjLncxOwogCQl3MiA9IHNyYy53MjsKIAkJdzMgPSBzcmMudzM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZE93bmVyTWFwLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZE93bmVyTWFwLmphdmEKaW5kZXggMDNhNDMwYy4uOWRmNTkzMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWRPd25lck1hcC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdElkT3duZXJNYXAuamF2YQpAQCAtMTM0LDcgKzEzNCw3IEBAIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG1hcHBlZCB0byB0b0ZpbmQsIG9yIG51bGwgaWYgbm8gbWFwcGluZyBleGlzdHMuCiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIFYgZ2V0KGZpbmFsIEFueU9iamVjdElkIHRvRmluZCkgeworCXB1YmxpYyBWIGdldChBbnlPYmplY3RJZCB0b0ZpbmQpIHsKIAkJaW50IGggPSB0b0ZpbmQudzE7CiAJCVYgb2JqID0gZGlyZWN0b3J5W2ggJiBtYXNrXVtoID4+PiBTRUdNRU5UX1NISUZUXTsKIAkJZm9yICg7IG9iaiAhPSBudWxsOyBvYmogPSAoVikgb2JqLm5leHQpCkBAIC0xNDksNyArMTQ5LDcgQEAgcHVibGljIFYgZ2V0KGZpbmFsIEFueU9iamVjdElkIHRvRmluZCkgewogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIG9iamVjdC4KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhmaW5hbCBBbnlPYmplY3RJZCB0b0ZpbmQpIHsKKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhBbnlPYmplY3RJZCB0b0ZpbmQpIHsKIAkJcmV0dXJuIGdldCh0b0ZpbmQpICE9IG51bGw7CiAJfQogCkBAIC0xNjMsNyArMTYzLDcgQEAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgQW55T2JqZWN0SWQgdG9GaW5kKSB7CiAJICogQHBhcmFtIG5ld1ZhbHVlCiAJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHN0b3JlLgogCSAqLwotCXB1YmxpYyA8USBleHRlbmRzIFY+IHZvaWQgYWRkKGZpbmFsIFEgbmV3VmFsdWUpIHsKKwlwdWJsaWMgPFEgZXh0ZW5kcyBWPiB2b2lkIGFkZChRIG5ld1ZhbHVlKSB7CiAJCWlmICgrK3NpemUgPT0gZ3JvdykKIAkJCWdyb3coKTsKIApAQCAtMTk0LDcgKzE5NCw3IEBAIHB1YmxpYyA8USBleHRlbmRzIFY+IHZvaWQgYWRkKGZpbmFsIFEgbmV3VmFsdWUpIHsKIAkgKiAgICAgICAgIHtAY29kZSBnZXQobmV3VmFsdWUpfSBmaXJzdC4KIAkgKi8KIAlAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLQlwdWJsaWMgPFEgZXh0ZW5kcyBWPiBWIGFkZElmQWJzZW50KGZpbmFsIFEgbmV3VmFsdWUpIHsKKwlwdWJsaWMgPFEgZXh0ZW5kcyBWPiBWIGFkZElmQWJzZW50KFEgbmV3VmFsdWUpIHsKIAkJaW50IGggPSBuZXdWYWx1ZS53MTsKIAkJVltdIHRhYmxlID0gZGlyZWN0b3J5W2ggJiBtYXNrXTsKIAkJaCA+Pj49IFNFR01FTlRfU0hJRlQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZFN1YmNsYXNzTWFwLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJZFN1YmNsYXNzTWFwLmphdmEKaW5kZXggMDAxYWE5Yy4uY2Q1N2JkYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SWRTdWJjbGFzc01hcC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdElkU3ViY2xhc3NNYXAuamF2YQpAQCAtOTYsNyArOTYsNyBAQCBwdWJsaWMgdm9pZCBjbGVhcigpIHsKIAkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgaWRlbnRpZmllciB0byBmaW5kLgogCSAqIEByZXR1cm4gdGhlIGluc3RhbmNlIG1hcHBlZCB0byB0b0ZpbmQsIG9yIG51bGwgaWYgbm8gbWFwcGluZyBleGlzdHMuCiAJICovCi0JcHVibGljIFYgZ2V0KGZpbmFsIEFueU9iamVjdElkIHRvRmluZCkgeworCXB1YmxpYyBWIGdldChBbnlPYmplY3RJZCB0b0ZpbmQpIHsKIAkJZmluYWwgaW50IG1zayA9IG1hc2s7CiAJCWludCBpID0gdG9GaW5kLncxICYgbXNrOwogCQlmaW5hbCBWW10gdGJsID0gdGFibGU7CkBAIC0xMTYsNyArMTE2LDcgQEAgcHVibGljIFYgZ2V0KGZpbmFsIEFueU9iamVjdElkIHRvRmluZCkgewogCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG1hcCBjb250YWlucyB0aGUgc3BlY2lmaWVkIG9iamVjdC4KIAkgKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhmaW5hbCBBbnlPYmplY3RJZCB0b0ZpbmQpIHsKKwlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhBbnlPYmplY3RJZCB0b0ZpbmQpIHsKIAkJcmV0dXJuIGdldCh0b0ZpbmQpICE9IG51bGw7CiAJfQogCkBAIC0xMzEsNyArMTMxLDcgQEAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgQW55T2JqZWN0SWQgdG9GaW5kKSB7CiAJICogQHBhcmFtIG5ld1ZhbHVlCiAJICogICAgICAgICAgICB0aGUgb2JqZWN0IHRvIHN0b3JlLgogCSAqLwotCXB1YmxpYyA8USBleHRlbmRzIFY+IHZvaWQgYWRkKGZpbmFsIFEgbmV3VmFsdWUpIHsKKwlwdWJsaWMgPFEgZXh0ZW5kcyBWPiB2b2lkIGFkZChRIG5ld1ZhbHVlKSB7CiAJCWlmICgrK3NpemUgPT0gZ3JvdykKIAkJCWdyb3coKTsKIAkJaW5zZXJ0KG5ld1ZhbHVlKTsKQEAgLTE1NSw3ICsxNTUsNyBAQCBwdWJsaWMgPFEgZXh0ZW5kcyBWPiB2b2lkIGFkZChmaW5hbCBRIG5ld1ZhbHVlKSB7CiAJICogICAgICAgICB0aGF0IHdvdWxkIGhhdmUgYmVlbiByZXR1cm5lZCBoYWQgdGhlIGNhbGxlciB1c2VkCiAJICogICAgICAgICB7QGNvZGUgZ2V0KG5ld1ZhbHVlKX0gZmlyc3QuCiAJICovCi0JcHVibGljIDxRIGV4dGVuZHMgVj4gViBhZGRJZkFic2VudChmaW5hbCBRIG5ld1ZhbHVlKSB7CisJcHVibGljIDxRIGV4dGVuZHMgVj4gViBhZGRJZkFic2VudChRIG5ld1ZhbHVlKSB7CiAJCWZpbmFsIGludCBtc2sgPSBtYXNrOwogCQlpbnQgaSA9IG5ld1ZhbHVlLncxICYgbXNrOwogCQlmaW5hbCBWW10gdGJsID0gdGFibGU7CkBAIC0yMjYsNyArMjI2LDcgQEAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewogCQl9OwogCX0KIAotCXByaXZhdGUgdm9pZCBpbnNlcnQoZmluYWwgViBuZXdWYWx1ZSkgeworCXByaXZhdGUgdm9pZCBpbnNlcnQoViBuZXdWYWx1ZSkgewogCQlmaW5hbCBpbnQgbXNrID0gbWFzazsKIAkJaW50IGogPSBuZXdWYWx1ZS53MSAmIG1zazsKIAkJZmluYWwgVltdIHRibCA9IHRhYmxlOwpAQCAtMjU0LDcgKzI1NCw3IEBAIHByaXZhdGUgdm9pZCBpbml0VGFibGUoaW50IHN6KSB7CiAJfQogCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJpdmF0ZSBmaW5hbCBWW10gY3JlYXRlQXJyYXkoZmluYWwgaW50IHN6KSB7CisJcHJpdmF0ZSBmaW5hbCBWW10gY3JlYXRlQXJyYXkoaW50IHN6KSB7CiAJCXJldHVybiAoVltdKSBuZXcgT2JqZWN0SWRbc3pdOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdEluc2VydGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9PYmplY3RJbnNlcnRlci5qYXZhCmluZGV4IDQwNTIyYmEuLjc3ZmExYjIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdEluc2VydGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0SW5zZXJ0ZXIuamF2YQpAQCAtMzYxLDcgKzM2MSw3IEBAIHB1YmxpYyBmaW5hbCBPYmplY3RJZCBpbnNlcnQoVGFnQnVpbGRlciBidWlsZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBvYmplY3QgY291bGQgbm90IGJlIHN0b3JlZC4KIAkgKi8KLQlwdWJsaWMgT2JqZWN0SWQgaW5zZXJ0KGZpbmFsIGludCB0eXBlLCBmaW5hbCBieXRlW10gZGF0YSkKKwlwdWJsaWMgT2JqZWN0SWQgaW5zZXJ0KGludCB0eXBlLCBieXRlW10gZGF0YSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBpbnNlcnQodHlwZSwgZGF0YSwgMCwgZGF0YS5sZW5ndGgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL09iamVjdExvYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0TG9hZGVyLmphdmEKaW5kZXggNDMyZjVhNi4uMmU1MmYwMyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0TG9hZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvT2JqZWN0TG9hZGVyLmphdmEKQEAgLTE5NCw4ICsxOTQsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0xhcmdlKCkgewogCQlpZiAoIWlzTGFyZ2UoKSkKIAkJCXJldHVybiBnZXRDYWNoZWRCeXRlcygpOwogCi0JCU9iamVjdFN0cmVhbSBpbiA9IG9wZW5TdHJlYW0oKTsKLQkJdHJ5IHsKKwkJdHJ5IChPYmplY3RTdHJlYW0gaW4gPSBvcGVuU3RyZWFtKCkpIHsKIAkJCWxvbmcgc3ogPSBpbi5nZXRTaXplKCk7CiAJCQlpZiAoc2l6ZUxpbWl0IDwgc3opCiAJCQkJdGhyb3cgbmV3IExhcmdlT2JqZWN0RXhjZXB0aW9uLkV4Y2VlZHNMaW1pdChzaXplTGltaXQsIHN6KTsKQEAgLTIxMiw4ICsyMTEsNiBAQCBwdWJsaWMgYm9vbGVhbiBpc0xhcmdlKCkgewogCiAJCQlJTy5yZWFkRnVsbHkoaW4sIGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CiAJCQlyZXR1cm4gYnVmOwotCQl9IGZpbmFsbHkgewotCQkJaW4uY2xvc2UoKTsKIAkJfQogCX0KIApAQCAtMjU1LDggKzI1Miw3IEBAIHB1YmxpYyBhYnN0cmFjdCBPYmplY3RTdHJlYW0gb3BlblN0cmVhbSgpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCXB1YmxpYyB2b2lkIGNvcHlUbyhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJaWYgKGlzTGFyZ2UoKSkgewotCQkJT2JqZWN0U3RyZWFtIGluID0gb3BlblN0cmVhbSgpOwotCQkJdHJ5IHsKKwkJCXRyeSAoT2JqZWN0U3RyZWFtIGluID0gb3BlblN0cmVhbSgpKSB7CiAJCQkJZmluYWwgbG9uZyBzeiA9IGluLmdldFNpemUoKTsKIAkJCQlieXRlW10gdG1wID0gbmV3IGJ5dGVbODE5Ml07CiAJCQkJbG9uZyBjb3BpZWQgPSAwOwpAQCAtMjY5LDE1ICsyNjUsMTMgQEAgcHVibGljIHZvaWQgY29weVRvKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJCX0KIAkJCQlpZiAoMCA8PSBpbi5yZWFkKCkpCiAJCQkJCXRocm93IG5ldyBFT0ZFeGNlcHRpb24oKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW4uY2xvc2UoKTsKIAkJCX0KIAkJfSBlbHNlIHsKIAkJCW91dC53cml0ZShnZXRDYWNoZWRCeXRlcygpKTsKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSBjbG9uZUFycmF5KGZpbmFsIGJ5dGVbXSBkYXRhKSB7CisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGNsb25lQXJyYXkoYnl0ZVtdIGRhdGEpIHsKIAkJZmluYWwgYnl0ZVtdIGNvcHkgPSBuZXcgYnl0ZVtkYXRhLmxlbmd0aF07CiAJCVN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgY29weSwgMCwgZGF0YS5sZW5ndGgpOwogCQlyZXR1cm4gY29weTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9QZXJzb25JZGVudC5qYXZhCmluZGV4IDE4YTExZjAuLmMxNmEyYjYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1BlcnNvbklkZW50LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUGVyc29uSWRlbnQuamF2YQpAQCAtMTY3LDcgKzE2Nyw3IEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmRTYW5pdGl6ZWQoU3RyaW5nQnVpbGRlciByLCBTdHJpbmcgc3RyKSB7CiAJICoKIAkgKiBAcGFyYW0gcmVwbyBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fSBvYmplY3QuCiAJICovCi0JcHVibGljIFBlcnNvbklkZW50KGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBQZXJzb25JZGVudChSZXBvc2l0b3J5IHJlcG8pIHsKIAkJdGhpcyhyZXBvLmdldENvbmZpZygpLmdldChVc2VyQ29uZmlnLktFWSkpOwogCX0KIApAQCAtMTc3LDcgKzE3Nyw3IEBAIHB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKIAkgKiBAcGFyYW0gcGkKIAkgKiAgICAgICAgICAgIE9yaWdpbmFsIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudH0KIAkgKi8KLQlwdWJsaWMgUGVyc29uSWRlbnQoZmluYWwgUGVyc29uSWRlbnQgcGkpIHsKKwlwdWJsaWMgUGVyc29uSWRlbnQoUGVyc29uSWRlbnQgcGkpIHsKIAkJdGhpcyhwaS5nZXROYW1lKCksIHBpLmdldEVtYWlsQWRkcmVzcygpKTsKIAl9CiAKQEAgLTE5MCw3ICsxOTAsNyBAQCBwdWJsaWMgUGVyc29uSWRlbnQoZmluYWwgUGVyc29uSWRlbnQgcGkpIHsKIAkgKiBAcGFyYW0gYUVtYWlsQWRkcmVzcwogCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30gb2JqZWN0LgogCSAqLwotCXB1YmxpYyBQZXJzb25JZGVudChmaW5hbCBTdHJpbmcgYU5hbWUsIGZpbmFsIFN0cmluZyBhRW1haWxBZGRyZXNzKSB7CisJcHVibGljIFBlcnNvbklkZW50KFN0cmluZyBhTmFtZSwgU3RyaW5nIGFFbWFpbEFkZHJlc3MpIHsKIAkJdGhpcyhhTmFtZSwgYUVtYWlsQWRkcmVzcywgU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudFRpbWUoKSk7CiAJfQogCkBAIC0yMjEsNyArMjIxLDcgQEAgcHVibGljIFBlcnNvbklkZW50KFN0cmluZyBhTmFtZSwgU3RyaW5nIGFFbWFpbEFkZHJlc3MsCiAJICogQHBhcmFtIHR6CiAJICogICAgICAgICAgICB0aW1lIHpvbmUKIAkgKi8KLQlwdWJsaWMgUGVyc29uSWRlbnQoZmluYWwgUGVyc29uSWRlbnQgcGksIGZpbmFsIERhdGUgd2hlbiwgZmluYWwgVGltZVpvbmUgdHopIHsKKwlwdWJsaWMgUGVyc29uSWRlbnQoUGVyc29uSWRlbnQgcGksIERhdGUgd2hlbiwgVGltZVpvbmUgdHopIHsKIAkJdGhpcyhwaS5nZXROYW1lKCksIHBpLmdldEVtYWlsQWRkcmVzcygpLCB3aGVuLCB0eik7CiAJfQogCkBAIC0yMzQsNyArMjM0LDcgQEAgcHVibGljIFBlcnNvbklkZW50KGZpbmFsIFBlcnNvbklkZW50IHBpLCBmaW5hbCBEYXRlIHdoZW4sIGZpbmFsIFRpbWVab25lIHR6KSB7CiAJICogQHBhcmFtIGFXaGVuCiAJICogICAgICAgICAgICBsb2NhbCB0aW1lCiAJICovCi0JcHVibGljIFBlcnNvbklkZW50KGZpbmFsIFBlcnNvbklkZW50IHBpLCBmaW5hbCBEYXRlIGFXaGVuKSB7CisJcHVibGljIFBlcnNvbklkZW50KFBlcnNvbklkZW50IHBpLCBEYXRlIGFXaGVuKSB7CiAJCXRoaXMocGkuZ2V0TmFtZSgpLCBwaS5nZXRFbWFpbEFkZHJlc3MoKSwgYVdoZW4uZ2V0VGltZSgpLCBwaS50ek9mZnNldCk7CiAJfQogCkBAIC0yNjQsNyArMjY0LDcgQEAgcHVibGljIFBlcnNvbklkZW50KGZpbmFsIFN0cmluZyBhTmFtZSwgZmluYWwgU3RyaW5nIGFFbWFpbEFkZHJlc3MsCiAJICogQHBhcmFtIGFUWgogCSAqICAgICAgICAgICAgdGltZSB6b25lCiAJICovCi0JcHVibGljIFBlcnNvbklkZW50KGZpbmFsIFBlcnNvbklkZW50IHBpLCBmaW5hbCBsb25nIGFXaGVuLCBmaW5hbCBpbnQgYVRaKSB7CisJcHVibGljIFBlcnNvbklkZW50KFBlcnNvbklkZW50IHBpLCBsb25nIGFXaGVuLCBpbnQgYVRaKSB7CiAJCXRoaXMocGkuZ2V0TmFtZSgpLCBwaS5nZXRFbWFpbEFkZHJlc3MoKSwgYVdoZW4sIGFUWik7CiAJfQogCkBAIC0yNzQsNyArMjc0LDcgQEAgcHJpdmF0ZSBQZXJzb25JZGVudChmaW5hbCBTdHJpbmcgYU5hbWUsIGZpbmFsIFN0cmluZyBhRW1haWxBZGRyZXNzLAogCQkJCS5nZXRUaW1lem9uZSh3aGVuKSk7CiAJfQogCi0JcHJpdmF0ZSBQZXJzb25JZGVudChmaW5hbCBVc2VyQ29uZmlnIGNvbmZpZykgeworCXByaXZhdGUgUGVyc29uSWRlbnQoVXNlckNvbmZpZyBjb25maWcpIHsKIAkJdGhpcyhjb25maWcuZ2V0Q29tbWl0dGVyTmFtZSgpLCBjb25maWcuZ2V0Q29tbWl0dGVyRW1haWwoKSk7CiAJfQogCkBAIC0zNzAsNyArMzcwLDcgQEAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCWlmIChvIGluc3RhbmNlb2YgUGVyc29uSWRlbnQpIHsKIAkJCWZpbmFsIFBlcnNvbklkZW50IHAgPSAoUGVyc29uSWRlbnQpIG87CiAJCQlyZXR1cm4gZ2V0TmFtZSgpLmVxdWFscyhwLmdldE5hbWUoKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlYmFzZVRvZG9GaWxlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWJhc2VUb2RvRmlsZS5qYXZhCmluZGV4IDA2YjRiMjIuLjM4NzE2MDUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlYmFzZVRvZG9GaWxlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmViYXNlVG9kb0ZpbGUuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQubGliOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKIGltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTE4Myw3ICsxODMsNyBAQCBwcml2YXRlIHN0YXRpYyBSZWJhc2VUb2RvTGluZSBwYXJzZUxpbmUoYnl0ZVtdIGJ1ZiwgaW50IHRva2VuQmVnaW4sCiAJCQlzd2l0Y2ggKHRva2VuQ291bnQpIHsKIAkJCWNhc2UgMDoKIAkJCQlTdHJpbmcgYWN0aW9uVG9rZW4gPSBuZXcgU3RyaW5nKGJ1ZiwgdG9rZW5CZWdpbiwKLQkJCQkJCW5leHRTcGFjZSAtIHRva2VuQmVnaW4gLSAxLCBVVEZfOCk7CisJCQkJCQluZXh0U3BhY2UgLSB0b2tlbkJlZ2luIC0gMSwgQ0hBUlNFVCk7CiAJCQkJdG9rZW5CZWdpbiA9IG5leHRTcGFjZTsKIAkJCQlhY3Rpb24gPSBSZWJhc2VUb2RvTGluZS5BY3Rpb24ucGFyc2UoYWN0aW9uVG9rZW4pOwogCQkJCWlmIChhY3Rpb24gPT0gbnVsbCkKQEAgLTE5Miw3ICsxOTIsNyBAQCBwcml2YXRlIHN0YXRpYyBSZWJhc2VUb2RvTGluZSBwYXJzZUxpbmUoYnl0ZVtdIGJ1ZiwgaW50IHRva2VuQmVnaW4sCiAJCQljYXNlIDE6CiAJCQkJbmV4dFNwYWNlID0gUmF3UGFyc2VVdGlscy5uZXh0KGJ1ZiwgdG9rZW5CZWdpbiwgJyAnKTsKIAkJCQlTdHJpbmcgY29tbWl0VG9rZW4gPSBuZXcgU3RyaW5nKGJ1ZiwgdG9rZW5CZWdpbiwKLQkJCQkJCW5leHRTcGFjZSAtIHRva2VuQmVnaW4gLSAxLCBVVEZfOCk7CisJCQkJCQluZXh0U3BhY2UgLSB0b2tlbkJlZ2luIC0gMSwgQ0hBUlNFVCk7CiAJCQkJdG9rZW5CZWdpbiA9IG5leHRTcGFjZTsKIAkJCQljb21taXQgPSBBYmJyZXZpYXRlZE9iamVjdElkLmZyb21TdHJpbmcoY29tbWl0VG9rZW4pOwogCQkJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWYuamF2YQppbmRleCAzOTViYjMyLi5iMDAwNTU4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWYuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWYuamF2YQpAQCAtMTA1LDcgKzEwNSw3IEBAIHB1YmxpYyBzdGF0aWMgZW51bSBTdG9yYWdlIHsKIAogCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcGFja2VkOwogCi0JCXByaXZhdGUgU3RvcmFnZShmaW5hbCBib29sZWFuIGwsIGZpbmFsIGJvb2xlYW4gcCkgeworCQlwcml2YXRlIFN0b3JhZ2UoYm9vbGVhbiBsLCBib29sZWFuIHApIHsKIAkJCWxvb3NlID0gbDsKIAkJCXBhY2tlZCA9IHA7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZkNvbXBhcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZkNvbXBhcmF0b3IuamF2YQppbmRleCA0M2QyZjM3Li44YmNhYzAwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZDb21wYXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmQ29tcGFyYXRvci5qYXZhCkBAIC02Miw3ICs2Miw3IEBAIHB1YmxpYyBjbGFzcyBSZWZDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcjxSZWY+IHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCBjb21wYXJlKGZpbmFsIFJlZiBvMSwgZmluYWwgUmVmIG8yKSB7CisJcHVibGljIGludCBjb21wYXJlKFJlZiBvMSwgUmVmIG8yKSB7CiAJCXJldHVybiBjb21wYXJlVG8obzEsIG8yKTsKIAl9CiAKQEAgLTczLDcgKzczLDcgQEAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIFJlZiBvMSwgZmluYWwgUmVmIG8yKSB7CiAJICogICAgICAgICAgICBjb2xsZWN0aW9uIHRvIGJlIHNvcnRlZAogCSAqIEByZXR1cm4gc29ydGVkIGNvbGxlY3Rpb24gb2YgcmVmcwogCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxSZWY+IHNvcnQoZmluYWwgQ29sbGVjdGlvbjxSZWY+IHJlZnMpIHsKKwlwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVmPiBzb3J0KENvbGxlY3Rpb248UmVmPiByZWZzKSB7CiAJCWZpbmFsIExpc3Q8UmVmPiByID0gbmV3IEFycmF5TGlzdDw+KHJlZnMpOwogCQlDb2xsZWN0aW9ucy5zb3J0KHIsIElOU1RBTkNFKTsKIAkJcmV0dXJuIHI7CkBAIC0xMDEsNyArMTAxLDcgQEAgcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKFJlZiBvMSwgU3RyaW5nIG8yKSB7CiAJICogICAgICAgICAgICB0aGUgb3RoZXIgcmVmZXJlbmNlIGluc3RhbmNlLgogCSAqIEByZXR1cm4gc3RhbmRhcmQgQ29tcGFyYXRvciByZXN1bHQgb2YgJmx0OyAwLCAwLCAmZ3Q7IDAuCiAJICovCi0JcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKGZpbmFsIFJlZiBvMSwgZmluYWwgUmVmIG8yKSB7CisJcHVibGljIHN0YXRpYyBpbnQgY29tcGFyZVRvKFJlZiBvMSwgUmVmIG8yKSB7CiAJCXJldHVybiBvMS5nZXROYW1lKCkuY29tcGFyZVRvKG8yLmdldE5hbWUoKSk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmRGF0YWJhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZkRhdGFiYXNlLmphdmEKaW5kZXggNTU3YmRiOS4uMzE3MDc4NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmRGF0YWJhc2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZEYXRhYmFzZS5qYXZhCkBAIC00Myw2ICs0Myw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5saWI7CiAKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzLnRvTGlzdDsKKwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKQEAgLTg5LDcgKzkxLDEwIEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZWZEYXRhYmFzZSB7CiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NZTUJPTElDX1JFRl9ERVBUSCA9IDU7CiAKLQkvKiogTWFnaWMgdmFsdWUgZm9yIHtAbGluayAjZ2V0UmVmcyhTdHJpbmcpfSB0byByZXR1cm4gYWxsIHJlZmVyZW5jZXMuICovCisJLyoqCisJICogTWFnaWMgdmFsdWUgZm9yIHtAbGluayAjZ2V0UmVmc0J5UHJlZml4KFN0cmluZyl9IHRvIHJldHVybiBhbGwKKwkgKiByZWZlcmVuY2VzLgorCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFMTCA9ICIiOy8vJE5PTi1OTFMtMSQKIAogCS8qKgpAQCAtMzMyLDYgKzMzNywyOSBAQCBwdWJsaWMgUmVmIGZpcnN0RXhhY3RSZWYoU3RyaW5nLi4uIHJlZnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJfQogCiAJLyoqCisJICogUmV0dXJucyBhbGwgcmVmcy4KKwkgKiA8cD4KKwkgKiBUaGlzIGluY2x1ZGVzIHtAY29kZSBIRUFEfSwgYnJhbmNoZXMgdW5kZXIge0Bjb2RlIHJlZi9oZWFkcy99LCB0YWdzCisJICogdW5kZXIge0Bjb2RlIHJlZnMvdGFncy99LCBldGMuIEl0IGRvZXMgbm90IGluY2x1ZGUgcHNldWRvLXJlZnMgbGlrZQorCSAqIHtAY29kZSBGRVRDSF9IRUFEfTsgZm9yIHRob3NlLCBzZWUge0BsaW5rICNnZXRBZGRpdGlvbmFsUmVmc30uCisJICogPHA+CisJICogU3ltYm9saWMgcmVmZXJlbmNlcyB0byBhIG5vbi1leGlzdGVudCByZWYgKGZvciBleGFtcGxlLAorCSAqIHtAY29kZSBIRUFEfSBwb2ludGluZyB0byBhIGJyYW5jaCB5ZXQgdG8gYmUgYm9ybikgYXJlIG5vdCBpbmNsdWRlZC4KKwkgKiA8cD4KKwkgKiBDYWxsZXJzIGludGVyZXN0ZWQgaW4gb25seSBhIHBvcnRpb24gb2YgdGhlIHJlZiBoaWVyYXJjaHkgY2FuIGNhbGwKKwkgKiB7QGxpbmsgI2dldFJlZnNCeVByZWZpeH0gaW5zdGVhZC4KKwkgKgorCSAqIEByZXR1cm4gaW1tdXRhYmxlIGxpc3Qgb2YgYWxsIHJlZnMuCisJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgdGhlIHJlZmVyZW5jZSBzcGFjZSBjYW5ub3QgYmUgYWNjZXNzZWQuCisJICogQHNpbmNlIDUuMAorCSAqLworCUBOb25OdWxsCisJcHVibGljIExpc3Q8UmVmPiBnZXRSZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcmV0dXJuIGdldFJlZnNCeVByZWZpeChBTEwpOworCX0KKworCS8qKgogCSAqIEdldCBhIHNlY3Rpb24gb2YgdGhlIHJlZmVyZW5jZSBuYW1lc3BhY2UuCiAJICoKIAkgKiBAcGFyYW0gcHJlZml4CkBAIC0zNDMsMTYgKzM3MSw3MyBAQCBwdWJsaWMgUmVmIGZpcnN0RXhhY3RSZWYoU3RyaW5nLi4uIHJlZnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICBvZiBlYWNoIGtleS4gVGhlIG1hcCBjYW4gYmUgYW4gdW5zb3J0ZWQgbWFwLgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSByZWZlcmVuY2Ugc3BhY2UgY2Fubm90IGJlIGFjY2Vzc2VkLgorCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2dldFJlZnNCeVByZWZpeH0gaW5zdGVhZAogCSAqLwogCUBOb25OdWxsCisJQERlcHJlY2F0ZWQKIAlwdWJsaWMgYWJzdHJhY3QgTWFwPFN0cmluZywgUmVmPiBnZXRSZWZzKFN0cmluZyBwcmVmaXgpIHRocm93cyBJT0V4Y2VwdGlvbjsKIAogCS8qKgorCSAqIFJldHVybnMgcmVmcyB3aG9zZSBuYW1lcyBzdGFydCB3aXRoIGEgZ2l2ZW4gcHJlZml4LgorCSAqIDxwPgorCSAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHVzZXMge0BsaW5rICNnZXRSZWZzKFN0cmluZyl9LiBJbXBsZW1lbnRvcnMgb2YKKwkgKiB7QGxpbmsgUmVmRGF0YWJhc2V9IHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBkaXJlY3RseSBpZiBhIGJldHRlcgorCSAqIGltcGxlbWVudGF0aW9uIGlzIHBvc3NpYmxlLgorCSAqCisJICogQHBhcmFtIHByZWZpeCBzdHJpbmcgdGhhdCBuYW1lcyBvZiByZWZzIHNob3VsZCBzdGFydCB3aXRoOyBtYXkgYmUKKwkgKiAgICAgICAgICAgICBlbXB0eSAodG8gcmV0dXJuIGFsbCByZWZzKS4KKwkgKiBAcmV0dXJuIGltbXV0YWJsZSBsaXN0IG9mIHJlZnMgd2hvc2UgbmFtZXMgc3RhcnQgd2l0aCB7QGNvZGUgcHJlZml4fS4KKwkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICB0aGUgcmVmZXJlbmNlIHNwYWNlIGNhbm5vdCBiZSBhY2Nlc3NlZC4KKwkgKiBAc2luY2UgNS4wCisJICovCisJQE5vbk51bGwKKwlwdWJsaWMgTGlzdDxSZWY+IGdldFJlZnNCeVByZWZpeChTdHJpbmcgcHJlZml4KSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlNYXA8U3RyaW5nLCBSZWY+IGNvYXJzZVJlZnM7CisJCWludCBsYXN0U2xhc2ggPSBwcmVmaXgubGFzdEluZGV4T2YoJy8nKTsKKwkJaWYgKGxhc3RTbGFzaCA9PSAtMSkgeworCQkJY29hcnNlUmVmcyA9IGdldFJlZnMoQUxMKTsKKwkJfSBlbHNlIHsKKwkJCWNvYXJzZVJlZnMgPSBnZXRSZWZzKHByZWZpeC5zdWJzdHJpbmcoMCwgbGFzdFNsYXNoICsgMSkpOworCQl9CisKKwkJTGlzdDxSZWY+IHJlc3VsdDsKKwkJaWYgKGxhc3RTbGFzaCArIDEgPT0gcHJlZml4Lmxlbmd0aCgpKSB7CisJCQlyZXN1bHQgPSBjb2Fyc2VSZWZzLnZhbHVlcygpLnN0cmVhbSgpLmNvbGxlY3QodG9MaXN0KCkpOworCQl9IGVsc2UgeworCQkJU3RyaW5nIHAgPSBwcmVmaXguc3Vic3RyaW5nKGxhc3RTbGFzaCArIDEpOworCQkJcmVzdWx0ID0gY29hcnNlUmVmcy5lbnRyeVNldCgpLnN0cmVhbSgpCisJCQkJCS5maWx0ZXIoZSAtPiBlLmdldEtleSgpLnN0YXJ0c1dpdGgocCkpCisJCQkJCS5tYXAoZSAtPiBlLmdldFZhbHVlKCkpCisJCQkJCS5jb2xsZWN0KHRvTGlzdCgpKTsKKwkJfQorCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyZXN1bHQpOworCX0KKworCS8qKgorCSAqIENoZWNrIGlmIGFueSByZWZzIGV4aXN0IGluIHRoZSByZWYgZGF0YWJhc2UuCisJICogPHA+CisJICogVGhpcyB1c2VzIHRoZSBzYW1lIGRlZmluaXRpb24gb2YgcmVmcyBhcyB7QGxpbmsgI2dldFJlZnMoKX0uIEluCisJICogcGFydGljdWxhciwgcmV0dXJucyB7QGNvZGUgZmFsc2V9IGluIGEgbmV3IHJlcG9zaXRvcnkgd2l0aCBubyByZWZzCisJICogdW5kZXIge0Bjb2RlIHJlZnMvfSBhbmQge0Bjb2RlIEhFQUR9IHBvaW50aW5nIHRvIGEgYnJhbmNoIHlldCB0byBiZQorCSAqIGJvcm4sIGFuZCByZXR1cm5zIHtAY29kZSB0cnVlfSBpbiBhIHJlcG9zaXRvcnkgd2l0aCBubyByZWZzIHVuZGVyCisJICoge0Bjb2RlIHJlZnMvfSBhbmQgYSBkZXRhY2hlZCB7QGNvZGUgSEVBRH0gcG9pbnRpbmcgdG8gaGlzdG9yeS4KKwkgKgorCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGF0YWJhc2UgaGFzIHJlZnMuCisJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgdGhlIHJlZmVyZW5jZSBzcGFjZSBjYW5ub3QgYmUgYWNjZXNzZWQuCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBib29sZWFuIGhhc1JlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlyZXR1cm4gIWdldFJlZnMoKS5pc0VtcHR5KCk7CisJfQorCisJLyoqCiAJICogR2V0IHRoZSBhZGRpdGlvbmFsIHJlZmVyZW5jZS1saWtlIGVudGl0aWVzIGZyb20gdGhlIHJlcG9zaXRvcnkuCiAJICogPHA+CiAJICogVGhlIHJlc3VsdCBsaXN0IGluY2x1ZGVzIG5vbi1yZWYgaXRlbXMgc3VjaCBhcyBNRVJHRV9IRUFEIGFuZAogCSAqIEZFVENIX1JFU1VMVCBjYXN0IHRvIGJlIHJlZnMuIFRoZSBuYW1lcyBvZiB0aGVzZSByZWZzIGFyZSBub3QgcmV0dXJuZWQgYnkKLQkgKiA8Y29kZT5nZXRSZWZzKEFMTCk8L2NvZGU+IGJ1dCBhcmUgYWNjZXB0ZWQgYnkge0BsaW5rICNnZXRSZWYoU3RyaW5nKX0KKwkgKiA8Y29kZT5nZXRSZWZzKCk8L2NvZGU+IGJ1dCBhcmUgYWNjZXB0ZWQgYnkge0BsaW5rICNnZXRSZWYoU3RyaW5nKX0KIAkgKiBhbmQge0BsaW5rICNleGFjdFJlZihTdHJpbmcpfS4KIAkgKgogCSAqIEByZXR1cm4gYSBsaXN0IG9mIGFkZGl0aW9uYWwgcmVmcwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmUmVuYW1lLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZSZW5hbWUuamF2YQppbmRleCAzZDIyYmIwLi5hMDVkYWEwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZSZW5hbWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZSZW5hbWUuamF2YQpAQCAtNzMsNyArNzMsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmUmVuYW1lIHsKIAkgKiBAcGFyYW0gZHN0CiAJICogICAgICAgICAgICBvcGVyYXRpb24gdG8gY3JlYXRlIChvciBvdmVyd3JpdGUpIHRoZSBkZXN0aW5hdGlvbi4KIAkgKi8KLQlwcm90ZWN0ZWQgUmVmUmVuYW1lKGZpbmFsIFJlZlVwZGF0ZSBzcmMsIGZpbmFsIFJlZlVwZGF0ZSBkc3QpIHsKKwlwcm90ZWN0ZWQgUmVmUmVuYW1lKFJlZlVwZGF0ZSBzcmMsIFJlZlVwZGF0ZSBkc3QpIHsKIAkJc291cmNlID0gc3JjOwogCQlkZXN0aW5hdGlvbiA9IGRzdDsKIApAQCAtMTA3LDcgKzEwNyw3IEBAIHB1YmxpYyBQZXJzb25JZGVudCBnZXRSZWZMb2dJZGVudCgpIHsKIAkgKiAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUgcmVwb3NpdG9yeQogCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZMb2dJZGVudChmaW5hbCBQZXJzb25JZGVudCBwaSkgeworCXB1YmxpYyB2b2lkIHNldFJlZkxvZ0lkZW50KFBlcnNvbklkZW50IHBpKSB7CiAJCWRlc3RpbmF0aW9uLnNldFJlZkxvZ0lkZW50KHBpKTsKIAl9CiAKQEAgLTEyNyw3ICsxMjcsNyBAQCBwdWJsaWMgU3RyaW5nIGdldFJlZkxvZ01lc3NhZ2UoKSB7CiAJICogQHBhcmFtIG1zZwogCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gZGVzY3JpYmUgdGhpcyBjaGFuZ2UuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVmTG9nTWVzc2FnZShmaW5hbCBTdHJpbmcgbXNnKSB7CisJcHVibGljIHZvaWQgc2V0UmVmTG9nTWVzc2FnZShTdHJpbmcgbXNnKSB7CiAJCWlmIChtc2cgPT0gbnVsbCkKIAkJCWRpc2FibGVSZWZMb2coKTsKIAkJZWxzZQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVmVXBkYXRlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZVcGRhdGUuamF2YQppbmRleCAwNmE3NTc2Li41Y2Q1OTNlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZVcGRhdGUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZVcGRhdGUuamF2YQpAQCAtMjI3LDcgKzIyNyw3IEBAIHB1YmxpYyBzdGF0aWMgZW51bSBSZXN1bHQgewogCSAqIEBwYXJhbSByZWYKIAkgKiAgICAgICAgICAgIHRoZSByZWZlcmVuY2UgdGhhdCB3aWxsIGJlIHVwZGF0ZWQgYnkgdGhpcyBvcGVyYXRpb24uCiAJICovCi0JcHJvdGVjdGVkIFJlZlVwZGF0ZShmaW5hbCBSZWYgcmVmKSB7CisJcHJvdGVjdGVkIFJlZlVwZGF0ZShSZWYgcmVmKSB7CiAJCXRoaXMucmVmID0gcmVmOwogCQlvbGRWYWx1ZSA9IHJlZi5nZXRPYmplY3RJZCgpOwogCQlyZWZMb2dNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKQEAgLTM1MCw3ICszNTAsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0RldGFjaGluZ1N5bWJvbGljUmVmKCkgewogCSAqIEBwYXJhbSBpZAogCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXdPYmplY3RJZChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyB2b2lkIHNldE5ld09iamVjdElkKEFueU9iamVjdElkIGlkKSB7CiAJCW5ld1ZhbHVlID0gaWQuY29weSgpOwogCX0KIApAQCAtMzc3LDcgKzM3Nyw3IEBAIHB1YmxpYyBPYmplY3RJZCBnZXRFeHBlY3RlZE9sZE9iamVjdElkKCkgewogCSAqICAgICAgICAgICAgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5PYmplY3RJZCN6ZXJvSWQoKX0gdG8gaW5kaWNhdGUKIAkgKiAgICAgICAgICAgIGV4cGVjdGF0aW9uIG9mIGEgbm9uLWV4aXN0YW50IHJlZi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBlY3RlZE9sZE9iamVjdElkKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHVibGljIHZvaWQgc2V0RXhwZWN0ZWRPbGRPYmplY3RJZChBbnlPYmplY3RJZCBpZCkgewogCQlleHBWYWx1ZSA9IGlkICE9IG51bGwgPyBpZC50b09iamVjdElkKCkgOiBudWxsOwogCX0KIApAQCAtMzk2LDcgKzM5Niw3IEBAIHB1YmxpYyBib29sZWFuIGlzRm9yY2VVcGRhdGUoKSB7CiAJICogQHBhcmFtIGIKIAkgKiAgICAgICAgICAgIHRydWUgaWYgdGhpcyB1cGRhdGUgc2hvdWxkIGlnbm9yZSBtZXJnZSB0ZXN0cy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb3JjZVVwZGF0ZShmaW5hbCBib29sZWFuIGIpIHsKKwlwdWJsaWMgdm9pZCBzZXRGb3JjZVVwZGF0ZShib29sZWFuIGIpIHsKIAkJZm9yY2UgPSBiOwogCX0KIApAQCAtNDIxLDcgKzQyMSw3IEBAIHB1YmxpYyBQZXJzb25JZGVudCBnZXRSZWZMb2dJZGVudCgpIHsKIAkgKiAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUgcmVwb3NpdG9yeQogCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZMb2dJZGVudChmaW5hbCBQZXJzb25JZGVudCBwaSkgeworCXB1YmxpYyB2b2lkIHNldFJlZkxvZ0lkZW50KFBlcnNvbklkZW50IHBpKSB7CiAJCXJlZkxvZ0lkZW50ID0gcGk7CiAJfQogCkBAIC00NjEsNyArNDYxLDcgQEAgcHJvdGVjdGVkIGJvb2xlYW4gaXNSZWZMb2dJbmNsdWRpbmdSZXN1bHQoKSB7CiAJICogICAgICAgICAgICBmb3JjZWQtdXBkYXRlKSBzaG91bGQgYmUgYXBwZW5kZWQgdG8gdGhlIHVzZXIgc3VwcGxpZWQKIAkgKiAgICAgICAgICAgIG1lc3NhZ2UuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVmTG9nTWVzc2FnZShmaW5hbCBTdHJpbmcgbXNnLCBmaW5hbCBib29sZWFuIGFwcGVuZFN0YXR1cykgeworCXB1YmxpYyB2b2lkIHNldFJlZkxvZ01lc3NhZ2UoU3RyaW5nIG1zZywgYm9vbGVhbiBhcHBlbmRTdGF0dXMpIHsKIAkJaWYgKG1zZyA9PSBudWxsICYmICFhcHBlbmRTdGF0dXMpCiAJCQlkaXNhYmxlUmVmTG9nKCk7CiAJCWVsc2UgaWYgKG1zZyA9PSBudWxsICYmIGFwcGVuZFN0YXR1cykgewpAQCAtNjE1LDcgKzYxNSw3IEBAIHB1YmxpYyBSZXN1bHQgdXBkYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhbiB1bmV4cGVjdGVkIElPIGVycm9yIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcgY2hhbmdlcy4KIAkgKi8KLQlwdWJsaWMgUmVzdWx0IHVwZGF0ZShmaW5hbCBSZXZXYWxrIHdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIFJlc3VsdCB1cGRhdGUoUmV2V2FsayB3YWxrKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXF1aXJlQ2FuRG9VcGRhdGUoKTsKIAkJdHJ5IHsKIAkJCXJldHVybiByZXN1bHQgPSB1cGRhdGVJbXBsKHdhbGssIG5ldyBTdG9yZSgpIHsKQEAgLTY1OSw3ICs2NTksNyBAQCBwdWJsaWMgUmVzdWx0IGRlbGV0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHJldHVybiB0aGUgcmVzdWx0IHN0YXR1cyBvZiB0aGUgZGVsZXRlLgogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBSZXN1bHQgZGVsZXRlKGZpbmFsIFJldldhbGsgd2FsaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgUmVzdWx0IGRlbGV0ZShSZXZXYWxrIHdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyBteU5hbWUgPSBkZXRhY2hpbmdTeW1ib2xpY1JlZgogCQkJCT8gZ2V0UmVmKCkuZ2V0TmFtZSgpCiAJCQkJOiBnZXRSZWYoKS5nZXRMZWFmKCkuZ2V0TmFtZSgpOwpAQCAtNzMxLDcgKzczMSw3IEBAIHB1YmxpYyBSZXN1bHQgbGluayhTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZXN1bHQgdXBkYXRlSW1wbChmaW5hbCBSZXZXYWxrIHdhbGssIGZpbmFsIFN0b3JlIHN0b3JlKQorCXByaXZhdGUgUmVzdWx0IHVwZGF0ZUltcGwoUmV2V2FsayB3YWxrLCBTdG9yZSBzdG9yZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCVJldk9iamVjdCBuZXdPYmo7CiAJCVJldk9iamVjdCBvbGRPYmo7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZWZXcml0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZldyaXRlci5qYXZhCmluZGV4IDkwYTAzNTAuLjcxZWU5NjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZldyaXRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlZldyaXRlci5qYXZhCkBAIC0xMTYsNyArMTE2LDcgQEAgcHVibGljIFJlZldyaXRlcihSZWZMaXN0PFJlZj4gcmVmcykgewogCXB1YmxpYyB2b2lkIHdyaXRlSW5mb1JlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdXcml0ZXIgdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKIAkJZmluYWwgY2hhcltdIHRtcCA9IG5ldyBjaGFyW0NvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSF07Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZWZzKSB7CisJCWZvciAoUmVmIHIgOiByZWZzKSB7CiAJCQlpZiAoQ29uc3RhbnRzLkhFQUQuZXF1YWxzKHIuZ2V0TmFtZSgpKSkgewogCQkJCS8vIEhpc3RvcmljYWxseSBIRUFEIGhhcyBuZXZlciBiZWVuIHB1Ymxpc2hlZCB0aHJvdWdoCiAJCQkJLy8gdGhlIElORk9fUkVGUyBmaWxlLiBUaGlzIGlzIGEgbWlzdGFrZSwgYnV0IGl0cyB0aGUKQEAgLTE2MSw3ICsxNjEsNyBAQCBwdWJsaWMgdm9pZCB3cml0ZUluZm9SZWZzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKi8KIAlwdWJsaWMgdm9pZCB3cml0ZVBhY2tlZFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlib29sZWFuIHBlZWxlZCA9IGZhbHNlOwotCQlmb3IgKGZpbmFsIFJlZiByIDogcmVmcykgeworCQlmb3IgKFJlZiByIDogcmVmcykgewogCQkJaWYgKHIuZ2V0U3RvcmFnZSgpLmlzUGFja2VkKCkgJiYgci5pc1BlZWxlZCgpKSB7CiAJCQkJcGVlbGVkID0gdHJ1ZTsKIAkJCQlicmVhazsKQEAgLTE3Nyw3ICsxNzcsNyBAQCBwdWJsaWMgdm9pZCB3cml0ZVBhY2tlZFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKIAkJZmluYWwgY2hhcltdIHRtcCA9IG5ldyBjaGFyW0NvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSF07Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZWZzKSB7CisJCWZvciAoUmVmIHIgOiByZWZzKSB7CiAJCQlpZiAoci5nZXRTdG9yYWdlKCkgIT0gUmVmLlN0b3JhZ2UuUEFDS0VEKQogCQkJCWNvbnRpbnVlOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9SZXBvc2l0b3J5LmphdmEKaW5kZXggZGI1Y2FkMC4uMjljYzE5YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnkuamF2YQpAQCAtMTY0LDcgKzE2NCw3IEBAIHB1YmxpYyBzdGF0aWMgTGlzdGVuZXJMaXN0IGdldEdsb2JhbExpc3RlbmVyTGlzdCgpIHsKIAkgKiBAcGFyYW0gb3B0aW9ucwogCSAqICAgICAgICAgICAgb3B0aW9ucyB0byBjb25maWd1cmUgdGhlIHJlcG9zaXRvcnkuCiAJICovCi0JcHJvdGVjdGVkIFJlcG9zaXRvcnkoZmluYWwgQmFzZVJlcG9zaXRvcnlCdWlsZGVyIG9wdGlvbnMpIHsKKwlwcm90ZWN0ZWQgUmVwb3NpdG9yeShCYXNlUmVwb3NpdG9yeUJ1aWxkZXIgb3B0aW9ucykgewogCQlnaXREaXIgPSBvcHRpb25zLmdldEdpdERpcigpOwogCQlmcyA9IG9wdGlvbnMuZ2V0RlMoKTsKIAkJd29ya1RyZWUgPSBvcHRpb25zLmdldFdvcmtUcmVlKCk7CkBAIC0zNDQsNyArMzQ0LDcgQEAgcHVibGljIGJvb2xlYW4gaGFzT2JqZWN0KEFueU9iamVjdElkIG9iamVjdElkKSB7CiAJICogICAgICAgICAgICAgdGhlIG9iamVjdCBzdG9yZSBjYW5ub3QgYmUgYWNjZXNzZWQuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgT2JqZWN0TG9hZGVyIG9wZW4oZmluYWwgQW55T2JqZWN0SWQgb2JqZWN0SWQpCisJcHVibGljIE9iamVjdExvYWRlciBvcGVuKEFueU9iamVjdElkIG9iamVjdElkKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGdldE9iamVjdERhdGFiYXNlKCkub3BlbihvYmplY3RJZCk7CiAJfQpAQCAtMzkyLDcgKzM5Miw3IEBAIHB1YmxpYyBPYmplY3RMb2FkZXIgb3BlbihBbnlPYmplY3RJZCBvYmplY3RJZCwgaW50IHR5cGVIaW50KQogCSAqICAgICAgICAgICAgIHRvIHRoZSBiYXNlIHJlZiwgYXMgdGhlIHN5bWJvbGljIHJlZiBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZWZVcGRhdGUgdXBkYXRlUmVmKGZpbmFsIFN0cmluZyByZWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIFJlZlVwZGF0ZSB1cGRhdGVSZWYoU3RyaW5nIHJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHVwZGF0ZVJlZihyZWYsIGZhbHNlKTsKIAl9CiAKQEAgLTQxMSw3ICs0MTEsNyBAQCBwdWJsaWMgUmVmVXBkYXRlIHVwZGF0ZVJlZihmaW5hbCBTdHJpbmcgcmVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgICAgIHRvIHRoZSBiYXNlIHJlZiwgYXMgdGhlIHN5bWJvbGljIHJlZiBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZWZVcGRhdGUgdXBkYXRlUmVmKGZpbmFsIFN0cmluZyByZWYsIGZpbmFsIGJvb2xlYW4gZGV0YWNoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBSZWZVcGRhdGUgdXBkYXRlUmVmKFN0cmluZyByZWYsIGJvb2xlYW4gZGV0YWNoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gZ2V0UmVmRGF0YWJhc2UoKS5uZXdVcGRhdGUocmVmLCBkZXRhY2gpOwogCX0KIApAQCAtNDI3LDcgKzQyNyw3IEBAIHB1YmxpYyBSZWZVcGRhdGUgdXBkYXRlUmVmKGZpbmFsIFN0cmluZyByZWYsIGZpbmFsIGJvb2xlYW4gZGV0YWNoKSB0aHJvd3MgSU9FeGNlCiAJICogICAgICAgICAgICAgdGhlIHJlbmFtZSBjb3VsZCBub3QgYmUgcGVyZm9ybWVkLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJlZlJlbmFtZSByZW5hbWVSZWYoZmluYWwgU3RyaW5nIGZyb21SZWYsIGZpbmFsIFN0cmluZyB0b1JlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgUmVmUmVuYW1lIHJlbmFtZVJlZihTdHJpbmcgZnJvbVJlZiwgU3RyaW5nIHRvUmVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gZ2V0UmVmRGF0YWJhc2UoKS5uZXdSZW5hbWUoZnJvbVJlZiwgdG9SZWYpOwogCX0KIApAQCAtNDgyLDEzICs0ODIsMTMgQEAgcHVibGljIFJlZlJlbmFtZSByZW5hbWVSZWYoZmluYWwgU3RyaW5nIGZyb21SZWYsIGZpbmFsIFN0cmluZyB0b1JlZikgdGhyb3dzIElPRXgKIAkgKiAgICAgICAgICAgICBvbiBzZXJpb3VzIGVycm9ycwogCSAqLwogCUBOdWxsYWJsZQotCXB1YmxpYyBPYmplY3RJZCByZXNvbHZlKGZpbmFsIFN0cmluZyByZXZzdHIpCisJcHVibGljIE9iamVjdElkIHJlc29sdmUoU3RyaW5nIHJldnN0cikKIAkJCXRocm93cyBBbWJpZ3VvdXNPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlSZXZpc2lvblN5bnRheEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2Fsayh0aGlzKSkgewogCQkJT2JqZWN0IHJlc29sdmVkID0gcmVzb2x2ZShydywgcmV2c3RyKTsKIAkJCWlmIChyZXNvbHZlZCBpbnN0YW5jZW9mIFN0cmluZykgewotCQkJCWZpbmFsIFJlZiByZWYgPSBnZXRSZWYoKFN0cmluZylyZXNvbHZlZCk7CisJCQkJZmluYWwgUmVmIHJlZiA9IGZpbmRSZWYoKFN0cmluZykgcmVzb2x2ZWQpOwogCQkJCXJldHVybiByZWYgIT0gbnVsbCA/IHJlZi5nZXRMZWFmKCkuZ2V0T2JqZWN0SWQoKSA6IG51bGw7CiAJCQl9IGVsc2UgewogCQkJCXJldHVybiAoT2JqZWN0SWQpIHJlc29sdmVkOwpAQCAtNTA5LDcgKzUwOSw3IEBAIHB1YmxpYyBPYmplY3RJZCByZXNvbHZlKGZpbmFsIFN0cmluZyByZXZzdHIpCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCiAJQE51bGxhYmxlCi0JcHVibGljIFN0cmluZyBzaW1wbGlmeShmaW5hbCBTdHJpbmcgcmV2c3RyKQorCXB1YmxpYyBTdHJpbmcgc2ltcGxpZnkoU3RyaW5nIHJldnN0cikKIAkJCXRocm93cyBBbWJpZ3VvdXNPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsodGhpcykpIHsKIAkJCU9iamVjdCByZXNvbHZlZCA9IHJlc29sdmUocncsIHJldnN0cik7CkBAIC01MjMsNyArNTIzLDcgQEAgcHVibGljIFN0cmluZyBzaW1wbGlmeShmaW5hbCBTdHJpbmcgcmV2c3RyKQogCX0KIAogCUBOdWxsYWJsZQotCXByaXZhdGUgT2JqZWN0IHJlc29sdmUoZmluYWwgUmV2V2FsayBydywgZmluYWwgU3RyaW5nIHJldnN0cikKKwlwcml2YXRlIE9iamVjdCByZXNvbHZlKFJldldhbGsgcncsIFN0cmluZyByZXZzdHIpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQljaGFyW10gcmV2Q2hhcnMgPSByZXZzdHIudG9DaGFyQXJyYXkoKTsKIAkJUmV2T2JqZWN0IHJldiA9IG51bGw7CkBAIC02ODgsNiArNjg4LDggQEAgcHJpdmF0ZSBPYmplY3QgcmVzb2x2ZShmaW5hbCBSZXZXYWxrIHJ3LCBmaW5hbCBTdHJpbmcgcmV2c3RyKQogCQkJY2FzZSAnQCc6CiAJCQkJaWYgKHJldiAhPSBudWxsKQogCQkJCQl0aHJvdyBuZXcgUmV2aXNpb25TeW50YXhFeGNlcHRpb24ocmV2c3RyKTsKKwkJCQlpZiAoaSArIDEgPT0gcmV2Q2hhcnMubGVuZ3RoKQorCQkJCQljb250aW51ZTsKIAkJCQlpZiAoaSArIDEgPCByZXZDaGFycy5sZW5ndGggJiYgcmV2Q2hhcnNbaSArIDFdICE9ICd7JykKIAkJCQkJY29udGludWU7CiAJCQkJaW50IG07CkBAIC03MTEsNyArNzEzLDcgQEAgcHJpdmF0ZSBPYmplY3QgcmVzb2x2ZShmaW5hbCBSZXZXYWxrIHJ3LCBmaW5hbCBTdHJpbmcgcmV2c3RyKQogCQkJCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkUmVmTmFtZSwKIAkJCQkJCQkJCQkJbmFtZSksCiAJCQkJCQkJCQlyZXZzdHIpOwotCQkJCQkJUmVmIHJlZiA9IGdldFJlZihuYW1lKTsKKwkJCQkJCVJlZiByZWYgPSBmaW5kUmVmKG5hbWUpOwogCQkJCQkJbmFtZSA9IG51bGw7CiAJCQkJCQlpZiAocmVmID09IG51bGwpCiAJCQkJCQkJcmV0dXJuIG51bGw7CkBAIC03NjQsNyArNzY2LDcgQEAgcHJpdmF0ZSBPYmplY3QgcmVzb2x2ZShmaW5hbCBSZXZXYWxrIHJ3LCBmaW5hbCBTdHJpbmcgcmV2c3RyKQogCQkJCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkUmVmTmFtZSwKIAkJCQkJCQkJCQkJbmFtZSksCiAJCQkJCQkJCQlyZXZzdHIpOwotCQkJCQkJUmVmIHJlZiA9IGdldFJlZihuYW1lKTsKKwkJCQkJCVJlZiByZWYgPSBmaW5kUmVmKG5hbWUpOwogCQkJCQkJbmFtZSA9IG51bGw7CiAJCQkJCQlpZiAocmVmID09IG51bGwpCiAJCQkJCQkJcmV0dXJuIG51bGw7CkBAIC04MTUsNyArODE3LDcgQEAgcHJpdmF0ZSBPYmplY3QgcmVzb2x2ZShmaW5hbCBSZXZXYWxrIHJ3LCBmaW5hbCBTdHJpbmcgcmV2c3RyKQogCQkJdGhyb3cgbmV3IFJldmlzaW9uU3ludGF4RXhjZXB0aW9uKAogCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5pbnZhbGlkUmVmTmFtZSwgbmFtZSksCiAJCQkJCXJldnN0cik7Ci0JCWlmIChnZXRSZWYobmFtZSkgIT0gbnVsbCkKKwkJaWYgKGZpbmRSZWYobmFtZSkgIT0gbnVsbCkKIAkJCXJldHVybiBuYW1lOwogCQlyZXR1cm4gcmVzb2x2ZVNpbXBsZShuYW1lKTsKIAl9CkBAIC04NDEsNyArODQzLDcgQEAgcHJpdmF0ZSBSZXZPYmplY3QgcGFyc2VTaW1wbGUoUmV2V2FsayBydywgU3RyaW5nIHJldnN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAl9CiAKIAlATnVsbGFibGUKLQlwcml2YXRlIE9iamVjdElkIHJlc29sdmVTaW1wbGUoZmluYWwgU3RyaW5nIHJldnN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIE9iamVjdElkIHJlc29sdmVTaW1wbGUoU3RyaW5nIHJldnN0cikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKE9iamVjdElkLmlzSWQocmV2c3RyKSkKIAkJCXJldHVybiBPYmplY3RJZC5mcm9tU3RyaW5nKHJldnN0cik7CiAKQEAgLTkxMSw3ICs5MTMsNyBAQCBwcml2YXRlIFJldkNvbW1pdCByZXNvbHZlUmVmbG9nKFJldldhbGsgcncsIFJlZiByZWYsIFN0cmluZyB0aW1lKQogCX0KIAogCUBOdWxsYWJsZQotCXByaXZhdGUgT2JqZWN0SWQgcmVzb2x2ZUFiYnJldmlhdGlvbihmaW5hbCBTdHJpbmcgcmV2c3RyKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJcHJpdmF0ZSBPYmplY3RJZCByZXNvbHZlQWJicmV2aWF0aW9uKFN0cmluZyByZXZzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCUFtYmlndW91c09iamVjdEV4Y2VwdGlvbiB7CiAJCUFiYnJldmlhdGVkT2JqZWN0SWQgaWQgPSBBYmJyZXZpYXRlZE9iamVjdElkLmZyb21TdHJpbmcocmV2c3RyKTsKIAkJdHJ5IChPYmplY3RSZWFkZXIgcmVhZGVyID0gbmV3T2JqZWN0UmVhZGVyKCkpIHsKQEAgLTEwNTksMjQgKzEwNjEsNiBAQCBwdWJsaWMgU2V0PE9iamVjdElkPiBnZXRBZGRpdGlvbmFsSGF2ZXMoKSB7CiAJICogR2V0IGEgcmVmIGJ5IG5hbWUuCiAJICoKIAkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHJlZiB0byBsb29rdXAuIE1heSBiZSBhIHNob3J0LWhhbmQgZm9ybSwgZS5nLgotCSAqICAgICAgICAgICAgIm1hc3RlciIgd2hpY2ggaXMgaXMgYXV0b21hdGljYWxseSBleHBhbmRlZCB0bwotCSAqICAgICAgICAgICAgInJlZnMvaGVhZHMvbWFzdGVyIiBpZiAicmVmcy9oZWFkcy9tYXN0ZXIiIGFscmVhZHkgZXhpc3RzLgotCSAqIEByZXR1cm4gdGhlIFJlZiB3aXRoIHRoZSBnaXZlbiBuYW1lLCBvciB7QGNvZGUgbnVsbH0gaWYgaXQgZG9lcyBub3QgZXhpc3QKLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNleGFjdFJlZihTdHJpbmcpfSBvciB7QGxpbmsgI2ZpbmRSZWYoU3RyaW5nKX0KLQkgKiBpbnN0ZWFkLgotCSAqLwotCUBEZXByZWNhdGVkCi0JQE51bGxhYmxlCi0JcHVibGljIFJlZiBnZXRSZWYoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBmaW5kUmVmKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIEdldCBhIHJlZiBieSBuYW1lLgotCSAqCi0JICogQHBhcmFtIG5hbWUKIAkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSByZWYgdG8gbG9va3VwLiBNdXN0IG5vdCBiZSBhIHNob3J0LWhhbmQKIAkgKiAgICAgICAgICAgIGZvcm07IGUuZy4sICJtYXN0ZXIiIGlzIG5vdCBhdXRvbWF0aWNhbGx5IGV4cGFuZGVkIHRvCiAJICogICAgICAgICAgICAicmVmcy9oZWFkcy9tYXN0ZXIiLgpAQCAtMTA4NSw3ICsxMDY5LDcgQEAgcHVibGljIFJlZiBnZXRSZWYoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHNpbmNlIDQuMgogCSAqLwogCUBOdWxsYWJsZQotCXB1YmxpYyBSZWYgZXhhY3RSZWYoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGZpbmFsIFJlZiBleGFjdFJlZihTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGdldFJlZkRhdGFiYXNlKCkuZXhhY3RSZWYobmFtZSk7CiAJfQogCkBAIC0xMTAxLDcgKzEwODUsNyBAQCBwdWJsaWMgUmVmIGV4YWN0UmVmKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEBzaW5jZSA0LjIKIAkgKi8KIAlATnVsbGFibGUKLQlwdWJsaWMgUmVmIGZpbmRSZWYoU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGZpbmFsIFJlZiBmaW5kUmVmKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWYobmFtZSk7CiAJfQogCkBAIC0xMTI2LDcgKzExMTAsOSBAQCBwdWJsaWMgTWFwPFN0cmluZywgUmVmPiBnZXRBbGxSZWZzKCkgewogCSAqIEByZXR1cm4gbXV0YWJsZSBtYXAgb2YgYWxsIHRhZ3M7IGtleSBpcyBzaG9ydCB0YWcgbmFtZSAoInYxLjAiKSBhbmQgdmFsdWUKIAkgKiAgICAgICAgIG9mIHRoZSBlbnRyeSBjb250YWlucyB0aGUgcmVmIHdpdGggdGhlIGZ1bGwgdGFnIG5hbWUKIAkgKiAgICAgICAgICgicmVmcy90YWdzL3YxLjAiKS4KKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0Bjb2RlIGdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmc0J5UHJlZml4KFJfVEFHUyl9IGluc3RlYWQKIAkgKi8KKwlARGVwcmVjYXRlZAogCUBOb25OdWxsCiAJcHVibGljIE1hcDxTdHJpbmcsIFJlZj4gZ2V0VGFncygpIHsKIAkJdHJ5IHsKQEAgLTExNDksOSArMTEzNSwxMSBAQCBwdWJsaWMgTWFwPFN0cmluZywgUmVmPiBnZXRUYWdzKCkgewogCSAqICAgICAgICAgbmV3IFJlZiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzYW1lIGRhdGEgYXMgUmVmLCBidXQgaXNQZWVsZWQoKQogCSAqICAgICAgICAgd2lsbCBiZSB0cnVlIGFuZCBnZXRQZWVsZWRPYmplY3RJZCB3aWxsIGNvbnRhaW4gdGhlIHBlZWxlZCBvYmplY3QKIAkgKiAgICAgICAgIChvciBudWxsKS4KKwkgKiBAZGVwcmVjYXRlZCB1c2Uge0Bjb2RlIGdldFJlZkRhdGFiYXNlKCkucGVlbChyZWYpfSBpbnN0ZWFkLgogCSAqLworCUBEZXByZWNhdGVkCiAJQE5vbk51bGwKLQlwdWJsaWMgUmVmIHBlZWwoZmluYWwgUmVmIHJlZikgeworCXB1YmxpYyBSZWYgcGVlbChSZWYgcmVmKSB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gZ2V0UmVmRGF0YWJhc2UoKS5wZWVsKHJlZik7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTEyODUsNyArMTI3Myw3IEBAIHB1YmxpYyBEaXJDYWNoZSBsb2NrRGlyQ2FjaGUoKSB0aHJvd3MgTm9Xb3JrVHJlZUV4Y2VwdGlvbiwKIAkJSW5kZXhDaGFuZ2VkTGlzdGVuZXIgbCA9IG5ldyBJbmRleENoYW5nZWRMaXN0ZW5lcigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIHZvaWQgb25JbmRleENoYW5nZWQoSW5kZXhDaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlub3RpZnlJbmRleENoYW5nZWQoKTsKKwkJCQlub3RpZnlJbmRleENoYW5nZWQodHJ1ZSk7CiAJCQl9CiAJCX07CiAJCXJldHVybiBEaXJDYWNoZS5sb2NrKHRoaXMsIGwpOwpAQCAtMTM3OCw3ICsxMzY2LDcgQEAgcHVibGljIFJlcG9zaXRvcnlTdGF0ZSBnZXRSZXBvc2l0b3J5U3RhdGUoKSB7CiAJICogQHBhcmFtIHJlZk5hbWUgYSB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30gb2JqZWN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiByZWZOYW1lIGlzIGEgdmFsaWQgcmVmIG5hbWUKIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFJlZk5hbWUoZmluYWwgU3RyaW5nIHJlZk5hbWUpIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFJlZk5hbWUoU3RyaW5nIHJlZk5hbWUpIHsKIAkJZmluYWwgaW50IGxlbiA9IHJlZk5hbWUubGVuZ3RoKCk7CiAJCWlmIChsZW4gPT0gMCkgewogCQkJcmV0dXJuIGZhbHNlOwpAQCAtMTU4MCwxNiArMTU2OCwyMiBAQCBwdWJsaWMgRmlsZSBnZXRXb3JrVHJlZSgpIHRocm93cyBOb1dvcmtUcmVlRXhjZXB0aW9uIHsKIAl9CiAKIAkvKioKLQkgKiBGb3JjZSBhIHNjYW4gZm9yIGNoYW5nZWQgcmVmcy4KKwkgKiBGb3JjZSBhIHNjYW4gZm9yIGNoYW5nZWQgcmVmcy4gRmlyZXMgYW4gSW5kZXhDaGFuZ2VkRXZlbnQoZmFsc2UpIGlmCisJICogY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuCiAJICoKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KIAlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzY2FuRm9yUmVwb0NoYW5nZXMoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKIAkvKioKLQkgKiBOb3RpZnkgdGhhdCB0aGUgaW5kZXggY2hhbmdlZAorCSAqIE5vdGlmeSB0aGF0IHRoZSBpbmRleCBjaGFuZ2VkIGJ5IGZpcmluZyBhbiBJbmRleENoYW5nZWRFdmVudC4KKwkgKgorCSAqIEBwYXJhbSBpbnRlcm5hbAorCSAqICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIHRydWV9IGlmIHRoZSBpbmRleCB3YXMgY2hhbmdlZCBieSB0aGUgc2FtZQorCSAqICAgICAgICAgICAgICAgICAgICAgSkdpdCBwcm9jZXNzCisJICogQHNpbmNlIDUuMAogCSAqLwotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeUluZGV4Q2hhbmdlZCgpOworCXB1YmxpYyBhYnN0cmFjdCB2b2lkIG5vdGlmeUluZGV4Q2hhbmdlZChib29sZWFuIGludGVybmFsKTsKIAogCS8qKgogCSAqIEdldCBhIHNob3J0ZW5lZCBtb3JlIHVzZXIgZnJpZW5kbHkgcmVmIG5hbWUKQEAgLTE5NjgsMTEgKzE5NjIsOCBAQCBwcml2YXRlIFN0cmluZyByZWFkQ29tbWl0TXNnRmlsZShTdHJpbmcgbXNnRmlsZW5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAlwcml2YXRlIHZvaWQgd3JpdGVDb21taXRNc2coRmlsZSBtc2dGaWxlLCBTdHJpbmcgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAobXNnICE9IG51bGwpIHsKLQkJCUZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0obXNnRmlsZSk7Ci0JCQl0cnkgeworCQkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG1zZ0ZpbGUpKSB7CiAJCQkJZm9zLndyaXRlKG1zZy5nZXRCeXRlcyhDb25zdGFudHMuQ0hBUkFDVEVSX0VOQ09ESU5HKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZvcy5jbG9zZSgpOwogCQkJfQogCQl9IGVsc2UgewogCQkJRmlsZVV0aWxzLmRlbGV0ZShtc2dGaWxlLCBGaWxlVXRpbHMuU0tJUF9NSVNTSU5HKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlDYWNoZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvUmVwb3NpdG9yeUNhY2hlLmphdmEKaW5kZXggY2U3Y2U4Yy4uNDAwMzQyYjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlDYWNoZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1JlcG9zaXRvcnlDYWNoZS5qYXZhCkBAIC04OCw3ICs4OCw3IEBAIHB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5Q2FjaGUgewogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuUmVwb3NpdG9yeU5vdEZvdW5kRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlcmUgaXMgbm8gcmVwb3NpdG9yeSBhdCB0aGUgZ2l2ZW4gbG9jYXRpb24uCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXBvc2l0b3J5IG9wZW4oZmluYWwgS2V5IGxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJcHVibGljIHN0YXRpYyBSZXBvc2l0b3J5IG9wZW4oS2V5IGxvY2F0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlSZXBvc2l0b3J5Tm90Rm91bmRFeGNlcHRpb24gewogCQlyZXR1cm4gb3Blbihsb2NhdGlvbiwgdHJ1ZSk7CiAJfQpAQCAtMTE1LDcgKzExNSw3IEBAIHB1YmxpYyBzdGF0aWMgUmVwb3NpdG9yeSBvcGVuKGZpbmFsIEtleSBsb2NhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uLAogCSAqICAgICAgICAgICAgIFRoZXJlIGlzIG5vIHJlcG9zaXRvcnkgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLCBvbmx5IHRocm93biBpZgogCSAqICAgICAgICAgICAgIHtAY29kZSBtdXN0RXhpc3R9IGlzIHRydWUuCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXBvc2l0b3J5IG9wZW4oZmluYWwgS2V5IGxvY2F0aW9uLCBmaW5hbCBib29sZWFuIG11c3RFeGlzdCkKKwlwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnkgb3BlbihLZXkgbG9jYXRpb24sIGJvb2xlYW4gbXVzdEV4aXN0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGNhY2hlLm9wZW5SZXBvc2l0b3J5KGxvY2F0aW9uLCBtdXN0RXhpc3QpOwogCX0KQEAgLTEzNSw3ICsxMzUsNyBAQCBwdWJsaWMgc3RhdGljIFJlcG9zaXRvcnkgb3BlbihmaW5hbCBLZXkgbG9jYXRpb24sIGZpbmFsIGJvb2xlYW4gbXVzdEV4aXN0KQogCSAqIEBwYXJhbSBkYgogCSAqICAgICAgICAgICAgcmVwb3NpdG9yeSB0byByZWdpc3Rlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXIoZmluYWwgUmVwb3NpdG9yeSBkYikgeworCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihSZXBvc2l0b3J5IGRiKSB7CiAJCWlmIChkYi5nZXREaXJlY3RvcnkoKSAhPSBudWxsKSB7CiAJCQlGaWxlS2V5IGtleSA9IEZpbGVLZXkuZXhhY3QoZGIuZ2V0RGlyZWN0b3J5KCksIGRiLmdldEZTKCkpOwogCQkJY2FjaGUucmVnaXN0ZXJSZXBvc2l0b3J5KGtleSwgZGIpOwpAQCAtMTUxLDcgKzE1MSw3IEBAIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CiAJICogQHBhcmFtIGRiCiAJICogICAgICAgICAgICByZXBvc2l0b3J5IHRvIHVucmVnaXN0ZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGNsb3NlKEBOb25OdWxsIGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoQE5vbk51bGwgUmVwb3NpdG9yeSBkYikgewogCQlpZiAoZGIuZ2V0RGlyZWN0b3J5KCkgIT0gbnVsbCkgewogCQkJRmlsZUtleSBrZXkgPSBGaWxlS2V5LmV4YWN0KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKTsKIAkJCWNhY2hlLnVucmVnaXN0ZXJBbmRDbG9zZVJlcG9zaXRvcnkoa2V5KTsKQEAgLTE3MCw3ICsxNzAsNyBAQCBwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2UoQE5vbk51bGwgZmluYWwgUmVwb3NpdG9yeSBkYikgewogCSAqICAgICAgICAgICAgcmVwb3NpdG9yeSB0byB1bnJlZ2lzdGVyLgogCSAqIEBzaW5jZSA0LjMKIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgdW5yZWdpc3RlcihmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CisJcHVibGljIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXIoUmVwb3NpdG9yeSBkYikgewogCQlpZiAoZGIuZ2V0RGlyZWN0b3J5KCkgIT0gbnVsbCkgewogCQkJdW5yZWdpc3RlcihGaWxlS2V5LmV4YWN0KGRiLmdldERpcmVjdG9yeSgpLCBkYi5nZXRGUygpKSk7CiAJCX0KQEAgLTI4NywxMyArMjg3LDEzIEBAIHByaXZhdGUgUmVwb3NpdG9yeSBvcGVuUmVwb3NpdG9yeShmaW5hbCBLZXkgbG9jYXRpb24sCiAJCXJldHVybiBkYjsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVnaXN0ZXJSZXBvc2l0b3J5KGZpbmFsIEtleSBsb2NhdGlvbiwgZmluYWwgUmVwb3NpdG9yeSBkYikgewotCQlSZXBvc2l0b3J5IG9sZERiID0gY2FjaGVNYXAucHV0KGxvY2F0aW9uLCBkYik7Ci0JCWlmIChvbGREYiAhPSBudWxsKQotCQkJb2xkRGIuY2xvc2UoKTsKKwlwcml2YXRlIHZvaWQgcmVnaXN0ZXJSZXBvc2l0b3J5KEtleSBsb2NhdGlvbiwgUmVwb3NpdG9yeSBkYikgeworCQl0cnkgKFJlcG9zaXRvcnkgb2xkRGIgPSBjYWNoZU1hcC5wdXQobG9jYXRpb24sIGRiKSkgeworCQkJLy8gb2xkRGIgaXMgYXV0by1jbG9zZWQKKwkJfQogCX0KIAotCXByaXZhdGUgUmVwb3NpdG9yeSB1bnJlZ2lzdGVyUmVwb3NpdG9yeShmaW5hbCBLZXkgbG9jYXRpb24pIHsKKwlwcml2YXRlIFJlcG9zaXRvcnkgdW5yZWdpc3RlclJlcG9zaXRvcnkoS2V5IGxvY2F0aW9uKSB7CiAJCXJldHVybiBjYWNoZU1hcC5yZW1vdmUobG9jYXRpb24pOwogCX0KIApAQCAtMzAyLDcgKzMwMiw3IEBAIHByaXZhdGUgYm9vbGVhbiBpc0V4cGlyZWQoUmVwb3NpdG9yeSBkYikgewogCQkJJiYgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gZGIuY2xvc2VkQXQuZ2V0KCkgPiBleHBpcmVBZnRlcik7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJBbmRDbG9zZVJlcG9zaXRvcnkoZmluYWwgS2V5IGxvY2F0aW9uKSB7CisJcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJBbmRDbG9zZVJlcG9zaXRvcnkoS2V5IGxvY2F0aW9uKSB7CiAJCXN5bmNocm9uaXplZCAobG9ja0Zvcihsb2NhdGlvbikpIHsKIAkJCVJlcG9zaXRvcnkgb2xkRGIgPSB1bnJlZ2lzdGVyUmVwb3NpdG9yeShsb2NhdGlvbik7CiAJCQlpZiAob2xkRGIgIT0gbnVsbCkgewpAQCAtMzI5LDcgKzMyOSw3IEBAIHByaXZhdGUgdm9pZCBjbGVhckFsbCgpIHsKIAkJfQogCX0KIAotCXByaXZhdGUgTG9jayBsb2NrRm9yKGZpbmFsIEtleSBsb2NhdGlvbikgeworCXByaXZhdGUgTG9jayBsb2NrRm9yKEtleSBsb2NhdGlvbikgewogCQlyZXR1cm4gb3BlbkxvY2tzWyhsb2NhdGlvbi5oYXNoQ29kZSgpID4+PiAxKSAlIG9wZW5Mb2Nrcy5sZW5ndGhdOwogCX0KIApAQCAtMzgzLDcgKzM4Myw3IEBAIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsZUtleSBpbXBsZW1lbnRzIEtleSB7CiAJCSAqIEByZXR1cm4gYSBrZXkgZm9yIHRoZSBnaXZlbiBkaXJlY3RvcnkuCiAJCSAqIEBzZWUgI2xlbmllbnQoRmlsZSwgRlMpCiAJCSAqLwotCQlwdWJsaWMgc3RhdGljIEZpbGVLZXkgZXhhY3QoZmluYWwgRmlsZSBkaXJlY3RvcnksIEZTIGZzKSB7CisJCXB1YmxpYyBzdGF0aWMgRmlsZUtleSBleGFjdChGaWxlIGRpcmVjdG9yeSwgRlMgZnMpIHsKIAkJCXJldHVybiBuZXcgRmlsZUtleShkaXJlY3RvcnksIGZzKTsKIAkJfQogCkBAIC00MDYsNyArNDA2LDcgQEAgcHVibGljIHN0YXRpYyBGaWxlS2V5IGV4YWN0KGZpbmFsIEZpbGUgZGlyZWN0b3J5LCBGUyBmcykgewogCQkgKiBAcmV0dXJuIGEga2V5IGZvciB0aGUgZ2l2ZW4gZGlyZWN0b3J5LgogCQkgKiBAc2VlICNleGFjdChGaWxlLCBGUykKIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgRmlsZUtleSBsZW5pZW50KGZpbmFsIEZpbGUgZGlyZWN0b3J5LCBGUyBmcykgeworCQlwdWJsaWMgc3RhdGljIEZpbGVLZXkgbGVuaWVudChGaWxlIGRpcmVjdG9yeSwgRlMgZnMpIHsKIAkJCWZpbmFsIEZpbGUgZ2l0ZGlyID0gcmVzb2x2ZShkaXJlY3RvcnksIGZzKTsKIAkJCXJldHVybiBuZXcgRmlsZUtleShnaXRkaXIgIT0gbnVsbCA/IGdpdGRpciA6IGRpcmVjdG9yeSwgZnMpOwogCQl9CkBAIC00MjEsMTIgKzQyMSwxMiBAQCBwdWJsaWMgc3RhdGljIEZpbGVLZXkgbGVuaWVudChmaW5hbCBGaWxlIGRpcmVjdG9yeSwgRlMgZnMpIHsKIAkJICogICAgICAgICAgICB0aGUgZmlsZSBzeXN0ZW0gYWJzdHJhY3Rpb24gd2hpY2ggd2lsbCBiZSBuZWNlc3NhcnkgdG8KIAkJICogICAgICAgICAgICBwZXJmb3JtIGNlcnRhaW4gZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4KIAkJICovCi0JCXByb3RlY3RlZCBGaWxlS2V5KGZpbmFsIEZpbGUgZGlyZWN0b3J5LCBGUyBmcykgeworCQlwcm90ZWN0ZWQgRmlsZUtleShGaWxlIGRpcmVjdG9yeSwgRlMgZnMpIHsKIAkJCXBhdGggPSBjYW5vbmljYWwoZGlyZWN0b3J5KTsKIAkJCXRoaXMuZnMgPSBmczsKIAkJfQogCi0JCXByaXZhdGUgc3RhdGljIEZpbGUgY2Fub25pY2FsKGZpbmFsIEZpbGUgcGF0aCkgeworCQlwcml2YXRlIHN0YXRpYyBGaWxlIGNhbm9uaWNhbChGaWxlIHBhdGgpIHsKIAkJCXRyeSB7CiAJCQkJcmV0dXJuIHBhdGguZ2V0Q2Fub25pY2FsRmlsZSgpOwogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewpAQCAtNDQwLDcgKzQ0MCw3IEBAIHB1YmxpYyBmaW5hbCBGaWxlIGdldEZpbGUoKSB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIFJlcG9zaXRvcnkgb3BlbihmaW5hbCBib29sZWFuIG11c3RFeGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJcHVibGljIFJlcG9zaXRvcnkgb3Blbihib29sZWFuIG11c3RFeGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWlmIChtdXN0RXhpc3QgJiYgIWlzR2l0UmVwb3NpdG9yeShwYXRoLCBmcykpCiAJCQkJdGhyb3cgbmV3IFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihwYXRoKTsKIAkJCXJldHVybiBuZXcgRmlsZVJlcG9zaXRvcnkocGF0aCk7CkBAIC00NTIsNyArNDUyLDcgQEAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKwkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CiAJCQlyZXR1cm4gbyBpbnN0YW5jZW9mIEZpbGVLZXkgJiYgcGF0aC5lcXVhbHMoKChGaWxlS2V5KSBvKS5wYXRoKTsKIAkJfQogCkBAIC00NzYsMTkgKzQ3NiwxOSBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQkgKiAgICAgICAgIGl0IGRvZXNuJ3QgbG9vayBlbm91Z2ggbGlrZSBhIEdpdCBkaXJlY3RvcnkgdG8gcmVhbGx5IGJlIGEKIAkJICogICAgICAgICBHaXQgZGlyZWN0b3J5LgogCQkgKi8KLQkJcHVibGljIHN0YXRpYyBib29sZWFuIGlzR2l0UmVwb3NpdG9yeShmaW5hbCBGaWxlIGRpciwgRlMgZnMpIHsKKwkJcHVibGljIHN0YXRpYyBib29sZWFuIGlzR2l0UmVwb3NpdG9yeShGaWxlIGRpciwgRlMgZnMpIHsKIAkJCXJldHVybiBmcy5yZXNvbHZlKGRpciwgIm9iamVjdHMiKS5leGlzdHMoKSAvLyROT04tTkxTLTEkCiAJCQkJCSYmIGZzLnJlc29sdmUoZGlyLCAicmVmcyIpLmV4aXN0cygpIC8vJE5PTi1OTFMtMSQKIAkJCQkJJiYgaXNWYWxpZEhlYWQobmV3IEZpbGUoZGlyLCBDb25zdGFudHMuSEVBRCkpOwogCQl9CiAKLQkJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSGVhZChmaW5hbCBGaWxlIGhlYWQpIHsKKwkJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkSGVhZChGaWxlIGhlYWQpIHsKIAkJCWZpbmFsIFN0cmluZyByZWYgPSByZWFkRmlyc3RMaW5lKGhlYWQpOwogCQkJcmV0dXJuIHJlZiAhPSBudWxsCiAJCQkJCSYmIChyZWYuc3RhcnRzV2l0aCgicmVmOiByZWZzLyIpIHx8IE9iamVjdElkLmlzSWQocmVmKSk7IC8vJE5PTi1OTFMtMSQKIAkJfQogCi0JCXByaXZhdGUgc3RhdGljIFN0cmluZyByZWFkRmlyc3RMaW5lKGZpbmFsIEZpbGUgaGVhZCkgeworCQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVhZEZpcnN0TGluZShGaWxlIGhlYWQpIHsKIAkJCXRyeSB7CiAJCQkJZmluYWwgYnl0ZVtdIGJ1ZiA9IElPLnJlYWRGdWxseShoZWFkLCA0MDk2KTsKIAkJCQlpbnQgbiA9IGJ1Zi5sZW5ndGg7CkBAIC01MjEsNyArNTIxLDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRGaXJzdExpbmUoZmluYWwgRmlsZSBoZWFkKSB7CiAJCSAqIEByZXR1cm4gdGhlIGFjdHVhbCBkaXJlY3RvcnkgbG9jYXRpb24gaWYgYSBiZXR0ZXIgbWF0Y2ggaXMgZm91bmQ7CiAJCSAqICAgICAgICAgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWl0YWJsZSBtYXRjaC4KIAkJICovCi0JCXB1YmxpYyBzdGF0aWMgRmlsZSByZXNvbHZlKGZpbmFsIEZpbGUgZGlyZWN0b3J5LCBGUyBmcykgeworCQlwdWJsaWMgc3RhdGljIEZpbGUgcmVzb2x2ZShGaWxlIGRpcmVjdG9yeSwgRlMgZnMpIHsKIAkJCWlmIChpc0dpdFJlcG9zaXRvcnkoZGlyZWN0b3J5LCBmcykpCiAJCQkJcmV0dXJuIGRpcmVjdG9yeTsKIAkJCWlmIChpc0dpdFJlcG9zaXRvcnkobmV3IEZpbGUoZGlyZWN0b3J5LCBDb25zdGFudHMuRE9UX0dJVCksIGZzKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1RhZ0J1aWxkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1RhZ0J1aWxkZXIuamF2YQppbmRleCAzMmVmNTA0Li5iZDAzMTY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UYWdCdWlsZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVGFnQnVpbGRlci5qYXZhCkBAIC0xNjgsNyArMTY4LDcgQEAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewogCSAqIEBwYXJhbSBuZXdNZXNzYWdlCiAJICogICAgICAgICAgICB0aGUgdGFnJ3MgbWVzc2FnZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZXNzYWdlKGZpbmFsIFN0cmluZyBuZXdNZXNzYWdlKSB7CisJcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbmV3TWVzc2FnZSkgewogCQltZXNzYWdlID0gbmV3TWVzc2FnZTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1RleHRQcm9ncmVzc01vbml0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1RleHRQcm9ncmVzc01vbml0b3IuamF2YQppbmRleCA5MzZjZTNkLi4yZjc1OWU1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9UZXh0UHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVGV4dFByb2dyZXNzTW9uaXRvci5qYXZhCkBAIC00NCw3ICs0NCw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5saWI7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CkBAIC02Myw3ICs2Myw3IEBAIHB1YmxpYyBjbGFzcyBUZXh0UHJvZ3Jlc3NNb25pdG9yIGV4dGVuZHMgQmF0Y2hpbmdQcm9ncmVzc01vbml0b3IgewogCSAqIEluaXRpYWxpemUgYSBuZXcgcHJvZ3Jlc3MgbW9uaXRvci4KIAkgKi8KIAlwdWJsaWMgVGV4dFByb2dyZXNzTW9uaXRvcigpIHsKLQkJdGhpcyhuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0uZXJyLCBVVEZfOCkpKTsKKwkJdGhpcyhuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihTeXN0ZW0uZXJyLCBDSEFSU0VUKSkpOwogCX0KIAogCS8qKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVXNlckNvbmZpZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9saWIvVXNlckNvbmZpZy5qYXZhCmluZGV4IDFhM2M2ZjYuLmJmYjVlMmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbGliL1VzZXJDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L2xpYi9Vc2VyQ29uZmlnLmphdmEKQEAgLTcxLDcgKzcxLDcgQEAgcHVibGljIGNsYXNzIFVzZXJDb25maWcgewogCiAJcHJpdmF0ZSBib29sZWFuIGlzQ29tbWl0dGVyRW1haWxJbXBsaWNpdDsKIAotCXByaXZhdGUgVXNlckNvbmZpZyhmaW5hbCBDb25maWcgcmMpIHsKKwlwcml2YXRlIFVzZXJDb25maWcoQ29uZmlnIHJjKSB7CiAJCWF1dGhvck5hbWUgPSBnZXROYW1lSW50ZXJuYWwocmMsIENvbnN0YW50cy5HSVRfQVVUSE9SX05BTUVfS0VZKTsKIAkJaWYgKGF1dGhvck5hbWUgPT0gbnVsbCkgewogCQkJYXV0aG9yTmFtZSA9IGdldERlZmF1bHRVc2VyTmFtZSgpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZVN0cmF0ZWd5LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlU3RyYXRlZ3kuamF2YQppbmRleCA1MjBlYTZlLi45OGE3MDZjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlU3RyYXRlZ3kuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlU3RyYXRlZ3kuamF2YQpAQCAtMTAwLDcgKzEwMCw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXJnZVN0cmF0ZWd5IHsKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIHN0cmF0ZWd5IGJ5IHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihmaW5hbCBNZXJnZVN0cmF0ZWd5IGltcCkgeworCXB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlcihNZXJnZVN0cmF0ZWd5IGltcCkgewogCQlyZWdpc3RlcihpbXAuZ2V0TmFtZSgpLCBpbXApOwogCX0KIApAQCAtMTI5LDcgKzEyOSw3IEBAIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgcmVnaXN0ZXIoZmluYWwgU3RyaW5nIG5hbWUsCiAJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBzdHJhdGVneSB0byBsb2NhdGUuCiAJICogQHJldHVybiB0aGUgc3RyYXRlZ3kgaW5zdGFuY2U7IG51bGwgaWYgbm8gc3RyYXRlZ3kgbWF0Y2hlcyB0aGUgbmFtZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBNZXJnZVN0cmF0ZWd5IGdldChmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIE1lcmdlU3RyYXRlZ3kgZ2V0KFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBTVFJBVEVHSUVTLmdldChuYW1lKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL01lcmdlci5qYXZhCmluZGV4IGNkMTlkNjkuLjI1ZWIxYWYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvTWVyZ2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9NZXJnZXIuamF2YQpAQCAtMTEzLDcgKzExMyw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXJnZXIgewogCSAqIEBwYXJhbSBsb2NhbAogCSAqICAgICAgICAgICAgdGhlIHJlcG9zaXRvcnkgdGhpcyBtZXJnZXIgd2lsbCByZWFkIGFuZCB3cml0ZSBkYXRhIG9uLgogCSAqLwotCXByb3RlY3RlZCBNZXJnZXIoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCkgeworCXByb3RlY3RlZCBNZXJnZXIoUmVwb3NpdG9yeSBsb2NhbCkgewogCQlpZiAobG9jYWwgPT0gbnVsbCkgewogCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLnJlcG9zaXRvcnlJc1JlcXVpcmVkKTsKIAkJfQpAQCAtMjE1LDcgKzIxNSw3IEBAIHB1YmxpYyB2b2lkIHNldE9iamVjdEluc2VydGVyKE9iamVjdEluc2VydGVyIG9pKSB7CiAJICogICAgICAgICAgICAgb25lIG9yIG1vcmUgc291cmNlcyBjb3VsZCBub3QgYmUgcmVhZCwgb3Igb3V0cHV0cyBjb3VsZCBub3QKIAkgKiAgICAgICAgICAgICBiZSB3cml0dGVuIHRvIHRoZSBSZXBvc2l0b3J5LgogCSAqLwotCXB1YmxpYyBib29sZWFuIG1lcmdlKGZpbmFsIEFueU9iamVjdElkLi4uIHRpcHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIGJvb2xlYW4gbWVyZ2UoQW55T2JqZWN0SWQuLi4gdGlwcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIG1lcmdlKHRydWUsIHRpcHMpOwogCX0KIApAQCAtMjQzLDcgKzI0Myw3IEBAIHB1YmxpYyBib29sZWFuIG1lcmdlKGZpbmFsIEFueU9iamVjdElkLi4uIHRpcHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICAgb25lIG9yIG1vcmUgc291cmNlcyBjb3VsZCBub3QgYmUgcmVhZCwgb3Igb3V0cHV0cyBjb3VsZCBub3QKIAkgKiAgICAgICAgICAgICBiZSB3cml0dGVuIHRvIHRoZSBSZXBvc2l0b3J5LgogCSAqLwotCXB1YmxpYyBib29sZWFuIG1lcmdlKGZpbmFsIGJvb2xlYW4gZmx1c2gsIGZpbmFsIEFueU9iamVjdElkLi4uIHRpcHMpCisJcHVibGljIGJvb2xlYW4gbWVyZ2UoYm9vbGVhbiBmbHVzaCwgQW55T2JqZWN0SWQuLi4gdGlwcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXNvdXJjZU9iamVjdHMgPSBuZXcgUmV2T2JqZWN0W3RpcHMubGVuZ3RoXTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aXBzLmxlbmd0aDsgaSsrKQpAQCAtMzI4LDcgKzMyOCw3IEBAIHByb3RlY3RlZCBSZXZDb21taXQgZ2V0QmFzZUNvbW1pdChSZXZDb21taXQgYSwgUmV2Q29tbWl0IGIpCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHRyZWUgb2JqZWN0IGlzIG5vdCBmb3VuZCBvciBjYW5ub3QgYmUgcmVhZC4KIAkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3Igb3BlblRyZWUoZmluYWwgQW55T2JqZWN0SWQgdHJlZUlkKQorCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvciBvcGVuVHJlZShBbnlPYmplY3RJZCB0cmVlSWQpCiAJCQl0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gbmV3IENhbm9uaWNhbFRyZWVQYXJzZXIobnVsbCwgcmVhZGVyLCB0cmVlSWQpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9SZXNvbHZlTWVyZ2VyLmphdmEKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCA2ZjdhNzAyLi5kYTZhM2RhCi0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvUmVzb2x2ZU1lcmdlci5qYXZhCkBAIC01MTYsNjEgKzUxNiw2IEBAIHByaXZhdGUgRGlyQ2FjaGVFbnRyeSBrZWVwKERpckNhY2hlRW50cnkgZSkgewogCSAqIEBwYXJhbSBpZ25vcmVDb25mbGljdHMKIAkgKiAgICAgICAgICAgIHNlZQogCSAqICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubWVyZ2UuUmVzb2x2ZU1lcmdlciNtZXJnZVRyZWVzKEFic3RyYWN0VHJlZUl0ZXJhdG9yLCBSZXZUcmVlLCBSZXZUcmVlLCBib29sZWFuKX0KLQkgKiBAcmV0dXJuIDxjb2RlPmZhbHNlPC9jb2RlPiBpZiB0aGUgbWVyZ2Ugd2lsbCBmYWlsIGJlY2F1c2UgdGhlIGluZGV4IGVudHJ5Ci0JICogICAgICAgICBkaWRuJ3QgbWF0Y2ggb3VycyBvciB0aGUgd29ya2luZy1kaXIgZmlsZSB3YXMgZGlydHkgYW5kIGEKLQkgKiAgICAgICAgIGNvbmZsaWN0IG9jY3VycmVkCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5NaXNzaW5nT2JqZWN0RXhjZXB0aW9uCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uCi0JICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db3JydXB0T2JqZWN0RXhjZXB0aW9uCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQHNpbmNlIDMuNQotCSAqLwotCUBEZXByZWNhdGVkCi0JcHJvdGVjdGVkIGJvb2xlYW4gcHJvY2Vzc0VudHJ5KENhbm9uaWNhbFRyZWVQYXJzZXIgYmFzZSwKLQkJCUNhbm9uaWNhbFRyZWVQYXJzZXIgb3VycywgQ2Fub25pY2FsVHJlZVBhcnNlciB0aGVpcnMsCi0JCQlEaXJDYWNoZUJ1aWxkSXRlcmF0b3IgaW5kZXgsIFdvcmtpbmdUcmVlSXRlcmF0b3Igd29yaywKLQkJCWJvb2xlYW4gaWdub3JlQ29uZmxpY3RzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKLQkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIENvcnJ1cHRPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHByb2Nlc3NFbnRyeShiYXNlLCBvdXJzLCB0aGVpcnMsIGluZGV4LCB3b3JrLCBpZ25vcmVDb25mbGljdHMsCi0JCQkJbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIG9uZSBwYXRoIGFuZCB0cmllcyB0byBtZXJnZSB0YWtpbmcgZ2l0IGF0dHJpYnV0ZXMgaW4gYWNjb3VudC4KLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGRvIGFsbCB0cml2aWFsIChub3QgY29udGVudCkgbWVyZ2VzIGFuZCB3aWxsIGFsc28gZGV0ZWN0Ci0JICogaWYgYSBtZXJnZSB3aWxsIGZhaWwuIFRoZSBtZXJnZSB3aWxsIGZhaWwgd2hlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBpcwotCSAqIHRydWUKLQkgKiA8dWw+Ci0JICogPGxpPnRoZSBpbmRleCBlbnRyeSBkb2VzIG5vdCBtYXRjaCB0aGUgZW50cnkgaW4gb3Vycy4gV2hlbiBtZXJnaW5nIG9uZQotCSAqIGJyYW5jaCBpbnRvIHRoZSBjdXJyZW50IEhFQUQsIG91cnMgd2lsbCBwb2ludCB0byBIRUFEIGFuZCB0aGVpcnMgd2lsbAotCSAqIHBvaW50IHRvIHRoZSBvdGhlciBicmFuY2guIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgaW5kZXggbWF0Y2hlcyB0aGUgSEVBRAotCSAqIGJlY2F1c2UgaXQgd2lsbCBvbmx5IG5vdCBtYXRjaCBIRUFEIGlmIGl0IHdhcyBwb3B1bGF0ZWQgYmVmb3JlIHRoZSBtZXJnZQotCSAqIG9wZXJhdGlvbi4gQnV0IHRoZSBtZXJnZSBjb21taXQgc2hvdWxkIG5vdCBhY2NpZGVudGFsbHkgY29udGFpbgotCSAqIG1vZGlmaWNhdGlvbnMgZG9uZSBiZWZvcmUgdGhlIG1lcmdlLiBDaGVjayB0aGUgPGEgaHJlZj0KLQkgKiAiaHR0cDovL3d3dy5rZXJuZWwub3JnL3B1Yi9zb2Z0d2FyZS9zY20vZ2l0L2RvY3MvZ2l0LXJlYWQtdHJlZS5odG1sI18zX3dheV9tZXJnZSIKLQkgKiA+Z2l0IHJlYWQtdHJlZTwvYT4gZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBleHBsYW5hdGlvbnMuPC9saT4KLQkgKiA8bGk+QSBjb25mbGljdCB3YXMgZGV0ZWN0ZWQgYW5kIHRoZSB3b3JraW5nLXRyZWUgZmlsZSBpcyBkaXJ0eS4gV2hlbiBhCi0JICogY29uZmxpY3QgaXMgZGV0ZWN0ZWQgdGhlIGNvbnRlbnQtbWVyZ2UgYWxnb3JpdGhtIHdpbGwgdHJ5IHRvIHdyaXRlIGEKLQkgKiBtZXJnZWQgdmVyc2lvbiBpbnRvIHRoZSB3b3JraW5nLXRyZWUuIElmIHRoZSBmaWxlIGlzIGRpcnR5IHdlIHdvdWxkCi0JICogb3ZlcnJpZGUgdW5zYXZlZCBkYXRhLjwvbGk+Ci0JICogPC91bD4KLQkgKgotCSAqIEBwYXJhbSBiYXNlCi0JICogICAgICAgICAgICB0aGUgY29tbW9uIGJhc2UgZm9yIG91cnMgYW5kIHRoZWlycwotCSAqIEBwYXJhbSBvdXJzCi0JICogICAgICAgICAgICB0aGUgb3VycyBzaWRlIG9mIHRoZSBtZXJnZS4gV2hlbiBtZXJnaW5nIGEgYnJhbmNoIGludG8gdGhlCi0JICogICAgICAgICAgICBIRUFEIG91cnMgd2lsbCBwb2ludCB0byBIRUFECi0JICogQHBhcmFtIHRoZWlycwotCSAqICAgICAgICAgICAgdGhlIHRoZWlycyBzaWRlIG9mIHRoZSBtZXJnZS4gV2hlbiBtZXJnaW5nIGEgYnJhbmNoIGludG8gdGhlCi0JICogICAgICAgICAgICBjdXJyZW50IEhFQUQgdGhlaXJzIHdpbGwgcG9pbnQgdG8gdGhlIGJyYW5jaCB3aGljaCBpcyBtZXJnZWQKLQkgKiAgICAgICAgICAgIGludG8gSEVBRC4KLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIHRoZSBpbmRleCBlbnRyeQotCSAqIEBwYXJhbSB3b3JrCi0JICogICAgICAgICAgICB0aGUgZmlsZSBpbiB0aGUgd29ya2luZyB0cmVlCi0JICogQHBhcmFtIGlnbm9yZUNvbmZsaWN0cwotCSAqICAgICAgICAgICAgc2VlCi0JICogICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5tZXJnZS5SZXNvbHZlTWVyZ2VyI21lcmdlVHJlZXMoQWJzdHJhY3RUcmVlSXRlcmF0b3IsIFJldlRyZWUsIFJldlRyZWUsIGJvb2xlYW4pfQogCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCiAJICogICAgICAgICAgICB0aGUgYXR0cmlidXRlcyBkZWZpbmVkIGZvciB0aGlzIGVudHJ5CiAJICogQHJldHVybiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIG1lcmdlIHdpbGwgZmFpbCBiZWNhdXNlIHRoZSBpbmRleCBlbnRyeQpAQCAtMTA1MCwxMSArOTk1LDExIEBAIHByaXZhdGUgUmF3VGV4dCBnZXRSYXdUZXh0KE9iamVjdElkIGlkLAogCQlyZXR1cm4gUmF3VGV4dC5sb2FkKGxvYWRlciwgdGhyZXNob2xkKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG5vblRyZWUoZmluYWwgaW50IG1vZGUpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIG5vblRyZWUoaW50IG1vZGUpIHsKIAkJcmV0dXJuIG1vZGUgIT0gMCAmJiAhRmlsZU1vZGUuVFJFRS5lcXVhbHMobW9kZSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0dpdExpbmsoZmluYWwgaW50IG1vZGUpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzR2l0TGluayhpbnQgbW9kZSkgewogCQlyZXR1cm4gRmlsZU1vZGUuR0lUTElOSy5lcXVhbHMobW9kZSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1N0cmF0ZWd5T25lU2lkZWQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU3RyYXRlZ3lPbmVTaWRlZC5qYXZhCmluZGV4IDk3OTY4NWMuLjZlMmUyYWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU3RyYXRlZ3lPbmVTaWRlZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU3RyYXRlZ3lPbmVTaWRlZC5qYXZhCkBAIC03MSw3ICs3MSw3IEBAIHB1YmxpYyBjbGFzcyBTdHJhdGVneU9uZVNpZGVkIGV4dGVuZHMgTWVyZ2VTdHJhdGVneSB7CiAJICogQHBhcmFtIGluZGV4CiAJICogICAgICAgICAgICB0aGUgcG9zaXRpb24gb2YgdGhlIGlucHV0IHRyZWUgdG8gYWNjZXB0IGFzIHRoZSByZXN1bHQuCiAJICovCi0JcHJvdGVjdGVkIFN0cmF0ZWd5T25lU2lkZWQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIGludCBpbmRleCkgeworCXByb3RlY3RlZCBTdHJhdGVneU9uZVNpZGVkKFN0cmluZyBuYW1lLCBpbnQgaW5kZXgpIHsKIAkJc3RyYXRlZ3lOYW1lID0gbmFtZTsKIAkJdHJlZUluZGV4ID0gaW5kZXg7CiAJfQpAQCAtODQsMzEgKzg0LDMxIEBAIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIE1lcmdlciBuZXdNZXJnZXIoZmluYWwgUmVwb3NpdG9yeSBkYikgeworCXB1YmxpYyBNZXJnZXIgbmV3TWVyZ2VyKFJlcG9zaXRvcnkgZGIpIHsKIAkJcmV0dXJuIG5ldyBPbmVTaWRlKGRiLCB0cmVlSW5kZXgpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIE1lcmdlciBuZXdNZXJnZXIoZmluYWwgUmVwb3NpdG9yeSBkYiwgYm9vbGVhbiBpbkNvcmUpIHsKKwlwdWJsaWMgTWVyZ2VyIG5ld01lcmdlcihSZXBvc2l0b3J5IGRiLCBib29sZWFuIGluQ29yZSkgewogCQlyZXR1cm4gbmV3IE9uZVNpZGUoZGIsIHRyZWVJbmRleCk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgTWVyZ2VyIG5ld01lcmdlcihmaW5hbCBPYmplY3RJbnNlcnRlciBpbnNlcnRlciwgZmluYWwgQ29uZmlnIGNvbmZpZykgeworCXB1YmxpYyBNZXJnZXIgbmV3TWVyZ2VyKE9iamVjdEluc2VydGVyIGluc2VydGVyLCBDb25maWcgY29uZmlnKSB7CiAJCXJldHVybiBuZXcgT25lU2lkZShpbnNlcnRlciwgdHJlZUluZGV4KTsKIAl9CiAKIAlzdGF0aWMgY2xhc3MgT25lU2lkZSBleHRlbmRzIE1lcmdlciB7CiAJCXByaXZhdGUgZmluYWwgaW50IHRyZWVJbmRleDsKIAotCQlwcm90ZWN0ZWQgT25lU2lkZShmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBpbnQgaW5kZXgpIHsKKwkJcHJvdGVjdGVkIE9uZVNpZGUoUmVwb3NpdG9yeSBsb2NhbCwgaW50IGluZGV4KSB7CiAJCQlzdXBlcihsb2NhbCk7CiAJCQl0cmVlSW5kZXggPSBpbmRleDsKIAkJfQogCi0JCXByb3RlY3RlZCBPbmVTaWRlKGZpbmFsIE9iamVjdEluc2VydGVyIGluc2VydGVyLCBmaW5hbCBpbnQgaW5kZXgpIHsKKwkJcHJvdGVjdGVkIE9uZVNpZGUoT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIsIGludCBpbmRleCkgewogCQkJc3VwZXIoaW5zZXJ0ZXIpOwogCQkJdHJlZUluZGV4ID0gaW5kZXg7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU3RyYXRlZ3lTaW1wbGVUd29XYXlJbkNvcmUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvU3RyYXRlZ3lTaW1wbGVUd29XYXlJbkNvcmUuamF2YQppbmRleCA1NzM5ZDU4Li40YWVhY2Y1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1N0cmF0ZWd5U2ltcGxlVHdvV2F5SW5Db3JlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9TdHJhdGVneVNpbXBsZVR3b1dheUluQ29yZS5qYXZhCkBAIC04NCw3ICs4NCw3IEBAIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIFRocmVlV2F5TWVyZ2VyIG5ld01lcmdlcihmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CisJcHVibGljIFRocmVlV2F5TWVyZ2VyIG5ld01lcmdlcihSZXBvc2l0b3J5IGRiKSB7CiAJCXJldHVybiBuZXcgSW5Db3JlTWVyZ2VyKGRiKTsKIAl9CiAKQEAgLTExNiwxMyArMTE2LDEzIEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIEluQ29yZU1lcmdlciBleHRlbmRzIFRocmVlV2F5TWVyZ2VyIHsKIAogCQlwcml2YXRlIE9iamVjdElkIHJlc3VsdFRyZWU7CiAKLQkJSW5Db3JlTWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwpIHsKKwkJSW5Db3JlTWVyZ2VyKFJlcG9zaXRvcnkgbG9jYWwpIHsKIAkJCXN1cGVyKGxvY2FsKTsKIAkJCXR3ID0gbmV3IE5hbWVDb25mbGljdFRyZWVXYWxrKGxvY2FsLCByZWFkZXIpOwogCQkJY2FjaGUgPSBEaXJDYWNoZS5uZXdJbkNvcmUoKTsKIAkJfQogCi0JCUluQ29yZU1lcmdlcihmaW5hbCBPYmplY3RJbnNlcnRlciBpbnNlcnRlcikgeworCQlJbkNvcmVNZXJnZXIoT2JqZWN0SW5zZXJ0ZXIgaW5zZXJ0ZXIpIHsKIAkJCXN1cGVyKGluc2VydGVyKTsKIAkJCXR3ID0gbmV3IE5hbWVDb25mbGljdFRyZWVXYWxrKG51bGwsIHJlYWRlcik7CiAJCQljYWNoZSA9IERpckNhY2hlLm5ld0luQ29yZSgpOwpAQCAtMTgyLDExICsxODIsMTEgQEAgZWxzZSBpZiAobW9kZUIgPT0gbW9kZVQgJiYgdHcuaWRFcXVhbChUX0JBU0UsIFRfVEhFSVJTKSkKIAkJCX0KIAkJfQogCi0JCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gbm9uVHJlZShmaW5hbCBpbnQgbW9kZSkgeworCQlwcml2YXRlIHN0YXRpYyBib29sZWFuIG5vblRyZWUoaW50IG1vZGUpIHsKIAkJCXJldHVybiBtb2RlICE9IDAgJiYgIUZpbGVNb2RlLlRSRUUuZXF1YWxzKG1vZGUpOwogCQl9CiAKLQkJcHJpdmF0ZSB2b2lkIGFkZChmaW5hbCBpbnQgdHJlZSwgZmluYWwgaW50IHN0YWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlwcml2YXRlIHZvaWQgYWRkKGludCB0cmVlLCBpbnQgc3RhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBpID0gZ2V0VHJlZSh0cmVlKTsKIAkJCWlmIChpICE9IG51bGwpIHsKIAkJCQlpZiAoRmlsZU1vZGUuVFJFRS5lcXVhbHModHcuZ2V0UmF3TW9kZSh0cmVlKSkpIHsKQEAgLTIwMyw3ICsyMDMsNyBAQCBwcml2YXRlIHZvaWQgYWRkKGZpbmFsIGludCB0cmVlLCBmaW5hbCBpbnQgc3RhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl9CiAJCX0KIAotCQlwcml2YXRlIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGdldFRyZWUoZmluYWwgaW50IHRyZWUpIHsKKwkJcHJpdmF0ZSBBYnN0cmFjdFRyZWVJdGVyYXRvciBnZXRUcmVlKGludCB0cmVlKSB7CiAJCQlyZXR1cm4gdHcuZ2V0VHJlZSh0cmVlLCBBYnN0cmFjdFRyZWVJdGVyYXRvci5jbGFzcyk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9UaHJlZVdheU1lcmdlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9tZXJnZS9UaHJlZVdheU1lcmdlci5qYXZhCmluZGV4IDNmMjg4MjAuLjJmYzBmNGYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbWVyZ2UvVGhyZWVXYXlNZXJnZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L21lcmdlL1RocmVlV2F5TWVyZ2VyLmphdmEKQEAgLTcxLDcgKzcxLDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRocmVlV2F5TWVyZ2VyIGV4dGVuZHMgTWVyZ2VyIHsKIAkgKiBAcGFyYW0gbG9jYWwKIAkgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IHRoaXMgbWVyZ2VyIHdpbGwgcmVhZCBhbmQgd3JpdGUgZGF0YSBvbi4KIAkgKi8KLQlwcm90ZWN0ZWQgVGhyZWVXYXlNZXJnZXIoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCkgeworCXByb3RlY3RlZCBUaHJlZVdheU1lcmdlcihSZXBvc2l0b3J5IGxvY2FsKSB7CiAJCXN1cGVyKGxvY2FsKTsKIAl9CiAKQEAgLTgzLDcgKzgzLDcgQEAgcHJvdGVjdGVkIFRocmVlV2F5TWVyZ2VyKGZpbmFsIFJlcG9zaXRvcnkgbG9jYWwpIHsKIAkgKiBAcGFyYW0gaW5Db3JlCiAJICogICAgICAgICAgICBwZXJmb3JtIHRoZSBtZXJnZSBpbiBjb3JlIHdpdGggbm8gd29ya2luZyBmb2xkZXIgaW52b2x2ZWQKIAkgKi8KLQlwcm90ZWN0ZWQgVGhyZWVXYXlNZXJnZXIoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgYm9vbGVhbiBpbkNvcmUpIHsKKwlwcm90ZWN0ZWQgVGhyZWVXYXlNZXJnZXIoUmVwb3NpdG9yeSBsb2NhbCwgYm9vbGVhbiBpbkNvcmUpIHsKIAkJdGhpcyhsb2NhbCk7CiAJfQogCkBAIC0xMTIsNyArMTEyLDcgQEAgcHJvdGVjdGVkIFRocmVlV2F5TWVyZ2VyKE9iamVjdEluc2VydGVyIGluc2VydGVyKSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlKGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlwdWJsaWMgdm9pZCBzZXRCYXNlKEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKGlkICE9IG51bGwpIHsKIAkJCWJhc2VUcmVlID0gd2Fsay5wYXJzZVRyZWUoaWQpOwpAQCAtMTIzLDcgKzEyMyw3IEBAIHB1YmxpYyB2b2lkIHNldEJhc2UoZmluYWwgQW55T2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBtZXJnZShmaW5hbCBBbnlPYmplY3RJZC4uLiB0aXBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBib29sZWFuIG1lcmdlKEFueU9iamVjdElkLi4uIHRpcHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICh0aXBzLmxlbmd0aCAhPSAyKQogCQkJcmV0dXJuIGZhbHNlOwogCQlyZXR1cm4gc3VwZXIubWVyZ2UodGlwcyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L25vdGVzL0xlYWZCdWNrZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbm90ZXMvTGVhZkJ1Y2tldC5qYXZhCmluZGV4IDFiZTUyNTEuLjY3MjNiNjMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbm90ZXMvTGVhZkJ1Y2tldC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvbm90ZXMvTGVhZkJ1Y2tldC5qYXZhCkBAIC0yMTgsNyArMjE4LDcgQEAgcHJpdmF0ZSBUcmVlRm9ybWF0dGVyIGJ1aWxkKCkgewogCQlyZXR1cm4gZm10OwogCX0KIAotCXByaXZhdGUgaW50IHRyZWVTaXplKGZpbmFsIGludCBuYW1lTGVuKSB7CisJcHJpdmF0ZSBpbnQgdHJlZVNpemUoaW50IG5hbWVMZW4pIHsKIAkJaW50IHN6ID0gY250ICogVHJlZUZvcm1hdHRlci5lbnRyeVNpemUoUkVHVUxBUl9GSUxFLCBuYW1lTGVuKTsKIAkJZm9yIChOb25Ob3RlRW50cnkgZSA9IG5vbk5vdGVzOyBlICE9IG51bGw7IGUgPSBlLm5leHQpCiAJCQlzeiArPSBlLnRyZWVFbnRyeVNpemUoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQmluYXJ5SHVuay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9CaW5hcnlIdW5rLmphdmEKaW5kZXggMDc5ZDZmNi4uOTUzOTFlYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9CaW5hcnlIdW5rLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9CaW5hcnlIdW5rLmphdmEKQEAgLTgwLDcgKzgwLDcgQEAgcHVibGljIHN0YXRpYyBlbnVtIFR5cGUgewogCS8qKiBJbmZsYXRlZCBsZW5ndGggb2YgdGhlIGRhdGEuICovCiAJcHJpdmF0ZSBpbnQgbGVuZ3RoOwogCi0JQmluYXJ5SHVuayhmaW5hbCBGaWxlSGVhZGVyIGZoLCBmaW5hbCBpbnQgb2Zmc2V0KSB7CisJQmluYXJ5SHVuayhGaWxlSGVhZGVyIGZoLCBpbnQgb2Zmc2V0KSB7CiAJCWZpbGUgPSBmaDsKIAkJc3RhcnRPZmZzZXQgPSBvZmZzZXQ7CiAJfQpAQCAtMTM5LDcgKzEzOSw3IEBAIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKIAkJcmV0dXJuIGxlbmd0aDsKIAl9CiAKLQlpbnQgcGFyc2VIdW5rKGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKKwlpbnQgcGFyc2VIdW5rKGludCBwdHIsIGludCBlbmQpIHsKIAkJZmluYWwgYnl0ZVtdIGJ1ZiA9IGZpbGUuYnVmOwogCiAJCWlmIChtYXRjaChidWYsIHB0ciwgTElURVJBTCkgPj0gMCkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9Db21iaW5lZEZpbGVIZWFkZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQ29tYmluZWRGaWxlSGVhZGVyLmphdmEKaW5kZXggMWFmYjUzZC4uMzQwNzU3OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9Db21iaW5lZEZpbGVIZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0NvbWJpbmVkRmlsZUhlYWRlci5qYXZhCkBAIC02OSw3ICs2OSw3IEBAIHB1YmxpYyBjbGFzcyBDb21iaW5lZEZpbGVIZWFkZXIgZXh0ZW5kcyBGaWxlSGVhZGVyIHsKIAogCXByaXZhdGUgRmlsZU1vZGVbXSBvbGRNb2RlczsKIAotCUNvbWJpbmVkRmlsZUhlYWRlcihmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG9mZnNldCkgeworCUNvbWJpbmVkRmlsZUhlYWRlcihieXRlW10gYiwgaW50IG9mZnNldCkgewogCQlzdXBlcihiLCBvZmZzZXQpOwogCX0KIApAQCAtMTA4LDcgKzEwOCw3IEBAIHB1YmxpYyBGaWxlTW9kZSBnZXRPbGRNb2RlKCkgewogCSAqICAgICAgICAgICAgdGhlIGFuY2VzdG9yIHRvIGdldCB0aGUgbW9kZSBvZgogCSAqIEByZXR1cm4gdGhlIG1vZGUgb2YgdGhlIHJlcXVlc3RlZCBhbmNlc3Rvci4KIAkgKi8KLQlwdWJsaWMgRmlsZU1vZGUgZ2V0T2xkTW9kZShmaW5hbCBpbnQgbnRoUGFyZW50KSB7CisJcHVibGljIEZpbGVNb2RlIGdldE9sZE1vZGUoaW50IG50aFBhcmVudCkgewogCQlyZXR1cm4gb2xkTW9kZXNbbnRoUGFyZW50XTsKIAl9CiAKQEAgLTEzMCwxMyArMTMwLDEzIEBAIHB1YmxpYyBBYmJyZXZpYXRlZE9iamVjdElkIGdldE9sZElkKCkgewogCSAqICAgICAgICAgICAgdGhlIGFuY2VzdG9yIHRvIGdldCB0aGUgb2JqZWN0IGlkIG9mCiAJICogQHJldHVybiB0aGUgaWQgb2YgdGhlIHJlcXVlc3RlZCBhbmNlc3Rvci4KIAkgKi8KLQlwdWJsaWMgQWJicmV2aWF0ZWRPYmplY3RJZCBnZXRPbGRJZChmaW5hbCBpbnQgbnRoUGFyZW50KSB7CisJcHVibGljIEFiYnJldmlhdGVkT2JqZWN0SWQgZ2V0T2xkSWQoaW50IG50aFBhcmVudCkgewogCQlyZXR1cm4gb2xkSWRzW250aFBhcmVudF07CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgU3RyaW5nIGdldFNjcmlwdFRleHQoZmluYWwgQ2hhcnNldCBvY3MsIGZpbmFsIENoYXJzZXQgbmNzKSB7CisJcHVibGljIFN0cmluZyBnZXRTY3JpcHRUZXh0KENoYXJzZXQgb2NzLCBDaGFyc2V0IG5jcykgewogCQlmaW5hbCBDaGFyc2V0W10gY3MgPSBuZXcgQ2hhcnNldFtnZXRQYXJlbnRDb3VudCgpICsgMV07CiAJCUFycmF5cy5maWxsKGNzLCBvY3MpOwogCQljc1tnZXRQYXJlbnRDb3VudCgpXSA9IG5jczsKQEAgLTE0OSwxMiArMTQ5LDEyIEBAIHB1YmxpYyBTdHJpbmcgZ2V0U2NyaXB0VGV4dChmaW5hbCBDaGFyc2V0IG9jcywgZmluYWwgQ2hhcnNldCBuY3MpIHsKIAkgKiBDb252ZXJ0IHRoZSBwYXRjaCBzY3JpcHQgZm9yIHRoaXMgZmlsZSBpbnRvIGEgc3RyaW5nLgogCSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NyaXB0VGV4dChmaW5hbCBDaGFyc2V0W10gY2hhcnNldEd1ZXNzKSB7CisJcHVibGljIFN0cmluZyBnZXRTY3JpcHRUZXh0KENoYXJzZXRbXSBjaGFyc2V0R3Vlc3MpIHsKIAkJcmV0dXJuIHN1cGVyLmdldFNjcmlwdFRleHQoY2hhcnNldEd1ZXNzKTsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlpbnQgcGFyc2VHaXRIZWFkZXJzKGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKKwlpbnQgcGFyc2VHaXRIZWFkZXJzKGludCBwdHIsIGludCBlbmQpIHsKIAkJd2hpbGUgKHB0ciA8IGVuZCkgewogCQkJZmluYWwgaW50IGVvbCA9IG5leHRMRihidWYsIHB0cik7CiAJCQlpZiAoaXNIdW5rSGRyKGJ1ZiwgcHRyLCBlbmQpID49IDEpIHsKQEAgLTE5MSw3ICsxOTEsNyBAQCBpbnQgcGFyc2VHaXRIZWFkZXJzKGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VJbmRleExpbmUoaW50IHB0ciwgZmluYWwgaW50IGVvbCkgeworCXByb3RlY3RlZCB2b2lkIHBhcnNlSW5kZXhMaW5lKGludCBwdHIsIGludCBlb2wpIHsKIAkJLy8gImluZGV4ICRhc2hhMSwkYnNoYTEuLiRjc2hhMSIKIAkJLy8KIAkJZmluYWwgTGlzdDxBYmJyZXZpYXRlZE9iamVjdElkPiBpZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKQEAgLTIxMywxOCArMjEzLDE4IEBAIHByb3RlY3RlZCB2b2lkIHBhcnNlSW5kZXhMaW5lKGludCBwdHIsIGZpbmFsIGludCBlb2wpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VOZXdGaWxlTW9kZShmaW5hbCBpbnQgcHRyLCBmaW5hbCBpbnQgZW9sKSB7CisJcHJvdGVjdGVkIHZvaWQgcGFyc2VOZXdGaWxlTW9kZShpbnQgcHRyLCBpbnQgZW9sKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkTW9kZXMubGVuZ3RoOyBpKyspCiAJCQlvbGRNb2Rlc1tpXSA9IEZpbGVNb2RlLk1JU1NJTkc7CiAJCXN1cGVyLnBhcnNlTmV3RmlsZU1vZGUocHRyLCBlb2wpOwogCX0KIAogCUBPdmVycmlkZQotCUh1bmtIZWFkZXIgbmV3SHVua0hlYWRlcihmaW5hbCBpbnQgb2Zmc2V0KSB7CisJSHVua0hlYWRlciBuZXdIdW5rSGVhZGVyKGludCBvZmZzZXQpIHsKIAkJcmV0dXJuIG5ldyBDb21iaW5lZEh1bmtIZWFkZXIodGhpcywgb2Zmc2V0KTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcGFyc2VNb2RlTGluZShpbnQgcHRyLCBmaW5hbCBpbnQgZW9sKSB7CisJcHJpdmF0ZSB2b2lkIHBhcnNlTW9kZUxpbmUoaW50IHB0ciwgaW50IGVvbCkgewogCQkvLyAibW9kZSAkYW1vZGUsJGJtb2RlLi4kY21vZGUiCiAJCS8vCiAJCWludCBuID0gMDsKQEAgLTI0MCw3ICsyNDAsNyBAQCBwcml2YXRlIHZvaWQgcGFyc2VNb2RlTGluZShpbnQgcHRyLCBmaW5hbCBpbnQgZW9sKSB7CiAJCW5ld01vZGUgPSBwYXJzZUZpbGVNb2RlKGRvdDIgKyAxLCBlb2wpOwogCX0KIAotCXByaXZhdGUgdm9pZCBwYXJzZURlbGV0ZWRGaWxlTW9kZShpbnQgcHRyLCBmaW5hbCBpbnQgZW9sKSB7CisJcHJpdmF0ZSB2b2lkIHBhcnNlRGVsZXRlZEZpbGVNb2RlKGludCBwdHIsIGludCBlb2wpIHsKIAkJLy8gImRlbGV0ZWQgZmlsZSBtb2RlICRhbW9kZSwkYm1vZGUiCiAJCS8vCiAJCWNoYW5nZVR5cGUgPSBDaGFuZ2VUeXBlLkRFTEVURTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQ29tYmluZWRIdW5rSGVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0NvbWJpbmVkSHVua0hlYWRlci5qYXZhCmluZGV4IGJiZjgwMjMuLmQyNzgxMzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvQ29tYmluZWRIdW5rSGVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9Db21iaW5lZEh1bmtIZWFkZXIuamF2YQpAQCAtNjQsNyArNjQsNyBAQCBwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDb21iaW5lZE9sZEltYWdlIGV4dGVuZHMgT2xkSW1hZ2UgewogCiAJcHJpdmF0ZSBDb21iaW5lZE9sZEltYWdlW10gb2xkOwogCi0JQ29tYmluZWRIdW5rSGVhZGVyKGZpbmFsIENvbWJpbmVkRmlsZUhlYWRlciBmaCwgZmluYWwgaW50IG9mZnNldCkgeworCUNvbWJpbmVkSHVua0hlYWRlcihDb21iaW5lZEZpbGVIZWFkZXIgZmgsIGludCBvZmZzZXQpIHsKIAkJc3VwZXIoZmgsIG9mZnNldCwgbnVsbCk7CiAJCW9sZCA9IG5ldyBDb21iaW5lZE9sZEltYWdlW2ZoLmdldFBhcmVudENvdW50KCldOwogCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZC5sZW5ndGg7IGkrKykgewpAQCAtOTcsNyArOTcsNyBAQCBwdWJsaWMgT2xkSW1hZ2UgZ2V0T2xkSW1hZ2UoKSB7CiAJICogICAgICAgICAgICB0aGUgYW5jZXN0b3IgdG8gZ2V0IHRoZSBvbGQgaW1hZ2UgZGF0YSBvZgogCSAqIEByZXR1cm4gaW1hZ2UgZGF0YSBvZiB0aGUgcmVxdWVzdGVkIGFuY2VzdG9yLgogCSAqLwotCXB1YmxpYyBPbGRJbWFnZSBnZXRPbGRJbWFnZShmaW5hbCBpbnQgbnRoUGFyZW50KSB7CisJcHVibGljIE9sZEltYWdlIGdldE9sZEltYWdlKGludCBudGhQYXJlbnQpIHsKIAkJcmV0dXJuIG9sZFtudGhQYXJlbnRdOwogCX0KIApAQCAtMTI1LDExICsxMjUsMTEgQEAgdm9pZCBwYXJzZUhlYWRlcigpIHsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlpbnQgcGFyc2VCb2R5KGZpbmFsIFBhdGNoIHNjcmlwdCwgZmluYWwgaW50IGVuZCkgeworCWludCBwYXJzZUJvZHkoUGF0Y2ggc2NyaXB0LCBpbnQgZW5kKSB7CiAJCWZpbmFsIGJ5dGVbXSBidWYgPSBmaWxlLmJ1ZjsKIAkJaW50IGMgPSBuZXh0TEYoYnVmLCBzdGFydE9mZnNldCk7CiAKLQkJZm9yIChmaW5hbCBDb21iaW5lZE9sZEltYWdlIG8gOiBvbGQpIHsKKwkJZm9yIChDb21iaW5lZE9sZEltYWdlIG8gOiBvbGQpIHsKIAkJCW8ubkRlbGV0ZWQgPSAwOwogCQkJby5uQWRkZWQgPSAwOwogCQkJby5uQ29udGV4dCA9IDA7CkBAIC0yMDcsNyArMjA3LDcgQEAgaW50IHBhcnNlQm9keShmaW5hbCBQYXRjaCBzY3JpcHQsIGZpbmFsIGludCBlbmQpIHsKIAl9CiAKIAlAT3ZlcnJpZGUKLQl2b2lkIGV4dHJhY3RGaWxlTGluZXMoZmluYWwgT3V0cHV0U3RyZWFtW10gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgZXh0cmFjdEZpbGVMaW5lcyhPdXRwdXRTdHJlYW1bXSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSBidWYgPSBmaWxlLmJ1ZjsKIAkJaW50IHB0ciA9IHN0YXJ0T2Zmc2V0OwogCQlpbnQgZW9sID0gbmV4dExGKGJ1ZiwgcHRyKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvRmlsZUhlYWRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9GaWxlSGVhZGVyLmphdmEKaW5kZXggNWNmYmJiMi4uZDBhNTIxNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9GaWxlSGVhZGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9GaWxlSGVhZGVyLmphdmEKQEAgLTE0Niw3ICsxNDYsNyBAQCBwdWJsaWMgc3RhdGljIGVudW0gUGF0Y2hUeXBlIHsKIAkgKiBAcGFyYW0gdHlwZQogCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgcGF0Y2ggdXNlZCB0byBtb2RpZnkgdGhpcyBmaWxlCiAJICovCi0JcHVibGljIEZpbGVIZWFkZXIoZmluYWwgYnl0ZVtdIGhlYWRlckxpbmVzLCBFZGl0TGlzdCBlZGl0cywgUGF0Y2hUeXBlIHR5cGUpIHsKKwlwdWJsaWMgRmlsZUhlYWRlcihieXRlW10gaGVhZGVyTGluZXMsIEVkaXRMaXN0IGVkaXRzLCBQYXRjaFR5cGUgdHlwZSkgewogCQl0aGlzKGhlYWRlckxpbmVzLCAwKTsKIAkJZW5kT2Zmc2V0ID0gaGVhZGVyTGluZXMubGVuZ3RoOwogCQlpbnQgcHRyID0gcGFyc2VHaXRGaWxlTmFtZShQYXRjaC5ESUZGX0dJVC5sZW5ndGgsIGhlYWRlckxpbmVzLmxlbmd0aCk7CkBAIC0xNTUsNyArMTU1LDcgQEAgcHVibGljIEZpbGVIZWFkZXIoZmluYWwgYnl0ZVtdIGhlYWRlckxpbmVzLCBFZGl0TGlzdCBlZGl0cywgUGF0Y2hUeXBlIHR5cGUpIHsKIAkJYWRkSHVuayhuZXcgSHVua0hlYWRlcih0aGlzLCBlZGl0cykpOwogCX0KIAotCUZpbGVIZWFkZXIoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvZmZzZXQpIHsKKwlGaWxlSGVhZGVyKGJ5dGVbXSBiLCBpbnQgb2Zmc2V0KSB7CiAJCWJ1ZiA9IGI7CiAJCXN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwogCQljaGFuZ2VUeXBlID0gQ2hhbmdlVHlwZS5NT0RJRlk7IC8vIHVubGVzcyBvdGhlcndpc2UgZGVzaWduYXRlZApAQCAtMjY0LDEyICsyNjQsMTIgQEAgU3RyaW5nIGdldFNjcmlwdFRleHQoQ2hhcnNldFtdIGNoYXJzZXRHdWVzcykgewogCiAJCWZpbmFsIFN0cmluZ1tdIGZpbGVzID0gZXh0cmFjdEZpbGVMaW5lcyhjaGFyc2V0R3Vlc3MpOwogCQlmaW5hbCBpbnRbXSBvZmZzZXRzID0gbmV3IGludFtmaWxlcy5sZW5ndGhdOwotCQlmb3IgKGZpbmFsIEh1bmtIZWFkZXIgaCA6IGdldEh1bmtzKCkpCisJCWZvciAoSHVua0hlYWRlciBoIDogZ2V0SHVua3MoKSkKIAkJCWguZXh0cmFjdEZpbGVMaW5lcyhyLCBmaWxlcywgb2Zmc2V0cyk7CiAJCXJldHVybiByLnRvU3RyaW5nKCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0cnlTaW1wbGVDb252ZXJzaW9uKGZpbmFsIENoYXJzZXRbXSBjaGFyc2V0R3Vlc3MpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIHRyeVNpbXBsZUNvbnZlcnNpb24oQ2hhcnNldFtdIGNoYXJzZXRHdWVzcykgewogCQlpZiAoY2hhcnNldEd1ZXNzID09IG51bGwpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJZm9yIChpbnQgaSA9IDE7IGkgPCBjaGFyc2V0R3Vlc3MubGVuZ3RoOyBpKyspIHsKQEAgLTI3OSwxMiArMjc5LDEyIEBAIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdHJ5U2ltcGxlQ29udmVyc2lvbihmaW5hbCBDaGFyc2V0W10gY2hhcnNldEd1ZXNzKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgU3RyaW5nW10gZXh0cmFjdEZpbGVMaW5lcyhmaW5hbCBDaGFyc2V0W10gY3NHdWVzcykgeworCXByaXZhdGUgU3RyaW5nW10gZXh0cmFjdEZpbGVMaW5lcyhDaGFyc2V0W10gY3NHdWVzcykgewogCQlmaW5hbCBUZW1wb3JhcnlCdWZmZXJbXSB0bXAgPSBuZXcgVGVtcG9yYXJ5QnVmZmVyW2dldFBhcmVudENvdW50KCkgKyAxXTsKIAkJdHJ5IHsKIAkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG1wLmxlbmd0aDsgaSsrKQogCQkJCXRtcFtpXSA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcChJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0JCQlmb3IgKGZpbmFsIEh1bmtIZWFkZXIgaCA6IGdldEh1bmtzKCkpCisJCQlmb3IgKEh1bmtIZWFkZXIgaCA6IGdldEh1bmtzKCkpCiAJCQkJaC5leHRyYWN0RmlsZUxpbmVzKHRtcCk7CiAKIAkJCWZpbmFsIFN0cmluZ1tdIHIgPSBuZXcgU3RyaW5nW3RtcC5sZW5ndGhdOwpAQCAtMzI5LDcgKzMyOSw3IEBAIHB1YmxpYyBMaXN0PD8gZXh0ZW5kcyBIdW5rSGVhZGVyPiBnZXRIdW5rcygpIHsKIAkJcmV0dXJuIGh1bmtzOwogCX0KIAotCXZvaWQgYWRkSHVuayhmaW5hbCBIdW5rSGVhZGVyIGgpIHsKKwl2b2lkIGFkZEh1bmsoSHVua0hlYWRlciBoKSB7CiAJCWlmIChoLmdldEZpbGVIZWFkZXIoKSAhPSB0aGlzKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5odW5rQmVsb25nc1RvQW5vdGhlckZpbGUpOwogCQlpZiAoaHVua3MgPT0gbnVsbCkKQEAgLTMzNyw3ICszMzcsNyBAQCB2b2lkIGFkZEh1bmsoZmluYWwgSHVua0hlYWRlciBoKSB7CiAJCWh1bmtzLmFkZChoKTsKIAl9CiAKLQlIdW5rSGVhZGVyIG5ld0h1bmtIZWFkZXIoZmluYWwgaW50IG9mZnNldCkgeworCUh1bmtIZWFkZXIgbmV3SHVua0hlYWRlcihpbnQgb2Zmc2V0KSB7CiAJCXJldHVybiBuZXcgSHVua0hlYWRlcih0aGlzLCBvZmZzZXQpOwogCX0KIApAQCAtMzcwLDcgKzM3MCw3IEBAIHB1YmxpYyBCaW5hcnlIdW5rIGdldFJldmVyc2VCaW5hcnlIdW5rKCkgewogCSAqLwogCXB1YmxpYyBFZGl0TGlzdCB0b0VkaXRMaXN0KCkgewogCQlmaW5hbCBFZGl0TGlzdCByID0gbmV3IEVkaXRMaXN0KCk7Ci0JCWZvciAoZmluYWwgSHVua0hlYWRlciBodW5rIDogaHVua3MpCisJCWZvciAoSHVua0hlYWRlciBodW5rIDogaHVua3MpCiAJCQlyLmFkZEFsbChodW5rLnRvRWRpdExpc3QoKSk7CiAJCXJldHVybiByOwogCX0KQEAgLTM4NCw3ICszODQsNyBAQCBwdWJsaWMgRWRpdExpc3QgdG9FZGl0TGlzdCgpIHsKIAkgKiAgICAgICAgICAgIG9uZSBwYXN0IHRoZSBsYXN0IHBvc2l0aW9uIHRvIHBhcnNlLgogCSAqIEByZXR1cm4gZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSBMRiBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lOyAtMSBvbiBlcnJvci4KIAkgKi8KLQlpbnQgcGFyc2VHaXRGaWxlTmFtZShpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CisJaW50IHBhcnNlR2l0RmlsZU5hbWUoaW50IHB0ciwgaW50IGVuZCkgewogCQlmaW5hbCBpbnQgZW9sID0gbmV4dExGKGJ1ZiwgcHRyKTsKIAkJZmluYWwgaW50IGJvbCA9IHB0cjsKIAkJaWYgKGVvbCA+PSBlbmQpIHsKQEAgLTQ0NCw3ICs0NDQsNyBAQCBpbnQgcGFyc2VHaXRGaWxlTmFtZShpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CiAJCXJldHVybiBlb2w7CiAJfQogCi0JaW50IHBhcnNlR2l0SGVhZGVycyhpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CisJaW50IHBhcnNlR2l0SGVhZGVycyhpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCXdoaWxlIChwdHIgPCBlbmQpIHsKIAkJCWZpbmFsIGludCBlb2wgPSBuZXh0TEYoYnVmLCBwdHIpOwogCQkJaWYgKGlzSHVua0hkcihidWYsIHB0ciwgZW9sKSA+PSAxKSB7CkBAIC01MTQsMjUgKzUxNCwyNSBAQCBpbnQgcGFyc2VHaXRIZWFkZXJzKGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKIAkJcmV0dXJuIHB0cjsKIAl9CiAKLQl2b2lkIHBhcnNlT2xkTmFtZShpbnQgcHRyLCBmaW5hbCBpbnQgZW9sKSB7CisJdm9pZCBwYXJzZU9sZE5hbWUoaW50IHB0ciwgaW50IGVvbCkgewogCQlvbGRQYXRoID0gcDEocGFyc2VOYW1lKG9sZFBhdGgsIHB0ciArIE9MRF9OQU1FLmxlbmd0aCwgZW9sKSk7CiAJCWlmIChvbGRQYXRoID09IERFVl9OVUxMKQogCQkJY2hhbmdlVHlwZSA9IENoYW5nZVR5cGUuQUREOwogCX0KIAotCXZvaWQgcGFyc2VOZXdOYW1lKGludCBwdHIsIGZpbmFsIGludCBlb2wpIHsKKwl2b2lkIHBhcnNlTmV3TmFtZShpbnQgcHRyLCBpbnQgZW9sKSB7CiAJCW5ld1BhdGggPSBwMShwYXJzZU5hbWUobmV3UGF0aCwgcHRyICsgTkVXX05BTUUubGVuZ3RoLCBlb2wpKTsKIAkJaWYgKG5ld1BhdGggPT0gREVWX05VTEwpCiAJCQljaGFuZ2VUeXBlID0gQ2hhbmdlVHlwZS5ERUxFVEU7CiAJfQogCi0Jdm9pZCBwYXJzZU5ld0ZpbGVNb2RlKGludCBwdHIsIGZpbmFsIGludCBlb2wpIHsKKwl2b2lkIHBhcnNlTmV3RmlsZU1vZGUoaW50IHB0ciwgaW50IGVvbCkgewogCQlvbGRNb2RlID0gRmlsZU1vZGUuTUlTU0lORzsKIAkJbmV3TW9kZSA9IHBhcnNlRmlsZU1vZGUocHRyICsgTkVXX0ZJTEVfTU9ERS5sZW5ndGgsIGVvbCk7CiAJCWNoYW5nZVR5cGUgPSBDaGFuZ2VUeXBlLkFERDsKIAl9CiAKLQlpbnQgcGFyc2VUcmFkaXRpb25hbEhlYWRlcnMoaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCWludCBwYXJzZVRyYWRpdGlvbmFsSGVhZGVycyhpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCXdoaWxlIChwdHIgPCBlbmQpIHsKIAkJCWZpbmFsIGludCBlb2wgPSBuZXh0TEYoYnVmLCBwdHIpOwogCQkJaWYgKGlzSHVua0hkcihidWYsIHB0ciwgZW9sKSA+PSAxKSB7CkBAIC01NTUsNyArNTU1LDcgQEAgaW50IHBhcnNlVHJhZGl0aW9uYWxIZWFkZXJzKGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKIAkJcmV0dXJuIHB0cjsKIAl9CiAKLQlwcml2YXRlIFN0cmluZyBwYXJzZU5hbWUoZmluYWwgU3RyaW5nIGV4cGVjdCwgaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCXByaXZhdGUgU3RyaW5nIHBhcnNlTmFtZShTdHJpbmcgZXhwZWN0LCBpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCWlmIChwdHIgPT0gZW5kKQogCQkJcmV0dXJuIGV4cGVjdDsKIApAQCAtNTg1LDcgKzU4NSw3IEBAIHByaXZhdGUgc3RhdGljIFN0cmluZyBwMShmaW5hbCBTdHJpbmcgcikgewogCQlyZXR1cm4gcyA+IDAgPyByLnN1YnN0cmluZyhzICsgMSkgOiByOwogCX0KIAotCUZpbGVNb2RlIHBhcnNlRmlsZU1vZGUoaW50IHB0ciwgZmluYWwgaW50IGVuZCkgeworCUZpbGVNb2RlIHBhcnNlRmlsZU1vZGUoaW50IHB0ciwgaW50IGVuZCkgewogCQlpbnQgdG1wID0gMDsKIAkJd2hpbGUgKHB0ciA8IGVuZCAtIDEpIHsKIAkJCXRtcCA8PD0gMzsKQEAgLTU5NCw3ICs1OTQsNyBAQCBGaWxlTW9kZSBwYXJzZUZpbGVNb2RlKGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKIAkJcmV0dXJuIEZpbGVNb2RlLmZyb21CaXRzKHRtcCk7CiAJfQogCi0Jdm9pZCBwYXJzZUluZGV4TGluZShpbnQgcHRyLCBmaW5hbCBpbnQgZW5kKSB7CisJdm9pZCBwYXJzZUluZGV4TGluZShpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCS8vICJpbmRleCAkYXNoYTEuLiRic2hhMVsgJG1vZGVdIiB3aGVyZSAkYXNoYTEgYW5kICRic2hhMQogCQkvLyBjYW4gYmUgdW5pcXVlIGFiYnJldmlhdGlvbnMKIAkJLy8KQEAgLTYzNiw3ICs2MzYsNyBAQCBwcml2YXRlIGJvb2xlYW4gZXEoaW50IGFQdHIsIGludCBhRW5kLCBpbnQgYlB0ciwgaW50IGJFbmQpIHsKIAkgKiAgICAgICAgIGZvciBhIDMgd2F5LW1lcmdlIHJldHVybnMgMy4gSWYgdGhpcyBpcyBub3QgYSBodW5rIGhlYWRlciwgMCBpcwogCSAqICAgICAgICAgcmV0dXJuZWQgaW5zdGVhZC4KIAkgKi8KLQlzdGF0aWMgaW50IGlzSHVua0hkcihmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBlbmQpIHsKKwlzdGF0aWMgaW50IGlzSHVua0hkcihieXRlW10gYnVmLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKIAkJaW50IHB0ciA9IHN0YXJ0OwogCQl3aGlsZSAocHRyIDwgZW5kICYmIGJ1ZltwdHJdID09ICdAJykKIAkJCXB0cisrOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9IdW5rSGVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0h1bmtIZWFkZXIuamF2YQppbmRleCBkMDIyZDQ3Li4xNDU4OTQ1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0h1bmtIZWFkZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL0h1bmtIZWFkZXIuamF2YQpAQCAtMTIwLDcgKzEyMCw3IEBAIHB1YmxpYyBpbnQgZ2V0TGluZXNBZGRlZCgpIHsKIAogCXByaXZhdGUgRWRpdExpc3QgZWRpdExpc3Q7CiAKLQlIdW5rSGVhZGVyKGZpbmFsIEZpbGVIZWFkZXIgZmgsIGZpbmFsIGludCBvZmZzZXQpIHsKKwlIdW5rSGVhZGVyKEZpbGVIZWFkZXIgZmgsIGludCBvZmZzZXQpIHsKIAkJdGhpcyhmaCwgb2Zmc2V0LCBuZXcgT2xkSW1hZ2UoKSB7CiAJCQlAT3ZlcnJpZGUKIAkJCXB1YmxpYyBBYmJyZXZpYXRlZE9iamVjdElkIGdldElkKCkgewpAQCAtMTI5LDEzICsxMjksMTMgQEAgcHVibGljIEFiYnJldmlhdGVkT2JqZWN0SWQgZ2V0SWQoKSB7CiAJCX0pOwogCX0KIAotCUh1bmtIZWFkZXIoZmluYWwgRmlsZUhlYWRlciBmaCwgZmluYWwgaW50IG9mZnNldCwgZmluYWwgT2xkSW1hZ2Ugb2kpIHsKKwlIdW5rSGVhZGVyKEZpbGVIZWFkZXIgZmgsIGludCBvZmZzZXQsIE9sZEltYWdlIG9pKSB7CiAJCWZpbGUgPSBmaDsKIAkJc3RhcnRPZmZzZXQgPSBvZmZzZXQ7CiAJCW9sZCA9IG9pOwogCX0KIAotCUh1bmtIZWFkZXIoZmluYWwgRmlsZUhlYWRlciBmaCwgZmluYWwgRWRpdExpc3QgZWRpdExpc3QpIHsKKwlIdW5rSGVhZGVyKEZpbGVIZWFkZXIgZmgsIEVkaXRMaXN0IGVkaXRMaXN0KSB7CiAJCXRoaXMoZmgsIGZoLmJ1Zi5sZW5ndGgpOwogCQl0aGlzLmVkaXRMaXN0ID0gZWRpdExpc3Q7CiAJCWVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0OwpAQCAtMjkzLDcgKzI5Myw3IEBAIHZvaWQgcGFyc2VIZWFkZXIoKSB7CiAJCQluZXdMaW5lQ291bnQgPSAxOwogCX0KIAotCWludCBwYXJzZUJvZHkoZmluYWwgUGF0Y2ggc2NyaXB0LCBmaW5hbCBpbnQgZW5kKSB7CisJaW50IHBhcnNlQm9keShQYXRjaCBzY3JpcHQsIGludCBlbmQpIHsKIAkJZmluYWwgYnl0ZVtdIGJ1ZiA9IGZpbGUuYnVmOwogCQlpbnQgYyA9IG5leHRMRihidWYsIHN0YXJ0T2Zmc2V0KSwgbGFzdCA9IGM7CiAKQEAgLTM1OSw3ICszNTksNyBAQCAmJiBtYXRjaChidWYsIGxhc3QsIFBhdGNoLlNJR19GT09URVIpID49IDApIHsKIAkJcmV0dXJuIGM7CiAJfQogCi0Jdm9pZCBleHRyYWN0RmlsZUxpbmVzKGZpbmFsIE91dHB1dFN0cmVhbVtdIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIGV4dHJhY3RGaWxlTGluZXMoT3V0cHV0U3RyZWFtW10gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gYnVmID0gZmlsZS5idWY7CiAJCWludCBwdHIgPSBzdGFydE9mZnNldDsKIAkJaW50IGVvbCA9IG5leHRMRihidWYsIHB0cik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3BhdGNoL1BhdGNoLmphdmEKaW5kZXggZGExMjNhNy4uMDUyZjJhNyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9wYXRjaC9QYXRjaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcGF0Y2gvUGF0Y2guamF2YQpAQCAtMTAxLDcgKzEwMSw3IEBAIHB1YmxpYyBQYXRjaCgpIHsKIAkgKiBAcGFyYW0gZmgKIAkgKiAgICAgICAgICAgIHRoZSBoZWFkZXIgb2YgdGhlIGZpbGUuCiAJICovCi0JcHVibGljIHZvaWQgYWRkRmlsZShmaW5hbCBGaWxlSGVhZGVyIGZoKSB7CisJcHVibGljIHZvaWQgYWRkRmlsZShGaWxlSGVhZGVyIGZoKSB7CiAJCWZpbGVzLmFkZChmaCk7CiAJfQogCkBAIC0xMjAsNyArMTIwLDcgQEAgcHVibGljIExpc3Q8PyBleHRlbmRzIEZpbGVIZWFkZXI+IGdldEZpbGVzKCkgewogCSAqIEBwYXJhbSBlcnIKIAkgKiAgICAgICAgICAgIHRoZSBlcnJvciBkZXNjcmlwdGlvbi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFcnJvcihmaW5hbCBGb3JtYXRFcnJvciBlcnIpIHsKKwlwdWJsaWMgdm9pZCBhZGRFcnJvcihGb3JtYXRFcnJvciBlcnIpIHsKIAkJZXJyb3JzLmFkZChlcnIpOwogCX0KIApAQCAtMTQ2LDEyICsxNDYsMTIgQEAgcHVibGljIExpc3Q8Rm9ybWF0RXJyb3I+IGdldEVycm9ycygpIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uCiAJICovCi0JcHVibGljIHZvaWQgcGFyc2UoZmluYWwgSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJ5dGVbXSBidWYgPSByZWFkRnVsbHkoaXMpOwogCQlwYXJzZShidWYsIDAsIGJ1Zi5sZW5ndGgpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJ5dGVbXSByZWFkRnVsbHkoZmluYWwgSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHJlYWRGdWxseShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IChUZW1wb3JhcnlCdWZmZXIgYiA9IG5ldyBUZW1wb3JhcnlCdWZmZXIuSGVhcChJbnRlZ2VyLk1BWF9WQUxVRSkpIHsKIAkJCWIuY29weShpcyk7CiAJCQlyZXR1cm4gYi50b0J5dGVBcnJheSgpOwpAQCAtMTczLDEyICsxNzMsMTIgQEAgcHVibGljIHZvaWQgcGFyc2UoZmluYWwgSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICAxIHBhc3QgdGhlIGxhc3QgcG9zaXRpb24gdG8gZW5kIHBhcnNpbmcuIFRoZSB0b3RhbCBsZW5ndGggdG8KIAkgKiAgICAgICAgICAgIGJlIHBhcnNlZCBpcyA8Y29kZT5lbmQgLSBwdHI8L2NvZGU+LgogCSAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKGZpbmFsIGJ5dGVbXSBidWYsIGludCBwdHIsIGZpbmFsIGludCBlbmQpIHsKKwlwdWJsaWMgdm9pZCBwYXJzZShieXRlW10gYnVmLCBpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCXdoaWxlIChwdHIgPCBlbmQpCiAJCQlwdHIgPSBwYXJzZUZpbGUoYnVmLCBwdHIsIGVuZCk7CiAJfQogCi0JcHJpdmF0ZSBpbnQgcGFyc2VGaWxlKGZpbmFsIGJ5dGVbXSBidWYsIGludCBjLCBmaW5hbCBpbnQgZW5kKSB7CisJcHJpdmF0ZSBpbnQgcGFyc2VGaWxlKGJ5dGVbXSBidWYsIGludCBjLCBpbnQgZW5kKSB7CiAJCXdoaWxlIChjIDwgZW5kKSB7CiAJCQlpZiAoaXNIdW5rSGRyKGJ1ZiwgYywgZW5kKSA+PSAxKSB7CiAJCQkJLy8gSWYgd2UgZmluZCBhIGRpc2Nvbm5lY3RlZCBodW5rIGhlYWRlciB3ZSBtaWdodApAQCAtMjM0LDcgKzIzNCw3IEBAIHByaXZhdGUgaW50IHBhcnNlRmlsZShmaW5hbCBieXRlW10gYnVmLCBpbnQgYywgZmluYWwgaW50IGVuZCkgewogCQlyZXR1cm4gYzsKIAl9CiAKLQlwcml2YXRlIGludCBwYXJzZURpZmZHaXQoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgZW5kKSB7CisJcHJpdmF0ZSBpbnQgcGFyc2VEaWZmR2l0KGJ5dGVbXSBidWYsIGludCBzdGFydCwgaW50IGVuZCkgewogCQlmaW5hbCBGaWxlSGVhZGVyIGZoID0gbmV3IEZpbGVIZWFkZXIoYnVmLCBzdGFydCk7CiAJCWludCBwdHIgPSBmaC5wYXJzZUdpdEZpbGVOYW1lKHN0YXJ0ICsgRElGRl9HSVQubGVuZ3RoLCBlbmQpOwogCQlpZiAocHRyIDwgMCkKQEAgLTI3MSwxNCArMjcxLDE0IEBAIHByaXZhdGUgaW50IHBhcnNlVHJhZGl0aW9uYWxQYXRjaChmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgc3RhcnQsCiAJCXJldHVybiBwdHI7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IHNraXBGaWxlKGZpbmFsIGJ5dGVbXSBidWYsIGludCBwdHIpIHsKKwlwcml2YXRlIHN0YXRpYyBpbnQgc2tpcEZpbGUoYnl0ZVtdIGJ1ZiwgaW50IHB0cikgewogCQlwdHIgPSBuZXh0TEYoYnVmLCBwdHIpOwogCQlpZiAobWF0Y2goYnVmLCBwdHIsIE9MRF9OQU1FKSA+PSAwKQogCQkJcHRyID0gbmV4dExGKGJ1ZiwgcHRyKTsKIAkJcmV0dXJuIHB0cjsKIAl9CiAKLQlwcml2YXRlIGludCBwYXJzZUh1bmtzKGZpbmFsIEZpbGVIZWFkZXIgZmgsIGludCBjLCBmaW5hbCBpbnQgZW5kKSB7CisJcHJpdmF0ZSBpbnQgcGFyc2VIdW5rcyhGaWxlSGVhZGVyIGZoLCBpbnQgYywgaW50IGVuZCkgewogCQlmaW5hbCBieXRlW10gYnVmID0gZmguYnVmOwogCQl3aGlsZSAoYyA8IGVuZCkgewogCQkJLy8gSWYgd2Ugc2VlIGEgZmlsZSBoZWFkZXIgYXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBhbGwgb2YgdGhlCkBAIC0zNDksNyArMzQ5LDcgQEAgJiYgbWF0Y2hBbnkoYnVmLCBjLCBCSU5fSEVBREVSUykpIHsKIAkJcmV0dXJuIGM7CiAJfQogCi0JcHJpdmF0ZSBpbnQgcGFyc2VHaXRCaW5hcnkoZmluYWwgRmlsZUhlYWRlciBmaCwgaW50IGMsIGZpbmFsIGludCBlbmQpIHsKKwlwcml2YXRlIGludCBwYXJzZUdpdEJpbmFyeShGaWxlSGVhZGVyIGZoLCBpbnQgYywgaW50IGVuZCkgewogCQlmaW5hbCBCaW5hcnlIdW5rIHBvc3RJbWFnZSA9IG5ldyBCaW5hcnlIdW5rKGZoLCBjKTsKIAkJZmluYWwgaW50IG5FbmQgPSBwb3N0SW1hZ2UucGFyc2VIdW5rKGMsIGVuZCk7CiAJCWlmIChuRW5kIDwgMCkgewpAQCAtMzczLDE3ICszNzMsMTcgQEAgcHJpdmF0ZSBpbnQgcGFyc2VHaXRCaW5hcnkoZmluYWwgRmlsZUhlYWRlciBmaCwgaW50IGMsIGZpbmFsIGludCBlbmQpIHsKIAkJcmV0dXJuIGM7CiAJfQogCi0Jdm9pZCB3YXJuKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBwdHIsIGZpbmFsIFN0cmluZyBtc2cpIHsKKwl2b2lkIHdhcm4oYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgU3RyaW5nIG1zZykgewogCQlhZGRFcnJvcihuZXcgRm9ybWF0RXJyb3IoYnVmLCBwdHIsIEZvcm1hdEVycm9yLlNldmVyaXR5LldBUk5JTkcsIG1zZykpOwogCX0KIAotCXZvaWQgZXJyb3IoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IHB0ciwgZmluYWwgU3RyaW5nIG1zZykgeworCXZvaWQgZXJyb3IoYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgU3RyaW5nIG1zZykgewogCQlhZGRFcnJvcihuZXcgRm9ybWF0RXJyb3IoYnVmLCBwdHIsIEZvcm1hdEVycm9yLlNldmVyaXR5LkVSUk9SLCBtc2cpKTsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoQW55KGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBjLAogCQkJZmluYWwgYnl0ZVtdW10gc3JjcykgewotCQlmb3IgKGZpbmFsIGJ5dGVbXSBzIDogc3JjcykgeworCQlmb3IgKGJ5dGVbXSBzIDogc3JjcykgewogCQkJaWYgKG1hdGNoKGJ1ZiwgYywgcykgPj0gMCkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L0Fic3RyYWN0UGxvdFJlbmRlcmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvQWJzdHJhY3RQbG90UmVuZGVyZXIuamF2YQppbmRleCBmODhiODE5Li41OGUyMTA2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvQWJzdHJhY3RQbG90UmVuZGVyZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvQWJzdHJhY3RQbG90UmVuZGVyZXIuamF2YQpAQCAtOTIsMTQgKzkyLDE0IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBsb3RSZW5kZXJlcjxUTGFuZSBleHRlbmRzIFBsb3RMYW5lLCBUQ29sb3I+IHsKIAkgKiAgICAgICAgICAgIHRvdGFsIGhlaWdodCAoaW4gcGl4ZWxzKSBvZiB0aGlzIGNlbGwuCiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRDb21taXQoZmluYWwgUGxvdENvbW1pdDxUTGFuZT4gY29tbWl0LCBmaW5hbCBpbnQgaCkgeworCXByb3RlY3RlZCB2b2lkIHBhaW50Q29tbWl0KFBsb3RDb21taXQ8VExhbmU+IGNvbW1pdCwgaW50IGgpIHsKIAkJZmluYWwgaW50IGRvdFNpemUgPSBjb21wdXRlRG90U2l6ZShoKTsKIAkJZmluYWwgVExhbmUgbXlMYW5lID0gY29tbWl0LmdldExhbmUoKTsKIAkJZmluYWwgaW50IG15TGFuZVggPSBsYW5lQyhteUxhbmUpOwogCQlmaW5hbCBUQ29sb3IgbXlDb2xvciA9IGxhbmVDb2xvcihteUxhbmUpOwogCiAJCWludCBtYXhDZW50ZXIgPSBteUxhbmVYOwotCQlmb3IgKGZpbmFsIFRMYW5lIHBhc3NpbmdMYW5lIDogKFRMYW5lW10pIGNvbW1pdC5wYXNzaW5nTGFuZXMpIHsKKwkJZm9yIChUTGFuZSBwYXNzaW5nTGFuZSA6IChUTGFuZVtdKSBjb21taXQucGFzc2luZ0xhbmVzKSB7CiAJCQlmaW5hbCBpbnQgY3ggPSBsYW5lQyhwYXNzaW5nTGFuZSk7CiAJCQlmaW5hbCBUQ29sb3IgYyA9IGxhbmVDb2xvcihwYXNzaW5nTGFuZSk7CiAJCQlkcmF3TGluZShjLCBjeCwgMCwgY3gsIGgsIExJTkVfV0lEVEgpOwpAQCAtMTkwLDcgKzE5MCw3IEBAIHByb3RlY3RlZCB2b2lkIHBhaW50Q29tbWl0KGZpbmFsIFBsb3RDb21taXQ8VExhbmU+IGNvbW1pdCwgZmluYWwgaW50IGgpIHsKIAkgKi8KIAlwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IGRyYXdMYWJlbChpbnQgeCwgaW50IHksIFJlZiByZWYpOwogCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXB1dGVEb3RTaXplKGZpbmFsIGludCBoKSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXB1dGVEb3RTaXplKGludCBoKSB7CiAJCWludCBkID0gKGludCkgKE1hdGgubWluKGgsIExBTkVfV0lEVEgpICogMC41MGYpOwogCQlkICs9IChkICYgMSk7CiAJCXJldHVybiBkOwpAQCAtMjgyLDEyICsyODIsMTIgQEAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZHJhd0xpbmUoVENvbG9yIGNvbG9yLCBpbnQgeDEsIGludCB5MSwgaW50IHgyLAogCSAqLwogCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRyYXdUZXh0KFN0cmluZyBtc2csIGludCB4LCBpbnQgeSk7CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgbGFuZVgoZmluYWwgUGxvdExhbmUgbXlMYW5lKSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IGxhbmVYKFBsb3RMYW5lIG15TGFuZSkgewogCQlmaW5hbCBpbnQgcCA9IG15TGFuZSAhPSBudWxsID8gbXlMYW5lLmdldFBvc2l0aW9uKCkgOiAwOwogCQlyZXR1cm4gTEVGVF9QQUQgKyBMQU5FX1dJRFRIICogcDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgbGFuZUMoZmluYWwgUGxvdExhbmUgbXlMYW5lKSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IGxhbmVDKFBsb3RMYW5lIG15TGFuZSkgewogCQlyZXR1cm4gbGFuZVgobXlMYW5lKSArIExBTkVfV0lEVEggLyAyOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90Q29tbWl0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdENvbW1pdC5qYXZhCmluZGV4IDA5MWJmNjguLjk5MTRiMGMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90Q29tbWl0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RDb21taXQuamF2YQpAQCAtNzksNyArNzksNyBAQCBwdWJsaWMgY2xhc3MgUGxvdENvbW1pdDxMIGV4dGVuZHMgUGxvdExhbmU+IGV4dGVuZHMgUmV2Q29tbWl0IHsKIAkgKiBAcGFyYW0gaWQKIAkgKiAgICAgICAgICAgIHRoZSBpZGVudGl0eSBvZiB0aGlzIGNvbW1pdC4KIAkgKi8KLQlwcm90ZWN0ZWQgUGxvdENvbW1pdChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXByb3RlY3RlZCBQbG90Q29tbWl0KEFueU9iamVjdElkIGlkKSB7CiAJCXN1cGVyKGlkKTsKIAkJZm9ya2luZ09mZkxhbmVzID0gTk9fTEFORVM7CiAJCXBhc3NpbmdMYW5lcyA9IE5PX0xBTkVTOwpAQCAtODgsMTkgKzg4LDE5IEBAIHByb3RlY3RlZCBQbG90Q29tbWl0KGZpbmFsIEFueU9iamVjdElkIGlkKSB7CiAJCXJlZnMgPSBOT19SRUZTOwogCX0KIAotCXZvaWQgYWRkRm9ya2luZ09mZkxhbmUoZmluYWwgUGxvdExhbmUgZikgeworCXZvaWQgYWRkRm9ya2luZ09mZkxhbmUoUGxvdExhbmUgZikgewogCQlmb3JraW5nT2ZmTGFuZXMgPSBhZGRMYW5lKGYsIGZvcmtpbmdPZmZMYW5lcyk7CiAJfQogCi0Jdm9pZCBhZGRQYXNzaW5nTGFuZShmaW5hbCBQbG90TGFuZSBjKSB7CisJdm9pZCBhZGRQYXNzaW5nTGFuZShQbG90TGFuZSBjKSB7CiAJCXBhc3NpbmdMYW5lcyA9IGFkZExhbmUoYywgcGFzc2luZ0xhbmVzKTsKIAl9CiAKLQl2b2lkIGFkZE1lcmdpbmdMYW5lKGZpbmFsIFBsb3RMYW5lIG0pIHsKKwl2b2lkIGFkZE1lcmdpbmdMYW5lKFBsb3RMYW5lIG0pIHsKIAkJbWVyZ2luZ0xhbmVzID0gYWRkTGFuZShtLCBtZXJnaW5nTGFuZXMpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFBsb3RMYW5lW10gYWRkTGFuZShmaW5hbCBQbG90TGFuZSBsLCBQbG90TGFuZVtdIGxhbmVzKSB7CisJcHJpdmF0ZSBzdGF0aWMgUGxvdExhbmVbXSBhZGRMYW5lKFBsb3RMYW5lIGwsIFBsb3RMYW5lW10gbGFuZXMpIHsKIAkJZmluYWwgaW50IGNudCA9IGxhbmVzLmxlbmd0aDsKIAkJaWYgKGNudCA9PSAwKQogCQkJbGFuZXMgPSBuZXcgUGxvdExhbmVbXSB7IGwgfTsKQEAgLTExNSw3ICsxMTUsNyBAQCBlbHNlIGlmIChjbnQgPT0gMSkKIAkJcmV0dXJuIGxhbmVzOwogCX0KIAotCXZvaWQgYWRkQ2hpbGQoZmluYWwgUGxvdENvbW1pdCBjKSB7CisJdm9pZCBhZGRDaGlsZChQbG90Q29tbWl0IGMpIHsKIAkJZmluYWwgaW50IGNudCA9IGNoaWxkcmVuLmxlbmd0aDsKIAkJaWYgKGNudCA9PSAwKQogCQkJY2hpbGRyZW4gPSBuZXcgUGxvdENvbW1pdFtdIHsgYyB9OwpAQCAtMTUyLDcgKzE1Miw3IEBAIHB1YmxpYyBmaW5hbCBpbnQgZ2V0Q2hpbGRDb3VudCgpIHsKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhbiBpbnZhbGlkIGNoaWxkIGluZGV4IHdhcyBzcGVjaWZpZWQuCiAJICovCi0JcHVibGljIGZpbmFsIFBsb3RDb21taXQgZ2V0Q2hpbGQoZmluYWwgaW50IG50aCkgeworCXB1YmxpYyBmaW5hbCBQbG90Q29tbWl0IGdldENoaWxkKGludCBudGgpIHsKIAkJcmV0dXJuIGNoaWxkcmVuW250aF07CiAJfQogCkBAIC0xNjMsOCArMTYzLDggQEAgcHVibGljIGZpbmFsIFBsb3RDb21taXQgZ2V0Q2hpbGQoZmluYWwgaW50IG50aCkgewogCSAqICAgICAgICAgICAgdGhlIGNvbW1pdCB0byB0ZXN0LgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29tbWl0IGJ1aWx0IG9uIHRvcCBvZiB0aGlzIGNvbW1pdC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NoaWxkKGZpbmFsIFBsb3RDb21taXQgYykgewotCQlmb3IgKGZpbmFsIFBsb3RDb21taXQgYSA6IGNoaWxkcmVuKQorCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2hpbGQoUGxvdENvbW1pdCBjKSB7CisJCWZvciAoUGxvdENvbW1pdCBhIDogY2hpbGRyZW4pCiAJCQlpZiAoYSA9PSBjKQogCQkJCXJldHVybiB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CkBAIC0xODksNyArMTg5LDcgQEAgcHVibGljIGZpbmFsIGludCBnZXRSZWZDb3VudCgpIHsKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhbiBpbnZhbGlkIHJlZiBpbmRleCB3YXMgc3BlY2lmaWVkLgogCSAqLwotCXB1YmxpYyBmaW5hbCBSZWYgZ2V0UmVmKGZpbmFsIGludCBudGgpIHsKKwlwdWJsaWMgZmluYWwgUmVmIGdldFJlZihpbnQgbnRoKSB7CiAJCXJldHVybiByZWZzW250aF07CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdENvbW1pdExpc3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90Q29tbWl0TGlzdC5qYXZhCmluZGV4IDZhMGJhNjYuLjVlMTUzMTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90Q29tbWl0TGlzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2cGxvdC9QbG90Q29tbWl0TGlzdC5qYXZhCkBAIC05NCw3ICs5NCw3IEBAIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzb3VyY2UoZmluYWwgUmV2V2FsayB3KSB7CisJcHVibGljIHZvaWQgc291cmNlKFJldldhbGsgdykgewogCQlpZiAoISh3IGluc3RhbmNlb2YgUGxvdFdhbGspKQogCQkJdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5jbGFzc0Nhc3ROb3RBLCBQbG90V2Fsay5jbGFzcy5nZXROYW1lKCkpKTsKIAkJc3VwZXIuc291cmNlKHcpOwpAQCAtMTIwLDEzICsxMjAsMTMgQEAgcHVibGljIHZvaWQgc291cmNlKGZpbmFsIFJldldhbGsgdykgewogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQogCXB1YmxpYyB2b2lkIGZpbmRQYXNzaW5nVGhyb3VnaChmaW5hbCBQbG90Q29tbWl0PEw+IGN1cnJDb21taXQsCiAJCQlmaW5hbCBDb2xsZWN0aW9uPEw+IHJlc3VsdCkgewotCQlmb3IgKGZpbmFsIFBsb3RMYW5lIHAgOiBjdXJyQ29tbWl0LnBhc3NpbmdMYW5lcykKKwkJZm9yIChQbG90TGFuZSBwIDogY3VyckNvbW1pdC5wYXNzaW5nTGFuZXMpCiAJCQlyZXN1bHQuYWRkKChMKSBwKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXByb3RlY3RlZCB2b2lkIGVudGVyKGZpbmFsIGludCBpbmRleCwgZmluYWwgUGxvdENvbW1pdDxMPiBjdXJyQ29tbWl0KSB7CisJcHJvdGVjdGVkIHZvaWQgZW50ZXIoaW50IGluZGV4LCBQbG90Q29tbWl0PEw+IGN1cnJDb21taXQpIHsKIAkJc2V0dXBDaGlsZHJlbihjdXJyQ29tbWl0KTsKIAogCQlmaW5hbCBpbnQgbkNoaWxkcmVuID0gY3VyckNvbW1pdC5nZXRDaGlsZENvdW50KCk7CkBAIC0yMDIsNyArMjAyLDcgQEAgcHJvdGVjdGVkIHZvaWQgZW50ZXIoZmluYWwgaW50IGluZGV4LCBmaW5hbCBQbG90Q29tbWl0PEw+IGN1cnJDb21taXQpIHsKIAkJCWNsb3NlTGFuZShjdXJyQ29tbWl0LmxhbmUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBjb250aW51ZUFjdGl2ZUxhbmVzKGZpbmFsIFBsb3RDb21taXQgY3VyckNvbW1pdCkgeworCXByaXZhdGUgdm9pZCBjb250aW51ZUFjdGl2ZUxhbmVzKFBsb3RDb21taXQgY3VyckNvbW1pdCkgewogCQlmb3IgKFBsb3RMYW5lIGxhbmUgOiBhY3RpdmVMYW5lcykKIAkJCWlmIChsYW5lICE9IGN1cnJDb21taXQubGFuZSkKIAkJCQljdXJyQ29tbWl0LmFkZFBhc3NpbmdMYW5lKGxhbmUpOwpAQCAtMzU2LDcgKzM1Niw3IEBAIHByaXZhdGUgdm9pZCBjbG9zZUxhbmUoUGxvdExhbmUgbGFuZSkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNldHVwQ2hpbGRyZW4oZmluYWwgUGxvdENvbW1pdDxMPiBjdXJyQ29tbWl0KSB7CisJcHJpdmF0ZSB2b2lkIHNldHVwQ2hpbGRyZW4oUGxvdENvbW1pdDxMPiBjdXJyQ29tbWl0KSB7CiAJCWZpbmFsIGludCBuUGFyZW50cyA9IGN1cnJDb21taXQuZ2V0UGFyZW50Q291bnQoKTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUGFyZW50czsgaSsrKQogCQkJKChQbG90Q29tbWl0KSBjdXJyQ29tbWl0LmdldFBhcmVudChpKSkuYWRkQ2hpbGQoY3VyckNvbW1pdCk7CkBAIC00MTYsNyArNDE2LDcgQEAgcHJvdGVjdGVkIEwgY3JlYXRlTGFuZSgpIHsKIAkgKiBAcGFyYW0gbGFuZQogCSAqICAgICAgICAgICAgYSBsYW5lCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgcmVjeWNsZUxhbmUoZmluYWwgTCBsYW5lKSB7CisJcHJvdGVjdGVkIHZvaWQgcmVjeWNsZUxhbmUoTCBsYW5lKSB7CiAJCS8vIE5vdGhpbmcuCiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZwbG90L1Bsb3RXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdFdhbGsuamF2YQppbmRleCA4YmE4ZDZlLi5mMjdmMzU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdFdhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldnBsb3QvUGxvdFdhbGsuamF2YQpAQCAtOTAsNyArOTAsNyBAQCBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSB0aGUgd2Fsa2VyIHdpbGwgb2J0YWluIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgUGxvdFdhbGsoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CisJcHVibGljIFBsb3RXYWxrKFJlcG9zaXRvcnkgcmVwbykgewogCQlzdXBlcihyZXBvKTsKIAkJc3VwZXIuc29ydChSZXZTb3J0LlRPUE8sIHRydWUpOwogCQlyZXZlcnNlUmVmTWFwID0gcmVwby5nZXRBbGxSZWZzQnlQZWVsZWRPYmplY3RJZCgpOwpAQCAtMTE4LDcgKzExOCw3IEBAIHB1YmxpYyB2b2lkIGFkZEFkZGl0aW9uYWxSZWZzKEl0ZXJhYmxlPFJlZj4gcmVmcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgc29ydChmaW5hbCBSZXZTb3J0IHMsIGZpbmFsIGJvb2xlYW4gdXNlKSB7CisJcHVibGljIHZvaWQgc29ydChSZXZTb3J0IHMsIGJvb2xlYW4gdXNlKSB7CiAJCWlmIChzID09IFJldlNvcnQuVE9QTyAmJiAhdXNlKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS50b3BvbG9naWNhbFNvcnRSZXF1aXJlZCk7CiAJCXN1cGVyLnNvcnQocywgdXNlKTsKQEAgLTEyNiw3ICsxMjYsNyBAQCBwdWJsaWMgdm9pZCBzb3J0KGZpbmFsIFJldlNvcnQgcywgZmluYWwgYm9vbGVhbiB1c2UpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIFJldkNvbW1pdCBjcmVhdGVDb21taXQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNyZWF0ZUNvbW1pdChBbnlPYmplY3RJZCBpZCkgewogCQlyZXR1cm4gbmV3IFBsb3RDb21taXQoaWQpOwogCX0KIApAQCAtMTQwLDcgKzE0MCw3IEBAIHB1YmxpYyBSZXZDb21taXQgbmV4dCgpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQlyZXR1cm4gcGM7CiAJfQogCi0JcHJpdmF0ZSBSZWZbXSBnZXRSZWZzKGZpbmFsIEFueU9iamVjdElkIGNvbW1pdElkKSB7CisJcHJpdmF0ZSBSZWZbXSBnZXRSZWZzKEFueU9iamVjdElkIGNvbW1pdElkKSB7CiAJCUNvbGxlY3Rpb248UmVmPiBsaXN0ID0gcmV2ZXJzZVJlZk1hcC5nZXQoY29tbWl0SWQpOwogCQlpZiAobGlzdCA9PSBudWxsKQogCQkJcmV0dXJuIFBsb3RDb21taXQuTk9fUkVGUzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9BYnN0cmFjdFJldlF1ZXVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQWJzdHJhY3RSZXZRdWV1ZS5qYXZhCmluZGV4IGI5NDhhZGIuLjI0N2EzYmQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9BYnN0cmFjdFJldlF1ZXVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Fic3RyYWN0UmV2UXVldWUuamF2YQpAQCAtNzQsNyArNzQsNyBAQCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJldlF1ZXVlIGV4dGVuZHMgR2VuZXJhdG9yIHsKIAkgKiBAcGFyYW0gcXVldWVDb250cm9sCiAJICogICAgICAgICAgICBmbGFnIHRoYXQgY29udHJvbHMgYWRtaXNzaW9uIHRvIHRoZSBxdWV1ZS4KIAkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGQoZmluYWwgUmV2Q29tbWl0IGMsIGZpbmFsIFJldkZsYWcgcXVldWVDb250cm9sKSB7CisJcHVibGljIGZpbmFsIHZvaWQgYWRkKFJldkNvbW1pdCBjLCBSZXZGbGFnIHF1ZXVlQ29udHJvbCkgewogCQlpZiAoIWMuaGFzKHF1ZXVlQ29udHJvbCkpIHsKIAkJCWMuYWRkKHF1ZXVlQ29udHJvbCk7CiAJCQlhZGQoYyk7CkBAIC05NCw3ICs5NCw3IEBAIHB1YmxpYyBmaW5hbCB2b2lkIGFkZChmaW5hbCBSZXZDb21taXQgYywgZmluYWwgUmV2RmxhZyBxdWV1ZUNvbnRyb2wpIHsKIAkgKiBAcGFyYW0gcXVldWVDb250cm9sCiAJICogICAgICAgICAgICBmbGFnIHRoYXQgY29udHJvbHMgYWRtaXNzaW9uIHRvIHRoZSBxdWV1ZS4KIAkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRQYXJlbnRzKGZpbmFsIFJldkNvbW1pdCBjLCBmaW5hbCBSZXZGbGFnIHF1ZXVlQ29udHJvbCkgeworCXB1YmxpYyBmaW5hbCB2b2lkIGFkZFBhcmVudHMoUmV2Q29tbWl0IGMsIFJldkZsYWcgcXVldWVDb250cm9sKSB7CiAJCWZpbmFsIFJldkNvbW1pdFtdIHBMaXN0ID0gYy5wYXJlbnRzOwogCQlpZiAocExpc3QgPT0gbnVsbCkKIAkJCXJldHVybjsKQEAgLTEzMiw3ICsxMzIsNyBAQCBpbnQgb3V0cHV0VHlwZSgpIHsKIAkgKiBAcGFyYW0gYwogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLlJldkNvbW1pdH0KIAkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZGVzY3JpYmUoZmluYWwgU3RyaW5nQnVpbGRlciBzLCBmaW5hbCBSZXZDb21taXQgYykgeworCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBkZXNjcmliZShTdHJpbmdCdWlsZGVyIHMsIFJldkNvbW1pdCBjKSB7CiAJCXMuYXBwZW5kKGMudG9TdHJpbmcoKSk7CiAJCXMuYXBwZW5kKCdcbicpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9CbG9ja09ialF1ZXVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQmxvY2tPYmpRdWV1ZS5qYXZhCmluZGV4IDM3MWNkMDYuLmZjZGY3OTUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9CbG9ja09ialF1ZXVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Jsb2NrT2JqUXVldWUuamF2YQpAQCAtNTUsNyArNTUsNyBAQCBjbGFzcyBCbG9ja09ialF1ZXVlIHsKIAkJZnJlZSA9IG5ldyBCbG9ja0ZyZWVMaXN0KCk7CiAJfQogCi0Jdm9pZCBhZGQoZmluYWwgUmV2T2JqZWN0IGMpIHsKKwl2b2lkIGFkZChSZXZPYmplY3QgYykgewogCQlCbG9jayBiID0gdGFpbDsKIAkJaWYgKGIgPT0gbnVsbCkgewogCQkJYiA9IGZyZWUubmV3QmxvY2soKTsKQEAgLTk4LDcgKzk4LDcgQEAgQmxvY2sgbmV3QmxvY2soKSB7CiAJCQlyZXR1cm4gYjsKIAkJfQogCi0JCXZvaWQgZnJlZUJsb2NrKGZpbmFsIEJsb2NrIGIpIHsKKwkJdm9pZCBmcmVlQmxvY2soQmxvY2sgYikgewogCQkJYi5uZXh0ID0gbmV4dDsKIAkJCW5leHQgPSBiOwogCQl9CkBAIC0xMjcsNyArMTI3LDcgQEAgYm9vbGVhbiBpc0VtcHR5KCkgewogCQkJcmV0dXJuIGhlYWRJbmRleCA9PSB0YWlsSW5kZXg7CiAJCX0KIAotCQl2b2lkIGFkZChmaW5hbCBSZXZPYmplY3QgYykgeworCQl2b2lkIGFkZChSZXZPYmplY3QgYykgewogCQkJb2JqZWN0c1t0YWlsSW5kZXgrK10gPSBjOwogCQl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9CbG9ja1JldlF1ZXVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQmxvY2tSZXZRdWV1ZS5qYXZhCmluZGV4IDc0YTM1MTEuLjc5MzA3YjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9CbG9ja1JldlF1ZXVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Jsb2NrUmV2UXVldWUuamF2YQpAQCAtNTgsNyArNTgsNyBAQCBwcm90ZWN0ZWQgQmxvY2tSZXZRdWV1ZSgpIHsKIAkJZnJlZSA9IG5ldyBCbG9ja0ZyZWVMaXN0KCk7CiAJfQogCi0JQmxvY2tSZXZRdWV1ZShmaW5hbCBHZW5lcmF0b3IgcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJQmxvY2tSZXZRdWV1ZShHZW5lcmF0b3IgcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWZyZWUgPSBuZXcgQmxvY2tGcmVlTGlzdCgpOwogCQlvdXRwdXRUeXBlID0gcy5vdXRwdXRUeXBlKCk7CkBAIC04NSw3ICs4NSw3IEBAIHByb3RlY3RlZCBCbG9ja1JldlF1ZXVlKCkgewogCSAqIHNoYXJpbmcgdGhlIHNhbWUgZnJlZSBsaXN0IGFyZSBkb2luZyBzbyBmcm9tIG9ubHkgYSBzaW5nbGUgdGhyZWFkLgogCSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNoYXJlRnJlZUxpc3QoZmluYWwgQmxvY2tSZXZRdWV1ZSBxKSB7CisJcHVibGljIHZvaWQgc2hhcmVGcmVlTGlzdChCbG9ja1JldlF1ZXVlIHEpIHsKIAkJZnJlZSA9IHEuZnJlZTsKIAl9CiAKQEAgLTEwMSw3ICsxMDEsNyBAQCBCbG9jayBuZXdCbG9jaygpIHsKIAkJCXJldHVybiBiOwogCQl9CiAKLQkJdm9pZCBmcmVlQmxvY2soZmluYWwgQmxvY2sgYikgeworCQl2b2lkIGZyZWVCbG9jayhCbG9jayBiKSB7CiAJCQliLm5leHQgPSBuZXh0OwogCQkJbmV4dCA9IGI7CiAJCX0KQEAgLTEzOCwxMSArMTM4LDExIEBAIGJvb2xlYW4gY2FuVW5wb3AoKSB7CiAJCQlyZXR1cm4gaGVhZEluZGV4ID4gMDsKIAkJfQogCi0JCXZvaWQgYWRkKGZpbmFsIFJldkNvbW1pdCBjKSB7CisJCXZvaWQgYWRkKFJldkNvbW1pdCBjKSB7CiAJCQljb21taXRzW3RhaWxJbmRleCsrXSA9IGM7CiAJCX0KIAotCQl2b2lkIHVucG9wKGZpbmFsIFJldkNvbW1pdCBjKSB7CisJCXZvaWQgdW5wb3AoUmV2Q29tbWl0IGMpIHsKIAkJCWNvbW1pdHNbLS1oZWFkSW5kZXhdID0gYzsKIAkJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvQm91bmRhcnlHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Cb3VuZGFyeUdlbmVyYXRvci5qYXZhCmluZGV4IDZiZTBjODUuLjBmZDY2MjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Cb3VuZGFyeUdlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Cb3VuZGFyeUdlbmVyYXRvci5qYXZhCkBAIC01NCw3ICs1NCw3IEBAIGNsYXNzIEJvdW5kYXJ5R2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKIAogCUdlbmVyYXRvciBnOwogCi0JQm91bmRhcnlHZW5lcmF0b3IoZmluYWwgUmV2V2FsayB3LCBmaW5hbCBHZW5lcmF0b3IgcykgeworCUJvdW5kYXJ5R2VuZXJhdG9yKFJldldhbGsgdywgR2VuZXJhdG9yIHMpIHsKIAkJZyA9IG5ldyBJbml0aWFsR2VuZXJhdG9yKHcsIHMpOwogCX0KIApAQCAtNjQsNyArNjQsNyBAQCBpbnQgb3V0cHV0VHlwZSgpIHsKIAl9CiAKIAlAT3ZlcnJpZGUKLQl2b2lkIHNoYXJlRnJlZUxpc3QoZmluYWwgQmxvY2tSZXZRdWV1ZSBxKSB7CisJdm9pZCBzaGFyZUZyZWVMaXN0KEJsb2NrUmV2UXVldWUgcSkgewogCQlnLnNoYXJlRnJlZUxpc3QocSk7CiAJfQogCkBAIC04NSw3ICs4NSw3IEBAIHByaXZhdGUgY2xhc3MgSW5pdGlhbEdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAKIAkJcHJpdmF0ZSBmaW5hbCBHZW5lcmF0b3Igc291cmNlOwogCi0JCUluaXRpYWxHZW5lcmF0b3IoZmluYWwgUmV2V2FsayB3LCBmaW5hbCBHZW5lcmF0b3IgcykgeworCQlJbml0aWFsR2VuZXJhdG9yKFJldldhbGsgdywgR2VuZXJhdG9yIHMpIHsKIAkJCXdhbGsgPSB3OwogCQkJaGVsZCA9IG5ldyBGSUZPUmV2UXVldWUoKTsKIAkJCXNvdXJjZSA9IHM7CkBAIC05OCw3ICs5OCw3IEBAIGludCBvdXRwdXRUeXBlKCkgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgc2hhcmVGcmVlTGlzdChmaW5hbCBCbG9ja1JldlF1ZXVlIHEpIHsKKwkJdm9pZCBzaGFyZUZyZWVMaXN0KEJsb2NrUmV2UXVldWUgcSkgewogCQkJcS5zaGFyZUZyZWVMaXN0KGhlbGQpOwogCQl9CiAKQEAgLTEwNyw3ICsxMDcsNyBAQCBSZXZDb21taXQgbmV4dCgpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJCVJldkNvbW1pdCBjID0gc291cmNlLm5leHQoKTsKIAkJCWlmIChjICE9IG51bGwpIHsKLQkJCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKQorCQkJCWZvciAoUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpCiAJCQkJCWlmICgocC5mbGFncyAmIFVOSU5URVJFU1RJTkcpICE9IDApCiAJCQkJCQloZWxkLmFkZChwKTsKIAkJCQlyZXR1cm4gYzsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EYXRlUmV2UXVldWUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EYXRlUmV2UXVldWUuamF2YQppbmRleCBjOTkzZmU1Li5iODZlODc2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGF0ZVJldlF1ZXVlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RhdGVSZXZRdWV1ZS5qYXZhCkBAIC03Niw3ICs3Niw3IEBAIHB1YmxpYyBEYXRlUmV2UXVldWUoKSB7CiAJCXN1cGVyKCk7CiAJfQogCi0JRGF0ZVJldlF1ZXVlKGZpbmFsIEdlbmVyYXRvciBzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlEYXRlUmV2UXVldWUoR2VuZXJhdG9yIHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlmb3IgKDs7KSB7CiAJCQlmaW5hbCBSZXZDb21taXQgYyA9IHMubmV4dCgpOwpAQCAtODgsNyArODgsNyBAQCBwdWJsaWMgRGF0ZVJldlF1ZXVlKCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgUmV2Q29tbWl0IGMpIHsKKwlwdWJsaWMgdm9pZCBhZGQoUmV2Q29tbWl0IGMpIHsKIAkJc2luY2VMYXN0SW5kZXgrKzsKIAkJaWYgKCsraW5RdWV1ZSA+IFJFQlVJTERfSU5ERVhfQ09VTlQKIAkJCQkmJiBzaW5jZUxhc3RJbmRleCA+IFJFQlVJTERfSU5ERVhfQ09VTlQpCkBAIC0xODEsNyArMTgxLDcgQEAgcHVibGljIHZvaWQgY2xlYXIoKSB7CiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBldmVyYm9keUhhc0ZsYWcoZmluYWwgaW50IGYpIHsKKwlib29sZWFuIGV2ZXJib2R5SGFzRmxhZyhpbnQgZikgewogCQlmb3IgKEVudHJ5IHEgPSBoZWFkOyBxICE9IG51bGw7IHEgPSBxLm5leHQpIHsKIAkJCWlmICgocS5jb21taXQuZmxhZ3MgJiBmKSA9PSAwKQogCQkJCXJldHVybiBmYWxzZTsKQEAgLTE5MCw3ICsxOTAsNyBAQCBib29sZWFuIGV2ZXJib2R5SGFzRmxhZyhmaW5hbCBpbnQgZikgewogCX0KIAogCUBPdmVycmlkZQotCWJvb2xlYW4gYW55Ym9keUhhc0ZsYWcoZmluYWwgaW50IGYpIHsKKwlib29sZWFuIGFueWJvZHlIYXNGbGFnKGludCBmKSB7CiAJCWZvciAoRW50cnkgcSA9IGhlYWQ7IHEgIT0gbnVsbDsgcSA9IHEubmV4dCkgewogCQkJaWYgKChxLmNvbW1pdC5mbGFncyAmIGYpICE9IDApCiAJCQkJcmV0dXJuIHRydWU7CkBAIC0yMTIsNyArMjEyLDcgQEAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkJcmV0dXJuIHMudG9TdHJpbmcoKTsKIAl9CiAKLQlwcml2YXRlIEVudHJ5IG5ld0VudHJ5KGZpbmFsIFJldkNvbW1pdCBjKSB7CisJcHJpdmF0ZSBFbnRyeSBuZXdFbnRyeShSZXZDb21taXQgYykgewogCQlFbnRyeSByID0gZnJlZTsKIAkJaWYgKHIgPT0gbnVsbCkKIAkJCXIgPSBuZXcgRW50cnkoKTsKQEAgLTIyMiw3ICsyMjIsNyBAQCBwcml2YXRlIEVudHJ5IG5ld0VudHJ5KGZpbmFsIFJldkNvbW1pdCBjKSB7CiAJCXJldHVybiByOwogCX0KIAotCXByaXZhdGUgdm9pZCBmcmVlRW50cnkoZmluYWwgRW50cnkgZSkgeworCXByaXZhdGUgdm9pZCBmcmVlRW50cnkoRW50cnkgZSkgewogCQllLm5leHQgPSBmcmVlOwogCQlmcmVlID0gZTsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGVsYXlSZXZRdWV1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RlbGF5UmV2UXVldWUuamF2YQppbmRleCA0YTBkMTlkLi5jMzk3YTAxIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRGVsYXlSZXZRdWV1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EZWxheVJldlF1ZXVlLmphdmEKQEAgLTY5LDcgKzY5LDcgQEAgZmluYWwgY2xhc3MgRGVsYXlSZXZRdWV1ZSBleHRlbmRzIEdlbmVyYXRvciB7CiAKIAlwcml2YXRlIGludCBzaXplOwogCi0JRGVsYXlSZXZRdWV1ZShmaW5hbCBHZW5lcmF0b3IgZykgeworCURlbGF5UmV2UXVldWUoR2VuZXJhdG9yIGcpIHsKIAkJcGVuZGluZyA9IGc7CiAJCWRlbGF5ID0gbmV3IEZJRk9SZXZRdWV1ZSgpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9EZXB0aEdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RlcHRoR2VuZXJhdG9yLmphdmEKaW5kZXggYWQwNTE4Ni4uZWFlYzMwNSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RlcHRoR2VuZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0RlcHRoR2VuZXJhdG9yLmphdmEKQEAgLTExMyw3ICsxMTMsNyBAQCBpbnQgb3V0cHV0VHlwZSgpIHsKIAl9CiAKIAlAT3ZlcnJpZGUKLQl2b2lkIHNoYXJlRnJlZUxpc3QoZmluYWwgQmxvY2tSZXZRdWV1ZSBxKSB7CisJdm9pZCBzaGFyZUZyZWVMaXN0KEJsb2NrUmV2UXVldWUgcSkgewogCQlwZW5kaW5nLnNoYXJlRnJlZUxpc3QocSk7CiAJfQogCkBAIC0xMzQsNyArMTM0LDcgQEAgUmV2Q29tbWl0IG5leHQoKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAogCQkJaW50IG5ld0RlcHRoID0gYy5kZXB0aCArIDE7CiAKLQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpIHsKKwkJCWZvciAoUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpIHsKIAkJCQlEZXB0aFdhbGsuQ29tbWl0IGRwID0gKERlcHRoV2Fsay5Db21taXQpIHA7CiAKIAkJCQkvLyBJZiBubyBkZXB0aCBoYXMgYmVlbiBhc3NpZ25lZCB0byB0aGlzIGNvbW1pdCwgYXNzaWduCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRklGT1JldlF1ZXVlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRklGT1JldlF1ZXVlLmphdmEKaW5kZXggNjNiNzk5MC4uY2RiMDg0YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZJRk9SZXZRdWV1ZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9GSUZPUmV2UXVldWUuamF2YQpAQCAtNjMsMTQgKzYzLDE0IEBAIHB1YmxpYyBGSUZPUmV2UXVldWUoKSB7CiAJCXN1cGVyKCk7CiAJfQogCi0JRklGT1JldlF1ZXVlKGZpbmFsIEdlbmVyYXRvciBzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlGSUZPUmV2UXVldWUoR2VuZXJhdG9yIHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlzdXBlcihzKTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIGFkZChmaW5hbCBSZXZDb21taXQgYykgeworCXB1YmxpYyB2b2lkIGFkZChSZXZDb21taXQgYykgewogCQlCbG9jayBiID0gdGFpbDsKIAkJaWYgKGIgPT0gbnVsbCkgewogCQkJYiA9IGZyZWUubmV3QmxvY2soKTsKQEAgLTkyLDcgKzkyLDcgQEAgcHVibGljIHZvaWQgYWRkKGZpbmFsIFJldkNvbW1pdCBjKSB7CiAJICogQHBhcmFtIGMKIAkgKiAgICAgICAgICAgIHRoZSBjb21taXQgdG8gaW5zZXJ0IGludG8gdGhlIHF1ZXVlLgogCSAqLwotCXB1YmxpYyB2b2lkIHVucG9wKGZpbmFsIFJldkNvbW1pdCBjKSB7CisJcHVibGljIHZvaWQgdW5wb3AoUmV2Q29tbWl0IGMpIHsKIAkJQmxvY2sgYiA9IGhlYWQ7CiAJCWlmIChiID09IG51bGwpIHsKIAkJCWIgPSBmcmVlLm5ld0Jsb2NrKCk7CkBAIC0xMzksNyArMTM5LDcgQEAgcHVibGljIHZvaWQgY2xlYXIoKSB7CiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBldmVyYm9keUhhc0ZsYWcoZmluYWwgaW50IGYpIHsKKwlib29sZWFuIGV2ZXJib2R5SGFzRmxhZyhpbnQgZikgewogCQlmb3IgKEJsb2NrIGIgPSBoZWFkOyBiICE9IG51bGw7IGIgPSBiLm5leHQpIHsKIAkJCWZvciAoaW50IGkgPSBiLmhlYWRJbmRleDsgaSA8IGIudGFpbEluZGV4OyBpKyspCiAJCQkJaWYgKChiLmNvbW1pdHNbaV0uZmxhZ3MgJiBmKSA9PSAwKQpAQCAtMTQ5LDcgKzE0OSw3IEBAIGJvb2xlYW4gZXZlcmJvZHlIYXNGbGFnKGZpbmFsIGludCBmKSB7CiAJfQogCiAJQE92ZXJyaWRlCi0JYm9vbGVhbiBhbnlib2R5SGFzRmxhZyhmaW5hbCBpbnQgZikgeworCWJvb2xlYW4gYW55Ym9keUhhc0ZsYWcoaW50IGYpIHsKIAkJZm9yIChCbG9jayBiID0gaGVhZDsgYiAhPSBudWxsOyBiID0gYi5uZXh0KSB7CiAJCQlmb3IgKGludCBpID0gYi5oZWFkSW5kZXg7IGkgPCBiLnRhaWxJbmRleDsgaSsrKQogCQkJCWlmICgoYi5jb21taXRzW2ldLmZsYWdzICYgZikgIT0gMCkKQEAgLTE1OCw3ICsxNTgsNyBAQCBib29sZWFuIGFueWJvZHlIYXNGbGFnKGZpbmFsIGludCBmKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQl2b2lkIHJlbW92ZUZsYWcoZmluYWwgaW50IGYpIHsKKwl2b2lkIHJlbW92ZUZsYWcoaW50IGYpIHsKIAkJZmluYWwgaW50IG5vdF9mID0gfmY7CiAJCWZvciAoQmxvY2sgYiA9IGhlYWQ7IGIgIT0gbnVsbDsgYiA9IGIubmV4dCkgewogCQkJZm9yIChpbnQgaSA9IGIuaGVhZEluZGV4OyBpIDwgYi50YWlsSW5kZXg7IGkrKykKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9GaXhVbmludGVyZXN0aW5nR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRml4VW5pbnRlcmVzdGluZ0dlbmVyYXRvci5qYXZhCmluZGV4IDlkNzM0YTcuLjRlNmQ3ZTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9GaXhVbmludGVyZXN0aW5nR2VuZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZpeFVuaW50ZXJlc3RpbmdHZW5lcmF0b3IuamF2YQpAQCAtNjEsNyArNjEsNyBAQAogZmluYWwgY2xhc3MgRml4VW5pbnRlcmVzdGluZ0dlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAJcHJpdmF0ZSBmaW5hbCBHZW5lcmF0b3IgcGVuZGluZzsKIAotCUZpeFVuaW50ZXJlc3RpbmdHZW5lcmF0b3IoZmluYWwgR2VuZXJhdG9yIGcpIHsKKwlGaXhVbmludGVyZXN0aW5nR2VuZXJhdG9yKEdlbmVyYXRvciBnKSB7CiAJCXBlbmRpbmcgPSBnOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZvbGxvd0ZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0ZvbGxvd0ZpbHRlci5qYXZhCmluZGV4IDJkYTk3YzguLmRhZTNhYWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb2xsb3dGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9sbG93RmlsdGVyLmphdmEKQEAgLTk1LDcgKzk1LDcgQEAgcHVibGljIHN0YXRpYyBGb2xsb3dGaWx0ZXIgY3JlYXRlKFN0cmluZyBwYXRoLCBEaWZmQ29uZmlnIGNmZykgewogCiAJcHJpdmF0ZSBSZW5hbWVDYWxsYmFjayByZW5hbWVDYWxsYmFjazsKIAotCUZvbGxvd0ZpbHRlcihmaW5hbCBQYXRoRmlsdGVyIHBhdGgsIGZpbmFsIERpZmZDb25maWcgY2ZnKSB7CisJRm9sbG93RmlsdGVyKFBhdGhGaWx0ZXIgcGF0aCwgRGlmZkNvbmZpZyBjZmcpIHsKIAkJdGhpcy5wYXRoID0gcGF0aDsKIAkJdGhpcy5jZmcgPSBjZmc7CiAJfQpAQCAtMTEyLDcgKzExMiw3IEBAIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpCisJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIHBhdGguaW5jbHVkZSh3YWxrZXIpICYmIEFOWV9ESUZGLmluY2x1ZGUod2Fsa2VyKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJLZXkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJLZXkuamF2YQppbmRleCAzNjBiZTI5Li40NWQ1ZjgwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyS2V5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlcktleS5qYXZhCkBAIC03MCw3ICs3MCw3IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBGb290ZXJLZXkgewogCSAqIEBwYXJhbSBrZXlOYW1lCiAJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBmb290ZXIgbGluZS4KIAkgKi8KLQlwdWJsaWMgRm9vdGVyS2V5KGZpbmFsIFN0cmluZyBrZXlOYW1lKSB7CisJcHVibGljIEZvb3RlcktleShTdHJpbmcga2V5TmFtZSkgewogCQluYW1lID0ga2V5TmFtZTsKIAkJcmF3ID0gQ29uc3RhbnRzLmVuY29kZShrZXlOYW1lLnRvTG93ZXJDYXNlKExvY2FsZS5ST09UKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlckxpbmUuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Gb290ZXJMaW5lLmphdmEKaW5kZXggMDc0Y2U4Mi4uZDZmZWQ2NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0Zvb3RlckxpbmUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvRm9vdGVyTGluZS5qYXZhCkBAIC04Niw3ICs4Niw3IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBGb290ZXJMaW5lIHsKIAkgKiAgICAgICAgICAgIGtleSB0byB0ZXN0IHRoaXMgbGluZSdzIGtleSBuYW1lIGFnYWluc3QuCiAJICogQHJldHVybiB0cnVlIGlmIHtAY29kZSBrZXkuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZWNhc2UoZ2V0S2V5KCkpfS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKGZpbmFsIEZvb3RlcktleSBrZXkpIHsKKwlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKEZvb3RlcktleSBrZXkpIHsKIAkJZmluYWwgYnl0ZVtdIGtSYXcgPSBrZXkucmF3OwogCQlmaW5hbCBpbnQgbGVuID0ga1Jhdy5sZW5ndGg7CiAJCWludCBiUHRyID0ga2V5U3RhcnQ7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvR2VuZXJhdG9yLmphdmEKaW5kZXggYTk1MzAzYi4uYjJjOTJlYSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0dlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9HZW5lcmF0b3IuamF2YQpAQCAtODEsNyArODEsNyBAQCBhYnN0cmFjdCBjbGFzcyBHZW5lcmF0b3IgewogCSAqIEBwYXJhbSBxCiAJICogICAgICAgICAgICBhbm90aGVyIEZJRk8gcXVldWUgdGhhdCB3YW50cyB0byBzaGFyZSBvdXIgcXVldWUncyBmcmVlIGxpc3QuCiAJICovCi0Jdm9pZCBzaGFyZUZyZWVMaXN0KGZpbmFsIEJsb2NrUmV2UXVldWUgcSkgeworCXZvaWQgc2hhcmVGcmVlTGlzdChCbG9ja1JldlF1ZXVlIHEpIHsKIAkJLy8gRG8gbm90aGluZyBieSBkZWZhdWx0LgogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0xJRk9SZXZRdWV1ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL0xJRk9SZXZRdWV1ZS5qYXZhCmluZGV4IGY3MzRiNjkuLjg0NmI4ZDkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9MSUZPUmV2UXVldWUuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvTElGT1JldlF1ZXVlLmphdmEKQEAgLTYyLDE0ICs2MiwxNCBAQCBwdWJsaWMgTElGT1JldlF1ZXVlKCkgewogCQlzdXBlcigpOwogCX0KIAotCUxJRk9SZXZRdWV1ZShmaW5hbCBHZW5lcmF0b3IgcykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJTElGT1JldlF1ZXVlKEdlbmVyYXRvciBzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJc3VwZXIocyk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgUmV2Q29tbWl0IGMpIHsKKwlwdWJsaWMgdm9pZCBhZGQoUmV2Q29tbWl0IGMpIHsKIAkJQmxvY2sgYiA9IGhlYWQ7CiAJCWlmIChiID09IG51bGwgfHwgIWIuY2FuVW5wb3AoKSkgewogCQkJYiA9IGZyZWUubmV3QmxvY2soKTsKQEAgLTEwMyw3ICsxMDMsNyBAQCBwdWJsaWMgdm9pZCBjbGVhcigpIHsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlib29sZWFuIGV2ZXJib2R5SGFzRmxhZyhmaW5hbCBpbnQgZikgeworCWJvb2xlYW4gZXZlcmJvZHlIYXNGbGFnKGludCBmKSB7CiAJCWZvciAoQmxvY2sgYiA9IGhlYWQ7IGIgIT0gbnVsbDsgYiA9IGIubmV4dCkgewogCQkJZm9yIChpbnQgaSA9IGIuaGVhZEluZGV4OyBpIDwgYi50YWlsSW5kZXg7IGkrKykKIAkJCQlpZiAoKGIuY29tbWl0c1tpXS5mbGFncyAmIGYpID09IDApCkBAIC0xMTMsNyArMTEzLDcgQEAgYm9vbGVhbiBldmVyYm9keUhhc0ZsYWcoZmluYWwgaW50IGYpIHsKIAl9CiAKIAlAT3ZlcnJpZGUKLQlib29sZWFuIGFueWJvZHlIYXNGbGFnKGZpbmFsIGludCBmKSB7CisJYm9vbGVhbiBhbnlib2R5SGFzRmxhZyhpbnQgZikgewogCQlmb3IgKEJsb2NrIGIgPSBoZWFkOyBiICE9IG51bGw7IGIgPSBiLm5leHQpIHsKIAkJCWZvciAoaW50IGkgPSBiLmhlYWRJbmRleDsgaSA8IGIudGFpbEluZGV4OyBpKyspCiAJCQkJaWYgKChiLmNvbW1pdHNbaV0uZmxhZ3MgJiBmKSAhPSAwKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL01lcmdlQmFzZUdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL01lcmdlQmFzZUdlbmVyYXRvci5qYXZhCmluZGV4IDczY2U5ODUuLjJmZTk1MzEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9NZXJnZUJhc2VHZW5lcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvTWVyZ2VCYXNlR2VuZXJhdG9yLmphdmEKQEAgLTg0LDEyICs4NCwxMiBAQCBjbGFzcyBNZXJnZUJhc2VHZW5lcmF0b3IgZXh0ZW5kcyBHZW5lcmF0b3IgewogCiAJcHJpdmF0ZSBDYXJyeVN0YWNrIHN0YWNrOwogCi0JTWVyZ2VCYXNlR2VuZXJhdG9yKGZpbmFsIFJldldhbGsgdykgeworCU1lcmdlQmFzZUdlbmVyYXRvcihSZXZXYWxrIHcpIHsKIAkJd2Fsa2VyID0gdzsKIAkJcGVuZGluZyA9IG5ldyBEYXRlUmV2UXVldWUoKTsKIAl9CiAKLQl2b2lkIGluaXQoZmluYWwgQWJzdHJhY3RSZXZRdWV1ZSBwKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgaW5pdChBYnN0cmFjdFJldlF1ZXVlIHApIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlmb3IgKDs7KSB7CiAJCQkJZmluYWwgUmV2Q29tbWl0IGMgPSBwLm5leHQoKTsKQEAgLTExOSw3ICsxMTksNyBAQCB2b2lkIGluaXQoZmluYWwgQWJzdHJhY3RSZXZRdWV1ZSBwKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFkZChmaW5hbCBSZXZDb21taXQgYykgeworCXByaXZhdGUgdm9pZCBhZGQoUmV2Q29tbWl0IGMpIHsKIAkJZmluYWwgaW50IGZsYWcgPSB3YWxrZXIuYWxsb2NGbGFnKCk7CiAJCWJyYW5jaE1hc2sgfD0gZmxhZzsKIAkJaWYgKChjLmZsYWdzICYgYnJhbmNoTWFzaykgIT0gMCkgewpAQCAtMTQ2LDcgKzE0Niw3IEBAIHByaXZhdGUgUmV2Q29tbWl0IF9uZXh0KCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQkJcmV0dXJuIG51bGw7CiAJCQl9CiAKLQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpIHsKKwkJCWZvciAoUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpIHsKIAkJCQlpZiAoKHAuZmxhZ3MgJiBJTl9QRU5ESU5HKSAhPSAwKQogCQkJCQljb250aW51ZTsKIAkJCQlpZiAoKHAuZmxhZ3MgJiBQQVJTRUQpID09IDApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvT2JqZWN0V2Fsay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL09iamVjdFdhbGsuamF2YQppbmRleCAyNWMzZTEyLi5lNTkwM2M5IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvT2JqZWN0V2Fsay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9PYmplY3RXYWxrLmphdmEKQEAgLTExOSw3ICsxMTksNyBAQCBwdWJsaWMgY2xhc3MgT2JqZWN0V2FsayBleHRlbmRzIFJldldhbGsgewogCSAqIEBwYXJhbSByZXBvCiAJICogICAgICAgICAgICB0aGUgcmVwb3NpdG9yeSB0aGUgd2Fsa2VyIHdpbGwgb2J0YWluIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgT2JqZWN0V2FsayhmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgT2JqZWN0V2FsayhSZXBvc2l0b3J5IHJlcG8pIHsKIAkJdGhpcyhyZXBvLm5ld09iamVjdFJlYWRlcigpKTsKIAl9CiAKQEAgLTY5OSw3ICs2OTksNyBAQCBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwcm90ZWN0ZWQgdm9pZCByZXNldChmaW5hbCBpbnQgcmV0YWluRmxhZ3MpIHsKKwlwcm90ZWN0ZWQgdm9pZCByZXNldChpbnQgcmV0YWluRmxhZ3MpIHsKIAkJc3VwZXIucmVzZXQocmV0YWluRmxhZ3MpOwogCiAJCWZvciAoUmV2T2JqZWN0IG9iaiA6IHJvb3RPYmplY3RzKQpAQCAtNzExLDcgKzcxMSw3IEBAIHByb3RlY3RlZCB2b2lkIHJlc2V0KGZpbmFsIGludCByZXRhaW5GbGFncykgewogCQlmcmVlVmlzaXQgPSBudWxsOwogCX0KIAotCXByaXZhdGUgdm9pZCBhZGRPYmplY3QoZmluYWwgUmV2T2JqZWN0IG8pIHsKKwlwcml2YXRlIHZvaWQgYWRkT2JqZWN0KFJldk9iamVjdCBvKSB7CiAJCWlmICgoby5mbGFncyAmIElOX1BFTkRJTkcpID09IDApIHsKIAkJCW8uZmxhZ3MgfD0gSU5fUEVORElORzsKIAkJCXJvb3RPYmplY3RzLmFkZChvKTsKQEAgLTcxOSw3ICs3MTksNyBAQCBwcml2YXRlIHZvaWQgYWRkT2JqZWN0KGZpbmFsIFJldk9iamVjdCBvKSB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgbWFya1RyZWVVbmludGVyZXN0aW5nKGZpbmFsIFJldlRyZWUgdHJlZSkKKwlwcml2YXRlIHZvaWQgbWFya1RyZWVVbmludGVyZXN0aW5nKFJldlRyZWUgdHJlZSkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlpZiAoKHRyZWUuZmxhZ3MgJiBVTklOVEVSRVNUSU5HKSAhPSAwKQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1BlbmRpbmdHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9QZW5kaW5nR2VuZXJhdG9yLmphdmEKaW5kZXggOTRhZTJjOS4uZTYwN2I3ZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1BlbmRpbmdHZW5lcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUGVuZGluZ0dlbmVyYXRvci5qYXZhCkBAIC0xNDAsNyArMTQwLDcgQEAgUmV2Q29tbWl0IG5leHQoKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCQkJcHJvZHVjZSA9IGZpbHRlci5pbmNsdWRlKHdhbGtlciwgYyk7CiAJCQkJfQogCi0JCQkJZm9yIChmaW5hbCBSZXZDb21taXQgcCA6IGMucGFyZW50cykgeworCQkJCWZvciAoUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpIHsKIAkJCQkJaWYgKChwLmZsYWdzICYgU0VFTikgIT0gMCkKIAkJCQkJCWNvbnRpbnVlOwogCQkJCQlpZiAoKHAuZmxhZ3MgJiBQQVJTRUQpID09IDApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2QmxvYi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkJsb2IuamF2YQppbmRleCBkMzUyOTI5Li5jYzVlM2U0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2QmxvYi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZCbG9iLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAgcHVibGljIGNsYXNzIFJldkJsb2IgZXh0ZW5kcyBSZXZPYmplY3QgewogCSAqIEBwYXJhbSBpZAogCSAqICAgICAgICAgICAgb2JqZWN0IG5hbWUgZm9yIHRoZSBibG9iLgogCSAqLwotCXByb3RlY3RlZCBSZXZCbG9iKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHJvdGVjdGVkIFJldkJsb2IoQW55T2JqZWN0SWQgaWQpIHsKIAkJc3VwZXIoaWQpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdC5qYXZhCmluZGV4IDlkYjE0NjcuLmI2N2Y5MzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZDb21taXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0LmphdmEKQEAgLTQ0LDcgKzQ0LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwpAQCAtMTQ4LDE4ICsxNDgsMTggQEAgcHVibGljIHN0YXRpYyBSZXZDb21taXQgcGFyc2UoUmV2V2FsayBydywgYnl0ZVtdIHJhdykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAcGFyYW0gaWQKIAkgKiAgICAgICAgICAgIG9iamVjdCBuYW1lIGZvciB0aGUgY29tbWl0LgogCSAqLwotCXByb3RlY3RlZCBSZXZDb21taXQoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwcm90ZWN0ZWQgUmV2Q29tbWl0KEFueU9iamVjdElkIGlkKSB7CiAJCXN1cGVyKGlkKTsKIAl9CiAKIAlAT3ZlcnJpZGUKLQl2b2lkIHBhcnNlSGVhZGVycyhmaW5hbCBSZXZXYWxrIHdhbGspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXZvaWQgcGFyc2VIZWFkZXJzKFJldldhbGsgd2FsaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXBhcnNlQ2Fub25pY2FsKHdhbGssIHdhbGsuZ2V0Q2FjaGVkQnl0ZXModGhpcykpOwogCX0KIAogCUBPdmVycmlkZQotCXZvaWQgcGFyc2VCb2R5KGZpbmFsIFJldldhbGsgd2FsaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJdm9pZCBwYXJzZUJvZHkoUmV2V2FsayB3YWxrKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7CiAJCQlidWZmZXIgPSB3YWxrLmdldENhY2hlZEJ5dGVzKHRoaXMpOwpAQCAtMTY4LDcgKzE2OCw3IEBAIHZvaWQgcGFyc2VCb2R5KGZpbmFsIFJldldhbGsgd2FsaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCX0KIAl9CiAKLQl2b2lkIHBhcnNlQ2Fub25pY2FsKGZpbmFsIFJldldhbGsgd2FsaywgZmluYWwgYnl0ZVtdIHJhdykKKwl2b2lkIHBhcnNlQ2Fub25pY2FsKFJldldhbGsgd2FsaywgYnl0ZVtdIHJhdykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICghd2Fsay5zaGFsbG93Q29tbWl0c0luaXRpYWxpemVkKQogCQkJd2Fsay5pbml0aWFsaXplU2hhbGxvd0NvbW1pdHMoKTsKQEAgLTMxMCw3ICszMTAsNyBAQCBwcml2YXRlIHN0YXRpYyB2b2lkIGNhcnJ5T25lU3RlcChGSUZPUmV2UXVldWUgcSwgaW50IGNhcnJ5LCBSZXZDb21taXQgYykgewogCSAqIEBwYXJhbSBmbGFnCiAJICogICAgICAgICAgICB0aGUgc2luZ2xlIGZsYWcgdmFsdWUgdG8gY2FycnkgYmFjayBvbnRvIHBhcmVudHMuCiAJICovCi0JcHVibGljIHZvaWQgY2FycnkoZmluYWwgUmV2RmxhZyBmbGFnKSB7CisJcHVibGljIHZvaWQgY2FycnkoUmV2RmxhZyBmbGFnKSB7CiAJCWZpbmFsIGludCBjYXJyeSA9IGZsYWdzICYgZmxhZy5tYXNrOwogCQlpZiAoY2FycnkgIT0gMCkKIAkJCWNhcnJ5RmxhZ3ModGhpcywgY2FycnkpOwpAQCAtMzUzLDcgKzM1Myw3IEBAIHB1YmxpYyBmaW5hbCBpbnQgZ2V0UGFyZW50Q291bnQoKSB7CiAJICogQHRocm93cyBqYXZhLmxhbmcuQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYW4gaW52YWxpZCBwYXJlbnQgaW5kZXggd2FzIHNwZWNpZmllZC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgUmV2Q29tbWl0IGdldFBhcmVudChmaW5hbCBpbnQgbnRoKSB7CisJcHVibGljIGZpbmFsIFJldkNvbW1pdCBnZXRQYXJlbnQoaW50IG50aCkgewogCQlyZXR1cm4gcGFyZW50c1tudGhdOwogCX0KIApAQCAtNDkwLDcgKzQ5MCw3IEBAIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U2hvcnRNZXNzYWdlKCkgewogCQlyZXR1cm4gc3RyOwogCX0KIAotCXN0YXRpYyBib29sZWFuIGhhc0xGKGZpbmFsIGJ5dGVbXSByLCBpbnQgYiwgZmluYWwgaW50IGUpIHsKKwlzdGF0aWMgYm9vbGVhbiBoYXNMRihieXRlW10gciwgaW50IGIsIGludCBlKSB7CiAJCXdoaWxlIChiIDwgZSkKIAkJCWlmIChyW2IrK10gPT0gJ1xuJykKIAkJCQlyZXR1cm4gdHJ1ZTsKQEAgLTUzOSw3ICs1MzksNyBAQCBwcml2YXRlIENoYXJzZXQgZ3Vlc3NFbmNvZGluZygpIHsKIAkJdHJ5IHsKIAkJCXJldHVybiBnZXRFbmNvZGluZygpOwogCQl9IGNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gfCBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIFVURl84OworCQkJcmV0dXJuIENIQVJTRVQ7CiAJCX0KIAl9CiAKQEAgLTYxNSw3ICs2MTUsNyBAQCBwdWJsaWMgZmluYWwgTGlzdDxGb290ZXJMaW5lPiBnZXRGb290ZXJMaW5lcygpIHsKIAkgKiAgICAgICAgIHdpdGggdGhlIHNwZWNpZmllZCBrZXksIG9yIHRoZXJlIGFyZSBubyBmb290ZXJzIGF0IGFsbC4KIAkgKiBAc2VlICNnZXRGb290ZXJMaW5lcygpCiAJICovCi0JcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRGb290ZXJMaW5lcyhmaW5hbCBTdHJpbmcga2V5TmFtZSkgeworCXB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0Rm9vdGVyTGluZXMoU3RyaW5nIGtleU5hbWUpIHsKIAkJcmV0dXJuIGdldEZvb3RlckxpbmVzKG5ldyBGb290ZXJLZXkoa2V5TmFtZSkpOwogCX0KIApAQCAtNjMwLDEyICs2MzAsMTIgQEAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRGb290ZXJMaW5lcyhmaW5hbCBTdHJpbmcga2V5TmFtZSkgewogCSAqICAgICAgICAgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgb3IgdGhlcmUgYXJlIG5vIGZvb3RlcnMgYXQgYWxsLgogCSAqIEBzZWUgI2dldEZvb3RlckxpbmVzKCkKIAkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdDxTdHJpbmc+IGdldEZvb3RlckxpbmVzKGZpbmFsIEZvb3RlcktleSBrZXlOYW1lKSB7CisJcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRGb290ZXJMaW5lcyhGb290ZXJLZXkga2V5TmFtZSkgewogCQlmaW5hbCBMaXN0PEZvb3RlckxpbmU+IHNyYyA9IGdldEZvb3RlckxpbmVzKCk7CiAJCWlmIChzcmMuaXNFbXB0eSgpKQogCQkJcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwogCQlmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiByID0gbmV3IEFycmF5TGlzdDw+KHNyYy5zaXplKCkpOwotCQlmb3IgKGZpbmFsIEZvb3RlckxpbmUgZiA6IHNyYykgeworCQlmb3IgKEZvb3RlckxpbmUgZiA6IHNyYykgewogCQkJaWYgKGYubWF0Y2hlcyhrZXlOYW1lKSkKIAkJCQlyLmFkZChmLmdldFZhbHVlKCkpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0TGlzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkNvbW1pdExpc3QuamF2YQppbmRleCAzOGNmM2Y1Li5kMmZkYTJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2Q29tbWl0TGlzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZDb21taXRMaXN0LmphdmEKQEAgLTkxLDcgKzkxLDcgQEAgcHVibGljIHZvaWQgY2xlYXIoKSB7CiAJICogICAgICAgICAgICAgb2JqZWN0IHRoYXQgc2hvdWxkIGJlIHByZXNlbnQgd2FzIG5vdCBmb3VuZC4gUmVwb3NpdG9yeQogCSAqICAgICAgICAgICAgIGNvcnJ1cHRpb24gbWF5IGhhdmUgb2NjdXJyZWQuCiAJICovCi0JcHVibGljIHZvaWQgYXBwbHlGbGFnKGZpbmFsIFJldkZpbHRlciBtYXRjaGluZywgZmluYWwgUmV2RmxhZyBmbGFnKQorCXB1YmxpYyB2b2lkIGFwcGx5RmxhZyhSZXZGaWx0ZXIgbWF0Y2hpbmcsIFJldkZsYWcgZmxhZykKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlhcHBseUZsYWcobWF0Y2hpbmcsIGZsYWcsIDAsIHNpemUoKSk7CkBAIC0xNjUsNyArMTY1LDcgQEAgcHVibGljIHZvaWQgYXBwbHlGbGFnKGZpbmFsIFJldkZpbHRlciBtYXRjaGluZywgZmluYWwgUmV2RmxhZyBmbGFnLAogCSAqICAgICAgICAgICAgdGhlIGZsYWcgdG8gcmVtb3ZlLiBBcHBsaWNhdGlvbnMgYXJlIHJlc3BvbnNpYmxlIGZvcgogCSAqICAgICAgICAgICAgYWxsb2NhdGluZyB0aGlzIGZsYWcgZnJvbSB0aGUgc291cmNlIFJldldhbGsuCiAJICovCi0JcHVibGljIHZvaWQgY2xlYXJGbGFnKGZpbmFsIFJldkZsYWcgZmxhZykgeworCXB1YmxpYyB2b2lkIGNsZWFyRmxhZyhSZXZGbGFnIGZsYWcpIHsKIAkJY2xlYXJGbGFnKGZsYWcsIDAsIHNpemUoKSk7CiAJfQogCkBAIC0yMDcsNyArMjA3LDcgQEAgcHVibGljIHZvaWQgY2xlYXJGbGFnKGZpbmFsIFJldkZsYWcgZmxhZywgZmluYWwgaW50IHJhbmdlQmVnaW4sCiAJICogQHJldHVybiBpbmRleCBvZiB0aGUgZmlyc3QgY29tbWl0IGF0IG9yIGFmdGVyIGluZGV4IDxjb2RlPmJlZ2luPC9jb2RlPgogCSAqICAgICAgICAgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCBmbGFnIHNldCBvbiBpdDsgLTEgaWYgbm8gbWF0Y2ggaXMgZm91bmQuCiAJICovCi0JcHVibGljIGludCBpbmRleE9mKGZpbmFsIFJldkZsYWcgZmxhZywgaW50IGJlZ2luKSB7CisJcHVibGljIGludCBpbmRleE9mKFJldkZsYWcgZmxhZywgaW50IGJlZ2luKSB7CiAJCXdoaWxlIChiZWdpbiA8IHNpemUoKSkgewogCQkJaW50IGluZGV4ID0gYmVnaW47CiAJCQlCbG9jayBzID0gY29udGVudHM7CkBAIC0yMzgsNyArMjM4LDcgQEAgcHVibGljIGludCBpbmRleE9mKGZpbmFsIFJldkZsYWcgZmxhZywgaW50IGJlZ2luKSB7CiAJICogQHJldHVybiBpbmRleCBvZiB0aGUgZmlyc3QgY29tbWl0IGF0IG9yIGJlZm9yZSBpbmRleCA8Y29kZT5iZWdpbjwvY29kZT4KIAkgKiAgICAgICAgIHRoYXQgaGFzIHRoZSBzcGVjaWZpZWQgZmxhZyBzZXQgb24gaXQ7IC0xIGlmIG5vIG1hdGNoIGlzIGZvdW5kLgogCSAqLwotCXB1YmxpYyBpbnQgbGFzdEluZGV4T2YoZmluYWwgUmV2RmxhZyBmbGFnLCBpbnQgYmVnaW4pIHsKKwlwdWJsaWMgaW50IGxhc3RJbmRleE9mKFJldkZsYWcgZmxhZywgaW50IGJlZ2luKSB7CiAJCWJlZ2luID0gTWF0aC5taW4oYmVnaW4sIHNpemUoKSAtIDEpOwogCQl3aGlsZSAoYmVnaW4gPj0gMCkgewogCQkJaW50IGluZGV4ID0gYmVnaW47CkBAIC0yNjUsNyArMjY1LDcgQEAgcHVibGljIGludCBsYXN0SW5kZXhPZihmaW5hbCBSZXZGbGFnIGZsYWcsIGludCBiZWdpbikgewogCSAqICAgICAgICAgICAgdGhlIHdhbGtlciB0byBwb3B1bGF0ZSBmcm9tLgogCSAqIEBzZWUgI2ZpbGxUbyhpbnQpCiAJICovCi0JcHVibGljIHZvaWQgc291cmNlKGZpbmFsIFJldldhbGsgdykgeworCXB1YmxpYyB2b2lkIHNvdXJjZShSZXZXYWxrIHcpIHsKIAkJd2Fsa2VyID0gdzsKIAl9CiAKQEAgLTI5OSw3ICsyOTksNyBAQCBwdWJsaWMgYm9vbGVhbiBpc1BlbmRpbmcoKSB7CiAJICogICAgICAgICAgICAgc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsayNuZXh0KCl9CiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgZmlsbFRvKGZpbmFsIGludCBoaWdoTWFyaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJcHVibGljIHZvaWQgZmlsbFRvKGludCBoaWdoTWFyaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmICh3YWxrZXIgPT0gbnVsbCB8fCBzaXplID4gaGlnaE1hcmspCiAJCQlyZXR1cm47CkBAIC0zNjQsNyArMzY0LDcgQEAgcHVibGljIHZvaWQgZmlsbFRvKGZpbmFsIGludCBoaWdoTWFyaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJICogICAgICAgICAgICAgc2VlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGsuUmV2V2FsayNuZXh0KCl9CiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIHZvaWQgZmlsbFRvKGZpbmFsIFJldkNvbW1pdCBjb21taXRUb0xvYWQsIGludCBoaWdoTWFyaykKKwlwdWJsaWMgdm9pZCBmaWxsVG8oUmV2Q29tbWl0IGNvbW1pdFRvTG9hZCwgaW50IGhpZ2hNYXJrKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCWlmICh3YWxrZXIgPT0gbnVsbCB8fCBjb21taXRUb0xvYWQgPT0gbnVsbApAQCAtNDE5LDcgKzQxOSw3IEBAIHB1YmxpYyB2b2lkIGZpbGxUbyhmaW5hbCBSZXZDb21taXQgY29tbWl0VG9Mb2FkLCBpbnQgaGlnaE1hcmspCiAJICogQHBhcmFtIGUKIAkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgYmVpbmcgYWRkZWQgKG9yIHNldCkgaW50byB0aGUgbGlzdC4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbnRlcihmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIEUgZSkgeworCXByb3RlY3RlZCB2b2lkIGVudGVyKGludCBpbmRleCwgRSBlKSB7CiAJCS8vIERvIG5vdGhpbmcgYnkgZGVmYXVsdC4KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2RmxhZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkZsYWcuamF2YQppbmRleCAxZTc5ODY3Li40MTNhNTUyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2RmxhZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZGbGFnLmphdmEKQEAgLTg1LDcgKzg1LDcgQEAgcHVibGljIGNsYXNzIFJldkZsYWcgewogCiAJZmluYWwgaW50IG1hc2s7CiAKLQlSZXZGbGFnKGZpbmFsIFJldldhbGsgdywgZmluYWwgU3RyaW5nIG4sIGZpbmFsIGludCBtKSB7CisJUmV2RmxhZyhSZXZXYWxrIHcsIFN0cmluZyBuLCBpbnQgbSkgewogCQl3YWxrZXIgPSB3OwogCQluYW1lID0gbjsKIAkJbWFzayA9IG07CkBAIC0xMDcsNyArMTA3LDcgQEAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAl9CiAKIAlzdGF0aWMgY2xhc3MgU3RhdGljUmV2RmxhZyBleHRlbmRzIFJldkZsYWcgewotCQlTdGF0aWNSZXZGbGFnKGZpbmFsIFN0cmluZyBuLCBmaW5hbCBpbnQgbSkgeworCQlTdGF0aWNSZXZGbGFnKFN0cmluZyBuLCBpbnQgbSkgewogCQkJc3VwZXIobnVsbCwgbiwgbSk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkZsYWdTZXQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZGbGFnU2V0LmphdmEKaW5kZXggOTc0MGQxNC4uNDVhNzMwYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldkZsYWdTZXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2RmxhZ1NldC5qYXZhCkBAIC03Myw3ICs3Myw3IEBAIHB1YmxpYyBSZXZGbGFnU2V0KCkgewogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICB0aGUgc2V0IHRvIGNvcHkgZmxhZ3MgZnJvbS4KIAkgKi8KLQlwdWJsaWMgUmV2RmxhZ1NldChmaW5hbCBSZXZGbGFnU2V0IHMpIHsKKwlwdWJsaWMgUmV2RmxhZ1NldChSZXZGbGFnU2V0IHMpIHsKIAkJbWFzayA9IHMubWFzazsKIAkJYWN0aXZlID0gbmV3IEFycmF5TGlzdDw+KHMuYWN0aXZlKTsKIAl9CkBAIC04NCwxNCArODQsMTQgQEAgcHVibGljIFJldkZsYWdTZXQoZmluYWwgUmV2RmxhZ1NldCBzKSB7CiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIHRvIGNvcHkgZmxhZ3MgZnJvbS4KIAkgKi8KLQlwdWJsaWMgUmV2RmxhZ1NldChmaW5hbCBDb2xsZWN0aW9uPFJldkZsYWc+IHMpIHsKKwlwdWJsaWMgUmV2RmxhZ1NldChDb2xsZWN0aW9uPFJldkZsYWc+IHMpIHsKIAkJdGhpcygpOwogCQlhZGRBbGwocyk7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhmaW5hbCBPYmplY3QgbykgeworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CiAJCWlmIChvIGluc3RhbmNlb2YgUmV2RmxhZykKIAkJCXJldHVybiAobWFzayAmICgoUmV2RmxhZykgbykubWFzaykgIT0gMDsKIAkJcmV0dXJuIGZhbHNlOwpAQCAtOTksNyArOTksNyBAQCBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhmaW5hbCBPYmplY3QgbykgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChmaW5hbCBDb2xsZWN0aW9uPD8+IGMpIHsKKwlwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKIAkJaWYgKGMgaW5zdGFuY2VvZiBSZXZGbGFnU2V0KSB7CiAJCQlmaW5hbCBpbnQgY01hc2sgPSAoKFJldkZsYWdTZXQpIGMpLm1hc2s7CiAJCQlyZXR1cm4gKG1hc2sgJiBjTWFzaykgPT0gY01hc2s7CkBAIC0xMDksNyArMTA5LDcgQEAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoZmluYWwgQ29sbGVjdGlvbjw/PiBjKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGFkZChmaW5hbCBSZXZGbGFnIGZsYWcpIHsKKwlwdWJsaWMgYm9vbGVhbiBhZGQoUmV2RmxhZyBmbGFnKSB7CiAJCWlmICgobWFzayAmIGZsYWcubWFzaykgIT0gMCkKIAkJCXJldHVybiBmYWxzZTsKIAkJbWFzayB8PSBmbGFnLm1hc2s7CkBAIC0xMjIsNyArMTIyLDcgQEAgcHVibGljIGJvb2xlYW4gYWRkKGZpbmFsIFJldkZsYWcgZmxhZykgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiByZW1vdmUoZmluYWwgT2JqZWN0IG8pIHsKKwlwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKIAkJZmluYWwgUmV2RmxhZyBmbGFnID0gKFJldkZsYWcpIG87CiAJCWlmICgobWFzayAmIGZsYWcubWFzaykgPT0gMCkKIAkJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3QuamF2YQppbmRleCA0YTg4MTA1Li5lZWY5YmYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdC5qYXZhCkBAIC02MCw3ICs2MCw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXZPYmplY3QgZXh0ZW5kcyBPYmplY3RJZE93bmVyTWFwLkVudHJ5IHsKIAogCWludCBmbGFnczsKIAotCVJldk9iamVjdChmaW5hbCBBbnlPYmplY3RJZCBuYW1lKSB7CisJUmV2T2JqZWN0KEFueU9iamVjdElkIG5hbWUpIHsKIAkJc3VwZXIobmFtZSk7CiAJfQogCkBAIC05Myw3ICs5Myw3IEBAIHB1YmxpYyBmaW5hbCBPYmplY3RJZCBnZXRJZCgpIHsKIAkgKiAgICAgICAgICAgIHRoZSBmbGFnIHRvIHRlc3QuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBmbGFnIGhhcyBiZWVuIGFkZGVkIHRvIHRoaXMgb2JqZWN0OyBmYWxzZSBpZiBub3QuCiAJICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzKGZpbmFsIFJldkZsYWcgZmxhZykgeworCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhcyhSZXZGbGFnIGZsYWcpIHsKIAkJcmV0dXJuIChmbGFncyAmIGZsYWcubWFzaykgIT0gMDsKIAl9CiAKQEAgLTEwNSw3ICsxMDUsNyBAQCBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXMoZmluYWwgUmV2RmxhZyBmbGFnKSB7CiAJICogQHJldHVybiB0cnVlIGlmIGFueSBmbGFnIGluIHRoZSBzZXQgaGFzIGJlZW4gYWRkZWQgdG8gdGhpcyBvYmplY3Q7IGZhbHNlCiAJICogICAgICAgICBpZiBub3QuCiAJICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQW55KGZpbmFsIFJldkZsYWdTZXQgc2V0KSB7CisJcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzQW55KFJldkZsYWdTZXQgc2V0KSB7CiAJCXJldHVybiAoZmxhZ3MgJiBzZXQubWFzaykgIT0gMDsKIAl9CiAKQEAgLTExNyw3ICsxMTcsNyBAQCBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBbnkoZmluYWwgUmV2RmxhZ1NldCBzZXQpIHsKIAkgKiBAcmV0dXJuIHRydWUgaWYgYWxsIGZsYWdzIG9mIHRoZSBzZXQgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoaXMgb2JqZWN0OwogCSAqICAgICAgICAgZmFsc2UgaWYgc29tZSBvciBub25lIGhhdmUgYmVlbiBhZGRlZC4KIAkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBbGwoZmluYWwgUmV2RmxhZ1NldCBzZXQpIHsKKwlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBbGwoUmV2RmxhZ1NldCBzZXQpIHsKIAkJcmV0dXJuIChmbGFncyAmIHNldC5tYXNrKSA9PSBzZXQubWFzazsKIAl9CiAKQEAgLTEyOSw3ICsxMjksNyBAQCBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNBbGwoZmluYWwgUmV2RmxhZ1NldCBzZXQpIHsKIAkgKiBAcGFyYW0gZmxhZwogCSAqICAgICAgICAgICAgdGhlIGZsYWcgdG8gbWFyayBvbiB0aGlzIG9iamVjdCwgZm9yIGxhdGVyIHRlc3RpbmcuCiAJICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkKGZpbmFsIFJldkZsYWcgZmxhZykgeworCXB1YmxpYyBmaW5hbCB2b2lkIGFkZChSZXZGbGFnIGZsYWcpIHsKIAkJZmxhZ3MgfD0gZmxhZy5tYXNrOwogCX0KIApAQCAtMTM5LDcgKzEzOSw3IEBAIHB1YmxpYyBmaW5hbCB2b2lkIGFkZChmaW5hbCBSZXZGbGFnIGZsYWcpIHsKIAkgKiBAcGFyYW0gc2V0CiAJICogICAgICAgICAgICB0aGUgc2V0IG9mIGZsYWdzIHRvIG1hcmsgb24gdGhpcyBvYmplY3QsIGZvciBsYXRlciB0ZXN0aW5nLgogCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZChmaW5hbCBSZXZGbGFnU2V0IHNldCkgeworCXB1YmxpYyBmaW5hbCB2b2lkIGFkZChSZXZGbGFnU2V0IHNldCkgewogCQlmbGFncyB8PSBzZXQubWFzazsKIAl9CiAKQEAgLTE1MSw3ICsxNTEsNyBAQCBwdWJsaWMgZmluYWwgdm9pZCBhZGQoZmluYWwgUmV2RmxhZ1NldCBzZXQpIHsKIAkgKiBAcGFyYW0gZmxhZwogCSAqICAgICAgICAgICAgdGhlIGZsYWcgdG8gcmVtb3ZlIGZyb20gdGhpcyBvYmplY3QuCiAJICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlKGZpbmFsIFJldkZsYWcgZmxhZykgeworCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZShSZXZGbGFnIGZsYWcpIHsKIAkJZmxhZ3MgJj0gfmZsYWcubWFzazsKIAl9CiAKQEAgLTE2MSw3ICsxNjEsNyBAQCBwdWJsaWMgZmluYWwgdm9pZCByZW1vdmUoZmluYWwgUmV2RmxhZyBmbGFnKSB7CiAJICogQHBhcmFtIHNldAogCSAqICAgICAgICAgICAgdGhlIGZsYWcgdG8gcmVtb3ZlIGZyb20gdGhpcyBvYmplY3QuCiAJICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlKGZpbmFsIFJldkZsYWdTZXQgc2V0KSB7CisJcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlKFJldkZsYWdTZXQgc2V0KSB7CiAJCWZsYWdzICY9IH5zZXQubWFzazsKIAl9CiAKQEAgLTE4Myw3ICsxODMsNyBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCSAqIEBwYXJhbSBzCiAJICogICAgICAgICAgICBidWZmZXIgdG8gYXBwZW5kIGEgZGVidWcgZGVzY3JpcHRpb24gb2YgY29yZSBSZXZGbGFncyBvbnRvLgogCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZENvcmVGbGFncyhmaW5hbCBTdHJpbmdCdWlsZGVyIHMpIHsKKwlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRDb3JlRmxhZ3MoU3RyaW5nQnVpbGRlciBzKSB7CiAJCXMuYXBwZW5kKChmbGFncyAmIFJldldhbGsuVE9QT19ERUxBWSkgIT0gMCA/ICdvJyA6ICctJyk7CiAJCXMuYXBwZW5kKChmbGFncyAmIFJldldhbGsuVEVNUF9NQVJLKSAhPSAwID8gJ3QnIDogJy0nKTsKIAkJcy5hcHBlbmQoKGZsYWdzICYgUmV2V2Fsay5SRVdSSVRFKSAhPSAwID8gJ3InIDogJy0nKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3RMaXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2T2JqZWN0TGlzdC5qYXZhCmluZGV4IDJiYjQ0MjcuLjJmMjFlMTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZPYmplY3RMaXN0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jldk9iamVjdExpc3QuamF2YQpAQCAtODIsNyArODIsNyBAQCBwdWJsaWMgUmV2T2JqZWN0TGlzdCgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYWRkKGZpbmFsIGludCBpbmRleCwgZmluYWwgRSBlbGVtZW50KSB7CisJcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgRSBlbGVtZW50KSB7CiAJCWlmIChpbmRleCAhPSBzaXplKQogCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS51bnN1cHBvcnRlZE9wZXJhdGlvbk5vdEFkZEF0RW5kLApAQCAtMTQ3LDcgKzE0Nyw3IEBAIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQmxvY2sgewogCiAJCWZpbmFsIGludCBzaGlmdDsKIAotCQlCbG9jayhmaW5hbCBpbnQgcykgeworCQlCbG9jayhpbnQgcykgewogCQkJc2hpZnQgPSBzOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRhZy5qYXZhCmluZGV4IGQ3NDgzN2UuLjAwNTBiYWMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUYWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VGFnLmphdmEKQEAgLTQ1LDcgKzQ1LDcgQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnJldndhbGs7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwpAQCAtMTM3LDE4ICsxMzcsMTggQEAgcHVibGljIHN0YXRpYyBSZXZUYWcgcGFyc2UoUmV2V2FsayBydywgYnl0ZVtdIHJhdykKIAkgKiBAcGFyYW0gaWQKIAkgKiAgICAgICAgICAgIG9iamVjdCBuYW1lIGZvciB0aGUgdGFnLgogCSAqLwotCXByb3RlY3RlZCBSZXZUYWcoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwcm90ZWN0ZWQgUmV2VGFnKEFueU9iamVjdElkIGlkKSB7CiAJCXN1cGVyKGlkKTsKIAl9CiAKIAlAT3ZlcnJpZGUKLQl2b2lkIHBhcnNlSGVhZGVycyhmaW5hbCBSZXZXYWxrIHdhbGspIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXZvaWQgcGFyc2VIZWFkZXJzKFJldldhbGsgd2FsaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXBhcnNlQ2Fub25pY2FsKHdhbGssIHdhbGsuZ2V0Q2FjaGVkQnl0ZXModGhpcykpOwogCX0KIAogCUBPdmVycmlkZQotCXZvaWQgcGFyc2VCb2R5KGZpbmFsIFJldldhbGsgd2FsaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCisJdm9pZCBwYXJzZUJvZHkoUmV2V2FsayB3YWxrKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7CiAJCQlidWZmZXIgPSB3YWxrLmdldENhY2hlZEJ5dGVzKHRoaXMpOwpAQCAtMTU3LDcgKzE1Nyw3IEBAIHZvaWQgcGFyc2VCb2R5KGZpbmFsIFJldldhbGsgd2FsaykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCX0KIAl9CiAKLQl2b2lkIHBhcnNlQ2Fub25pY2FsKGZpbmFsIFJldldhbGsgd2FsaywgZmluYWwgYnl0ZVtdIHJhd1RhZykKKwl2b2lkIHBhcnNlQ2Fub25pY2FsKFJldldhbGsgd2FsaywgYnl0ZVtdIHJhd1RhZykKIAkJCXRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJZmluYWwgTXV0YWJsZUludGVnZXIgcG9zID0gbmV3IE11dGFibGVJbnRlZ2VyKCk7CiAJCWZpbmFsIGludCBvVHlwZTsKQEAgLTE2OSw3ICsxNjksNyBAQCB2b2lkIHBhcnNlQ2Fub25pY2FsKGZpbmFsIFJldldhbGsgd2FsaywgZmluYWwgYnl0ZVtdIHJhd1RhZykKIAogCQlpbnQgcCA9IHBvcy52YWx1ZSArPSA0OyAvLyAidGFnICIKIAkJZmluYWwgaW50IG5hbWVFbmQgPSBSYXdQYXJzZVV0aWxzLm5leHRMRihyYXdUYWcsIHApIC0gMTsKLQkJdGFnTmFtZSA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKFVURl84LCByYXdUYWcsIHAsIG5hbWVFbmQpOworCQl0YWdOYW1lID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoQ0hBUlNFVCwgcmF3VGFnLCBwLCBuYW1lRW5kKTsKIAogCQlpZiAod2Fsay5pc1JldGFpbkJvZHkoKSkKIAkJCWJ1ZmZlciA9IHJhd1RhZzsKQEAgLTI1Nyw3ICsyNTcsNyBAQCBwcml2YXRlIENoYXJzZXQgZ3Vlc3NFbmNvZGluZygpIHsKIAkJdHJ5IHsKIAkJCXJldHVybiBSYXdQYXJzZVV0aWxzLnBhcnNlRW5jb2RpbmcoYnVmZmVyKTsKIAkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIHwgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBVVEZfODsKKwkJCXJldHVybiBDSEFSU0VUOwogCQl9CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VHJlZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldlRyZWUuamF2YQppbmRleCA5MmI4MWExLi5lN2RlMjcwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2VHJlZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZUcmVlLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAgcHVibGljIGNsYXNzIFJldlRyZWUgZXh0ZW5kcyBSZXZPYmplY3QgewogCSAqIEBwYXJhbSBpZAogCSAqICAgICAgICAgICAgb2JqZWN0IG5hbWUgZm9yIHRoZSB0cmVlLgogCSAqLwotCXByb3RlY3RlZCBSZXZUcmVlKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHJvdGVjdGVkIFJldlRyZWUoQW55T2JqZWN0SWQgaWQpIHsKIAkJc3VwZXIoaWQpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXZXYWxrLmphdmEKaW5kZXggOTFjMTVhMS4uYTk4NmNmZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1JldldhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV2V2Fsay5qYXZhCkBAIC0yMDksNyArMjA5LDcgQEAgcHVibGljIGNsYXNzIFJldldhbGsgaW1wbGVtZW50cyBJdGVyYWJsZTxSZXZDb21taXQ+LCBBdXRvQ2xvc2VhYmxlIHsKIAkgKiAgICAgICAgICAgIE9iamVjdFJlYWRlciB3aWxsIGJlIGNyZWF0ZWQgYnkgdGhlIHdhbGtlciwgYW5kIHdpbGwgYmUgY2xvc2VkCiAJICogICAgICAgICAgICB3aGVuIHRoZSB3YWxrZXIgaXMgY2xvc2VkLgogCSAqLwotCXB1YmxpYyBSZXZXYWxrKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBSZXZXYWxrKFJlcG9zaXRvcnkgcmVwbykgewogCQl0aGlzKHJlcG8ubmV3T2JqZWN0UmVhZGVyKCksIHRydWUpOwogCX0KIApAQCAtMjk0LDcgKzI5NCw3IEBAIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrU3RhcnQoZmluYWwgUmV2Q29tbWl0IGMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXB1YmxpYyB2b2lkIG1hcmtTdGFydChSZXZDb21taXQgYykgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmICgoYy5mbGFncyAmIFNFRU4pICE9IDApCiAJCQlyZXR1cm47CkBAIC0zMjQsMTAgKzMyNCwxMCBAQCBwdWJsaWMgdm9pZCBtYXJrU3RhcnQoZmluYWwgUmV2Q29tbWl0IGMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBtYXJrU3RhcnQoZmluYWwgQ29sbGVjdGlvbjxSZXZDb21taXQ+IGxpc3QpCisJcHVibGljIHZvaWQgbWFya1N0YXJ0KENvbGxlY3Rpb248UmV2Q29tbWl0PiBsaXN0KQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoZmluYWwgUmV2Q29tbWl0IGMgOiBsaXN0KQorCQlmb3IgKFJldkNvbW1pdCBjIDogbGlzdCkKIAkJCW1hcmtTdGFydChjKTsKIAl9CiAKQEAgLTM2NCw3ICszNjQsNyBAQCBwdWJsaWMgdm9pZCBtYXJrU3RhcnQoZmluYWwgQ29sbGVjdGlvbjxSZXZDb21taXQ+IGxpc3QpCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBwYWNrIGZpbGUgb3IgbG9vc2Ugb2JqZWN0IGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyB2b2lkIG1hcmtVbmludGVyZXN0aW5nKGZpbmFsIFJldkNvbW1pdCBjKQorCXB1YmxpYyB2b2lkIG1hcmtVbmludGVyZXN0aW5nKFJldkNvbW1pdCBjKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCWMuZmxhZ3MgfD0gVU5JTlRFUkVTVElORzsKQEAgLTQwMiw3ICs0MDIsNyBAQCBwdWJsaWMgdm9pZCBtYXJrVW5pbnRlcmVzdGluZyhmaW5hbCBSZXZDb21taXQgYykKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIHBhY2sgZmlsZSBvciBsb29zZSBvYmplY3QgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIGJvb2xlYW4gaXNNZXJnZWRJbnRvKGZpbmFsIFJldkNvbW1pdCBiYXNlLCBmaW5hbCBSZXZDb21taXQgdGlwKQorCXB1YmxpYyBib29sZWFuIGlzTWVyZ2VkSW50byhSZXZDb21taXQgYmFzZSwgUmV2Q29tbWl0IHRpcCkKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlmaW5hbCBSZXZGaWx0ZXIgb2xkUkYgPSBmaWx0ZXI7CkBAIC00NzUsNyArNDc1LDcgQEAgcHVibGljIGJvb2xlYW4gaGFzUmV2U29ydChSZXZTb3J0IHNvcnQpIHsKIAkgKiBAcGFyYW0gcwogCSAqICAgICAgICAgICAgYSBzb3J0aW5nIHN0cmF0ZWd5IHRvIGVuYWJsZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzb3J0KGZpbmFsIFJldlNvcnQgcykgeworCXB1YmxpYyB2b2lkIHNvcnQoUmV2U29ydCBzKSB7CiAJCWFzc2VydE5vdFN0YXJ0ZWQoKTsKIAkJc29ydGluZy5jbGVhcigpOwogCQlzb3J0aW5nLmFkZChzKTsKQEAgLTQ5Niw3ICs0OTYsNyBAQCBwdWJsaWMgdm9pZCBzb3J0KGZpbmFsIFJldlNvcnQgcykgewogCSAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGlzIHN0cmF0ZWd5IHNob3VsZCBiZSB1c2VkLCBmYWxzZSBpZiBpdCBzaG91bGQgYmUKIAkgKiAgICAgICAgICAgIHJlbW92ZWQuCiAJICovCi0JcHVibGljIHZvaWQgc29ydChmaW5hbCBSZXZTb3J0IHMsIGZpbmFsIGJvb2xlYW4gdXNlKSB7CisJcHVibGljIHZvaWQgc29ydChSZXZTb3J0IHMsIGJvb2xlYW4gdXNlKSB7CiAJCWFzc2VydE5vdFN0YXJ0ZWQoKTsKIAkJaWYgKHVzZSkKIAkJCXNvcnRpbmcuYWRkKHMpOwpAQCAtNTQxLDcgKzU0MSw3IEBAIHB1YmxpYyBSZXZGaWx0ZXIgZ2V0UmV2RmlsdGVyKCkgewogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlci5BbmRSZXZGaWx0ZXIKIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpnaXQucmV2d2Fsay5maWx0ZXIuT3JSZXZGaWx0ZXIKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXZGaWx0ZXIoZmluYWwgUmV2RmlsdGVyIG5ld0ZpbHRlcikgeworCXB1YmxpYyB2b2lkIHNldFJldkZpbHRlcihSZXZGaWx0ZXIgbmV3RmlsdGVyKSB7CiAJCWFzc2VydE5vdFN0YXJ0ZWQoKTsKIAkJZmlsdGVyID0gbmV3RmlsdGVyICE9IG51bGwgPyBuZXdGaWx0ZXIgOiBSZXZGaWx0ZXIuQUxMOwogCX0KQEAgLTU4Miw3ICs1ODIsNyBAQCBwdWJsaWMgVHJlZUZpbHRlciBnZXRUcmVlRmlsdGVyKCkgewogCSAqICAgICAgICAgICAgd2lsbCBiZSB1c2VkIGluc3RlYWQsIGFzIGl0IG1hdGNoZXMgZXZlcnl0aGluZy4KIAkgKiBAc2VlIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuZmlsdGVyLlBhdGhGaWx0ZXIKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUcmVlRmlsdGVyKGZpbmFsIFRyZWVGaWx0ZXIgbmV3RmlsdGVyKSB7CisJcHVibGljIHZvaWQgc2V0VHJlZUZpbHRlcihUcmVlRmlsdGVyIG5ld0ZpbHRlcikgewogCQlhc3NlcnROb3RTdGFydGVkKCk7CiAJCXRyZWVGaWx0ZXIgPSBuZXdGaWx0ZXIgIT0gbnVsbCA/IG5ld0ZpbHRlciA6IFRyZWVGaWx0ZXIuQUxMOwogCX0KQEAgLTYzOCw3ICs2MzgsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc1JldGFpbkJvZHkoKSB7CiAJICogQHBhcmFtIHJldGFpbgogCSAqICAgICAgICAgICAgdHJ1ZSB0byByZXRhaW4gYm9kaWVzOyBmYWxzZSB0byBkaXNjYXJkIHRoZW0gZWFybHkuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmV0YWluQm9keShmaW5hbCBib29sZWFuIHJldGFpbikgeworCXB1YmxpYyB2b2lkIHNldFJldGFpbkJvZHkoYm9vbGVhbiByZXRhaW4pIHsKIAkJcmV0YWluQm9keSA9IHJldGFpbjsKIAl9CiAKQEAgLTY1Myw3ICs2NTMsNyBAQCBwdWJsaWMgdm9pZCBzZXRSZXRhaW5Cb2R5KGZpbmFsIGJvb2xlYW4gcmV0YWluKSB7CiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGJsb2Igb2JqZWN0LiBOZXZlciBudWxsLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJldkJsb2IgbG9va3VwQmxvYihmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyBSZXZCbG9iIGxvb2t1cEJsb2IoQW55T2JqZWN0SWQgaWQpIHsKIAkJUmV2QmxvYiBjID0gKFJldkJsb2IpIG9iamVjdHMuZ2V0KGlkKTsKIAkJaWYgKGMgPT0gbnVsbCkgewogCQkJYyA9IG5ldyBSZXZCbG9iKGlkKTsKQEAgLTY3Myw3ICs2NzMsNyBAQCBwdWJsaWMgUmV2QmxvYiBsb29rdXBCbG9iKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIHRyZWUgb2JqZWN0LiBOZXZlciBudWxsLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJldlRyZWUgbG9va3VwVHJlZShmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyBSZXZUcmVlIGxvb2t1cFRyZWUoQW55T2JqZWN0SWQgaWQpIHsKIAkJUmV2VHJlZSBjID0gKFJldlRyZWUpIG9iamVjdHMuZ2V0KGlkKTsKIAkJaWYgKGMgPT0gbnVsbCkgewogCQkJYyA9IG5ldyBSZXZUcmVlKGlkKTsKQEAgLTY5Niw3ICs2OTYsNyBAQCBwdWJsaWMgUmV2VHJlZSBsb29rdXBUcmVlKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIGNvbW1pdCBvYmplY3QuIE5ldmVyIG51bGwuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmV2Q29tbWl0IGxvb2t1cENvbW1pdChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXB1YmxpYyBSZXZDb21taXQgbG9va3VwQ29tbWl0KEFueU9iamVjdElkIGlkKSB7CiAJCVJldkNvbW1pdCBjID0gKFJldkNvbW1pdCkgb2JqZWN0cy5nZXQoaWQpOwogCQlpZiAoYyA9PSBudWxsKSB7CiAJCQljID0gY3JlYXRlQ29tbWl0KGlkKTsKQEAgLTcxNiw3ICs3MTYsNyBAQCBwdWJsaWMgUmV2Q29tbWl0IGxvb2t1cENvbW1pdChmaW5hbCBBbnlPYmplY3RJZCBpZCkgewogCSAqIEByZXR1cm4gcmVmZXJlbmNlIHRvIHRoZSB0YWcgb2JqZWN0LiBOZXZlciBudWxsLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJldlRhZyBsb29rdXBUYWcoZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwdWJsaWMgUmV2VGFnIGxvb2t1cFRhZyhBbnlPYmplY3RJZCBpZCkgewogCQlSZXZUYWcgYyA9IChSZXZUYWcpIG9iamVjdHMuZ2V0KGlkKTsKIAkJaWYgKGMgPT0gbnVsbCkgewogCQkJYyA9IG5ldyBSZXZUYWcoaWQpOwpAQCAtNzM4LDcgKzczOCw3IEBAIHB1YmxpYyBSZXZUYWcgbG9va3VwVGFnKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CiAJICogQHJldHVybiByZWZlcmVuY2UgdG8gdGhlIG9iamVjdC4gTmV2ZXIgbnVsbC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZXZPYmplY3QgbG9va3VwQW55KGZpbmFsIEFueU9iamVjdElkIGlkLCBmaW5hbCBpbnQgdHlwZSkgeworCXB1YmxpYyBSZXZPYmplY3QgbG9va3VwQW55KEFueU9iamVjdElkIGlkLCBpbnQgdHlwZSkgewogCQlSZXZPYmplY3QgciA9IG9iamVjdHMuZ2V0KGlkKTsKIAkJaWYgKHIgPT0gbnVsbCkgewogCQkJc3dpdGNoICh0eXBlKSB7CkBAIC03OTMsNyArNzkzLDcgQEAgcHVibGljIFJldk9iamVjdCBsb29rdXBPck51bGwoQW55T2JqZWN0SWQgaWQpIHsKIAkgKiAgICAgICAgICAgICBhIHBhY2sgZmlsZSBvciBsb29zZSBvYmplY3QgY291bGQgbm90IGJlIHJlYWQuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmV2Q29tbWl0IHBhcnNlQ29tbWl0KGZpbmFsIEFueU9iamVjdElkIGlkKQorCXB1YmxpYyBSZXZDb21taXQgcGFyc2VDb21taXQoQW55T2JqZWN0SWQgaWQpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJUmV2T2JqZWN0IGMgPSBwZWVsKHBhcnNlQW55KGlkKSk7CkBAIC04MjEsNyArODIxLDcgQEAgcHVibGljIFJldkNvbW1pdCBwYXJzZUNvbW1pdChmaW5hbCBBbnlPYmplY3RJZCBpZCkKIAkgKiAgICAgICAgICAgICBhIHBhY2sgZmlsZSBvciBsb29zZSBvYmplY3QgY291bGQgbm90IGJlIHJlYWQuCiAJICovCiAJQE5vbk51bGwKLQlwdWJsaWMgUmV2VHJlZSBwYXJzZVRyZWUoZmluYWwgQW55T2JqZWN0SWQgaWQpCisJcHVibGljIFJldlRyZWUgcGFyc2VUcmVlKEFueU9iamVjdElkIGlkKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCVJldk9iamVjdCBjID0gcGVlbChwYXJzZUFueShpZCkpOwpAQCAtODU2LDcgKzg1Niw3IEBAIGVsc2UgaWYgKCEoYyBpbnN0YW5jZW9mIFJldlRyZWUpKQogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KIAlATm9uTnVsbAotCXB1YmxpYyBSZXZUYWcgcGFyc2VUYWcoZmluYWwgQW55T2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXB1YmxpYyBSZXZUYWcgcGFyc2VUYWcoQW55T2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlSZXZPYmplY3QgYyA9IHBhcnNlQW55KGlkKTsKIAkJaWYgKCEoYyBpbnN0YW5jZW9mIFJldlRhZykpCkBAIC04ODIsNyArODgyLDcgQEAgcHVibGljIFJldlRhZyBwYXJzZVRhZyhmaW5hbCBBbnlPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJICogICAgICAgICAgICAgYSBwYWNrIGZpbGUgb3IgbG9vc2Ugb2JqZWN0IGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwogCUBOb25OdWxsCi0JcHVibGljIFJldk9iamVjdCBwYXJzZUFueShmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlwdWJsaWMgUmV2T2JqZWN0IHBhcnNlQW55KEFueU9iamVjdElkIGlkKQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJUmV2T2JqZWN0IHIgPSBvYmplY3RzLmdldChpZCk7CiAJCWlmIChyID09IG51bGwpCkBAIC0xMDQwLDcgKzEwNDAsNyBAQCBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZUhlYWRlcnMoZmluYWwgUmV2T2JqZWN0IG9iaikKKwlwdWJsaWMgdm9pZCBwYXJzZUhlYWRlcnMoUmV2T2JqZWN0IG9iaikKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmICgob2JqLmZsYWdzICYgUEFSU0VEKSA9PSAwKQogCQkJb2JqLnBhcnNlSGVhZGVycyh0aGlzKTsKQEAgLTEwNTksNyArMTA1OSw3IEBAIHB1YmxpYyB2b2lkIHBhcnNlSGVhZGVycyhmaW5hbCBSZXZPYmplY3Qgb2JqKQogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgcGFjayBmaWxlIG9yIGxvb3NlIG9iamVjdCBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBwYXJzZUJvZHkoZmluYWwgUmV2T2JqZWN0IG9iaikKKwlwdWJsaWMgdm9pZCBwYXJzZUJvZHkoUmV2T2JqZWN0IG9iaikKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCW9iai5wYXJzZUJvZHkodGhpcyk7CiAJfQpAQCAtMTEwMCw3ICsxMTAwLDcgQEAgcHVibGljIFJldk9iamVjdCBwZWVsKFJldk9iamVjdCBvYmopIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCSAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRvbyBtYW55IGZsYWdzIGhhdmUgYmVlbiByZXNlcnZlZCBvbiB0aGlzIHJldmlzaW9uIHdhbGtlci4KIAkgKi8KLQlwdWJsaWMgUmV2RmxhZyBuZXdGbGFnKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHVibGljIFJldkZsYWcgbmV3RmxhZyhTdHJpbmcgbmFtZSkgewogCQlmaW5hbCBpbnQgbSA9IGFsbG9jRmxhZygpOwogCQlyZXR1cm4gbmV3IFJldkZsYWcodGhpcywgbmFtZSwgbSk7CiAJfQpAQCAtMTEyNCw3ICsxMTI0LDcgQEAgaW50IGFsbG9jRmxhZygpIHsKIAkgKiBAcGFyYW0gZmxhZwogCSAqICAgICAgICAgICAgdGhlIGZsYWcgdG8gY2Fycnkgb250byBwYXJlbnRzLCBpZiBzZXQgb24gYSBkZXNjZW5kYW50LgogCSAqLwotCXB1YmxpYyB2b2lkIGNhcnJ5KGZpbmFsIFJldkZsYWcgZmxhZykgeworCXB1YmxpYyB2b2lkIGNhcnJ5KFJldkZsYWcgZmxhZykgewogCQlpZiAoKGZyZWVGbGFncyAmIGZsYWcubWFzaykgIT0gMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuZmxhZ0lzRGlzcG9zZWQsIGZsYWcubmFtZSkpOwogCQlpZiAoZmxhZy53YWxrZXIgIT0gdGhpcykKQEAgLTExNDEsOCArMTE0MSw4IEBAIHB1YmxpYyB2b2lkIGNhcnJ5KGZpbmFsIFJldkZsYWcgZmxhZykgewogCSAqIEBwYXJhbSBzZXQKIAkgKiAgICAgICAgICAgIHRoZSBmbGFncyB0byBjYXJyeSBvbnRvIHBhcmVudHMsIGlmIHNldCBvbiBhIGRlc2NlbmRhbnQuCiAJICovCi0JcHVibGljIHZvaWQgY2FycnkoZmluYWwgQ29sbGVjdGlvbjxSZXZGbGFnPiBzZXQpIHsKLQkJZm9yIChmaW5hbCBSZXZGbGFnIGZsYWcgOiBzZXQpCisJcHVibGljIHZvaWQgY2FycnkoQ29sbGVjdGlvbjxSZXZGbGFnPiBzZXQpIHsKKwkJZm9yIChSZXZGbGFnIGZsYWcgOiBzZXQpCiAJCQljYXJyeShmbGFnKTsKIAl9CiAKQEAgLTEyMDAsMTEgKzEyMDAsMTEgQEAgcHVibGljIGZpbmFsIHZvaWQgcmV0YWluT25SZXNldChDb2xsZWN0aW9uPFJldkZsYWc+IGZsYWdzKSB7CiAJICogQHBhcmFtIGZsYWcKIAkgKiAgICAgICAgICAgIHRoZSB0byByZWN5Y2xlLgogCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2VGbGFnKGZpbmFsIFJldkZsYWcgZmxhZykgeworCXB1YmxpYyB2b2lkIGRpc3Bvc2VGbGFnKFJldkZsYWcgZmxhZykgewogCQlmcmVlRmxhZyhmbGFnLm1hc2spOwogCX0KIAotCXZvaWQgZnJlZUZsYWcoZmluYWwgaW50IG1hc2spIHsKKwl2b2lkIGZyZWVGbGFnKGludCBtYXNrKSB7CiAJCXJldGFpbk9uUmVzZXQgJj0gfm1hc2s7CiAJCWlmIChpc05vdFN0YXJ0ZWQoKSkgewogCQkJZnJlZUZsYWdzIHw9IG1hc2s7CkBAIC0xMjQ0LDcgKzEyNDQsNyBAQCBwdWJsaWMgZmluYWwgdm9pZCByZXNldCgpIHsKIAkgKiAgICAgICAgICAgIGFwcGxpY2F0aW9uIGZsYWdzIHRoYXQgc2hvdWxkIDxiPm5vdDwvYj4gYmUgY2xlYXJlZCBmcm9tCiAJICogICAgICAgICAgICBleGlzdGluZyBjb21taXQgb2JqZWN0cy4KIAkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZXNldFJldGFpbihmaW5hbCBSZXZGbGFnU2V0IHJldGFpbkZsYWdzKSB7CisJcHVibGljIGZpbmFsIHZvaWQgcmVzZXRSZXRhaW4oUmV2RmxhZ1NldCByZXRhaW5GbGFncykgewogCQlyZXNldChyZXRhaW5GbGFncy5tYXNrKTsKIAl9CiAKQEAgLTEyNjIsOSArMTI2Miw5IEBAIHB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0UmV0YWluKGZpbmFsIFJldkZsYWdTZXQgcmV0YWluRmxhZ3MpIHsKIAkgKiAgICAgICAgICAgIGFwcGxpY2F0aW9uIGZsYWdzIHRoYXQgc2hvdWxkIDxiPm5vdDwvYj4gYmUgY2xlYXJlZCBmcm9tCiAJICogICAgICAgICAgICBleGlzdGluZyBjb21taXQgb2JqZWN0cy4KIAkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZXNldFJldGFpbihmaW5hbCBSZXZGbGFnLi4uIHJldGFpbkZsYWdzKSB7CisJcHVibGljIGZpbmFsIHZvaWQgcmVzZXRSZXRhaW4oUmV2RmxhZy4uLiByZXRhaW5GbGFncykgewogCQlpbnQgbWFzayA9IDA7Ci0JCWZvciAoZmluYWwgUmV2RmxhZyBmbGFnIDogcmV0YWluRmxhZ3MpCisJCWZvciAoUmV2RmxhZyBmbGFnIDogcmV0YWluRmxhZ3MpCiAJCQltYXNrIHw9IGZsYWcubWFzazsKIAkJcmVzZXQobWFzayk7CiAJfQpAQCAtMTI4Niw3ICsxMjg2LDcgQEAgcHJvdGVjdGVkIHZvaWQgcmVzZXQoaW50IHJldGFpbkZsYWdzKSB7CiAJCWZpbmFsIGludCBjbGVhckZsYWdzID0gfnJldGFpbkZsYWdzOwogCiAJCWZpbmFsIEZJRk9SZXZRdWV1ZSBxID0gbmV3IEZJRk9SZXZRdWV1ZSgpOwotCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBjIDogcm9vdHMpIHsKKwkJZm9yIChSZXZDb21taXQgYyA6IHJvb3RzKSB7CiAJCQlpZiAoKGMuZmxhZ3MgJiBjbGVhckZsYWdzKSA9PSAwKQogCQkJCWNvbnRpbnVlOwogCQkJYy5mbGFncyAmPSByZXRhaW5GbGFnczsKQEAgLTEzMDAsNyArMTMwMCw3IEBAIHByb3RlY3RlZCB2b2lkIHJlc2V0KGludCByZXRhaW5GbGFncykgewogCQkJCWJyZWFrOwogCQkJaWYgKGMucGFyZW50cyA9PSBudWxsKQogCQkJCWNvbnRpbnVlOwotCQkJZm9yIChmaW5hbCBSZXZDb21taXQgcCA6IGMucGFyZW50cykgeworCQkJZm9yIChSZXZDb21taXQgcCA6IGMucGFyZW50cykgewogCQkJCWlmICgocC5mbGFncyAmIGNsZWFyRmxhZ3MpID09IDApCiAJCQkJCWNvbnRpbnVlOwogCQkJCXAuZmxhZ3MgJj0gcmV0YWluRmxhZ3M7CkBAIC0xNDM1LDExICsxNDM1LDExIEBAIHB1YmxpYyBPYmplY3RXYWxrIHRvT2JqZWN0V2Fsa1dpdGhTYW1lT2JqZWN0cygpIHsKIAkgKiAgICAgICAgICAgIHRoZSBvYmplY3QgdGhpcyB3YWxrZXIgcmVxdWlyZXMgYSBjb21taXQgcmVmZXJlbmNlIGZvci4KIAkgKiBAcmV0dXJuIGEgbmV3IHVucGFyc2VkIHJlZmVyZW5jZSBmb3IgdGhlIG9iamVjdC4KIAkgKi8KLQlwcm90ZWN0ZWQgUmV2Q29tbWl0IGNyZWF0ZUNvbW1pdChmaW5hbCBBbnlPYmplY3RJZCBpZCkgeworCXByb3RlY3RlZCBSZXZDb21taXQgY3JlYXRlQ29tbWl0KEFueU9iamVjdElkIGlkKSB7CiAJCXJldHVybiBuZXcgUmV2Q29tbWl0KGlkKTsKIAl9CiAKLQl2b2lkIGNhcnJ5RmxhZ3NJbXBsKGZpbmFsIFJldkNvbW1pdCBjKSB7CisJdm9pZCBjYXJyeUZsYWdzSW1wbChSZXZDb21taXQgYykgewogCQlmaW5hbCBpbnQgY2FycnkgPSBjLmZsYWdzICYgY2FycnlGbGFnczsKIAkJaWYgKGNhcnJ5ICE9IDApCiAJCQlSZXZDb21taXQuY2FycnlGbGFncyhjLCBjYXJyeSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV3cml0ZUdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1Jld3JpdGVHZW5lcmF0b3IuamF2YQppbmRleCBmODIzMDFhLi4xYzg2OGZmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvUmV3cml0ZUdlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9SZXdyaXRlR2VuZXJhdG9yLmphdmEKQEAgLTc2LDEyICs3NiwxMiBAQCBjbGFzcyBSZXdyaXRlR2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKIAogCXByaXZhdGUgZmluYWwgR2VuZXJhdG9yIHNvdXJjZTsKIAotCVJld3JpdGVHZW5lcmF0b3IoZmluYWwgR2VuZXJhdG9yIHMpIHsKKwlSZXdyaXRlR2VuZXJhdG9yKEdlbmVyYXRvciBzKSB7CiAJCXNvdXJjZSA9IHM7CiAJfQogCiAJQE92ZXJyaWRlCi0Jdm9pZCBzaGFyZUZyZWVMaXN0KGZpbmFsIEJsb2NrUmV2UXVldWUgcSkgeworCXZvaWQgc2hhcmVGcmVlTGlzdChCbG9ja1JldlF1ZXVlIHEpIHsKIAkJc291cmNlLnNoYXJlRnJlZUxpc3QocSk7CiAJfQogCkBAIC0xNDgsNyArMTQ4LDcgQEAgcHJpdmF0ZSBSZXZDb21taXQgcmV3cml0ZShSZXZDb21taXQgcCkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSBSZXZDb21taXRbXSBjbGVhbnVwKGZpbmFsIFJldkNvbW1pdFtdIG9sZExpc3QpIHsKKwlwcml2YXRlIFJldkNvbW1pdFtdIGNsZWFudXAoUmV2Q29tbWl0W10gb2xkTGlzdCkgewogCQkvLyBSZW1vdmUgYW55IGR1cGxpY2F0ZSBwYXJlbnRzIGNhdXNlZCBkdWUgdG8gcmV3cml0ZXMgKGUuZy4gYSBtZXJnZQogCQkvLyB3aXRoIHR3byBzaWRlcyB0aGF0IGJvdGggc2ltcGxpZmllZCBiYWNrIGludG8gdGhlIG1lcmdlIGJhc2UpLgogCQkvLyBXZSBhbHNvIG1heSBoYXZlIGRlbGV0ZWQgYSBwYXJlbnQgYnkgbWFya2luZyBpdCBudWxsLgpAQCAtMTY3LDE0ICsxNjcsMTQgQEAgcHJpdmF0ZSBSZXZDb21taXQgcmV3cml0ZShSZXZDb21taXQgcCkgewogCQl9CiAKIAkJaWYgKG5ld0NudCA9PSBvbGRMaXN0Lmxlbmd0aCkgewotCQkJZm9yIChmaW5hbCBSZXZDb21taXQgcCA6IG9sZExpc3QpCisJCQlmb3IgKFJldkNvbW1pdCBwIDogb2xkTGlzdCkKIAkJCQlwLmZsYWdzICY9IH5EVVBMSUNBVEU7CiAJCQlyZXR1cm4gb2xkTGlzdDsKIAkJfQogCiAJCWZpbmFsIFJldkNvbW1pdFtdIG5ld0xpc3QgPSBuZXcgUmV2Q29tbWl0W25ld0NudF07CiAJCW5ld0NudCA9IDA7Ci0JCWZvciAoZmluYWwgUmV2Q29tbWl0IHAgOiBvbGRMaXN0KSB7CisJCWZvciAoUmV2Q29tbWl0IHAgOiBvbGRMaXN0KSB7CiAJCQlpZiAocCAhPSBudWxsKSB7CiAJCQkJbmV3TGlzdFtuZXdDbnQrK10gPSBwOwogCQkJCXAuZmxhZ3MgJj0gfkRVUExJQ0FURTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9TdGFydEdlbmVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1N0YXJ0R2VuZXJhdG9yLmphdmEKaW5kZXggMWVjNjI5MC4uZWIxMjlhMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1N0YXJ0R2VuZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1N0YXJ0R2VuZXJhdG9yLmphdmEKQEAgLTY2LDcgKzY2LDcgQEAKIGNsYXNzIFN0YXJ0R2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKIAlwcml2YXRlIGZpbmFsIFJldldhbGsgd2Fsa2VyOwogCi0JU3RhcnRHZW5lcmF0b3IoZmluYWwgUmV2V2FsayB3KSB7CisJU3RhcnRHZW5lcmF0b3IoUmV2V2FsayB3KSB7CiAJCXdhbGtlciA9IHc7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvVG9wb1NvcnRHZW5lcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Ub3BvU29ydEdlbmVyYXRvci5qYXZhCmluZGV4IDdiMTFkMDQuLjY0NTAzNDMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Ub3BvU29ydEdlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9Ub3BvU29ydEdlbmVyYXRvci5qYXZhCkBAIC02OSw3ICs2OSw3IEBAIGNsYXNzIFRvcG9Tb3J0R2VuZXJhdG9yIGV4dGVuZHMgR2VuZXJhdG9yIHsKIAkgKiBAdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24KIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICovCi0JVG9wb1NvcnRHZW5lcmF0b3IoZmluYWwgR2VuZXJhdG9yIHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCVRvcG9Tb3J0R2VuZXJhdG9yKEdlbmVyYXRvciBzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcGVuZGluZyA9IG5ldyBGSUZPUmV2UXVldWUoKTsKIAkJb3V0cHV0VHlwZSA9IHMub3V0cHV0VHlwZSgpIHwgU09SVF9UT1BPOwpAQCAtNzgsNyArNzgsNyBAQCBjbGFzcyBUb3BvU29ydEdlbmVyYXRvciBleHRlbmRzIEdlbmVyYXRvciB7CiAJCQlmaW5hbCBSZXZDb21taXQgYyA9IHMubmV4dCgpOwogCQkJaWYgKGMgPT0gbnVsbCkKIAkJCQlicmVhazsKLQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IHAgOiBjLnBhcmVudHMpCisJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKQogCQkJCXAuaW5EZWdyZWUrKzsKIAkJCXBlbmRpbmcuYWRkKGMpOwogCQl9CkBAIC05MCw3ICs5MCw3IEBAIGludCBvdXRwdXRUeXBlKCkgewogCX0KIAogCUBPdmVycmlkZQotCXZvaWQgc2hhcmVGcmVlTGlzdChmaW5hbCBCbG9ja1JldlF1ZXVlIHEpIHsKKwl2b2lkIHNoYXJlRnJlZUxpc3QoQmxvY2tSZXZRdWV1ZSBxKSB7CiAJCXEuc2hhcmVGcmVlTGlzdChwZW5kaW5nKTsKIAl9CiAKQEAgLTExMyw3ICsxMTMsNyBAQCBSZXZDb21taXQgbmV4dCgpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJLy8gQWxsIG9mIG91ciBjaGlsZHJlbiBoYXZlIGFscmVhZHkgcHJvZHVjZWQsCiAJCQkvLyBzbyBpdCBpcyBPSyBmb3IgdXMgdG8gcHJvZHVjZSBub3cgYXMgd2VsbC4KIAkJCS8vCi0JCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CisJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5wYXJlbnRzKSB7CiAJCQkJaWYgKC0tcC5pbkRlZ3JlZSA9PSAwICYmIChwLmZsYWdzICYgVE9QT19ERUxBWSkgIT0gMCkgewogCQkJCQkvLyBUaGlzIHBhcmVudCB0cmllZCB0byBjb21lIGJlZm9yZSB1cywgYnV0IHdlIGFyZQogCQkJCQkvLyBoaXMgbGFzdCBjaGlsZC4gdW5wb3AgdGhlIHBhcmVudCBzbyBpdCBnb2VzIHJpZ2h0CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvVHJlZVJldkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL1RyZWVSZXZGaWx0ZXIuamF2YQppbmRleCA5OWM1ZDU5Li4xMTMwMTUzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvVHJlZVJldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9UcmVlUmV2RmlsdGVyLmphdmEKQEAgLTg5LDcgKzg5LDcgQEAgcHVibGljIGNsYXNzIFRyZWVSZXZGaWx0ZXIgZXh0ZW5kcyBSZXZGaWx0ZXIgewogCSAqICAgICAgICAgICAgcmVwbGFjZWQgd2l0aCBhIG5ldyBmaWx0ZXIgZm9sbG93aW5nIG5ldyBwYXRocyBhZnRlciBhIHJlbmFtZS4KIAkgKiBAc2luY2UgMy41CiAJICovCi0JcHVibGljIFRyZWVSZXZGaWx0ZXIoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFRyZWVGaWx0ZXIgdCkgeworCXB1YmxpYyBUcmVlUmV2RmlsdGVyKFJldldhbGsgd2Fsa2VyLCBUcmVlRmlsdGVyIHQpIHsKIAkJdGhpcyh3YWxrZXIsIHQsIDApOwogCX0KIApAQCAtMTMyLDcgKzEzMiw3IEBAIHB1YmxpYyBSZXZGaWx0ZXIgY2xvbmUoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKQorCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKQogCQkJdGhyb3dzIFN0b3BXYWxrRXhjZXB0aW9uLCBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQkvLyBSZXNldCB0aGUgdHJlZSBmaWx0ZXIgdG8gc2NhbiB0aGlzIGNvbW1pdCBhbmQgcGFyZW50cy4KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQW5kUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0FuZFJldkZpbHRlci5qYXZhCmluZGV4IDAwMTllMGMuLmRmYjgzYjQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQW5kUmV2RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9BbmRSZXZGaWx0ZXIuamF2YQpAQCAtNzIsNyArNzIsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5kUmV2RmlsdGVyIGV4dGVuZHMgUmV2RmlsdGVyIHsKIAkgKiAgICAgICAgICAgIHNlY29uZCBmaWx0ZXIgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBib3RoIGlucHV0IGZpbHRlcnMuCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIFJldkZpbHRlciBhLCBmaW5hbCBSZXZGaWx0ZXIgYikgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShSZXZGaWx0ZXIgYSwgUmV2RmlsdGVyIGIpIHsKIAkJaWYgKGEgPT0gQUxMKQogCQkJcmV0dXJuIGI7CiAJCWlmIChiID09IEFMTCkKQEAgLTg4LDcgKzg4LDcgQEAgcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIFJldkZpbHRlciBhLCBmaW5hbCBSZXZGaWx0ZXIgYikgewogCSAqICAgICAgICAgICAgZmlsdGVycy4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhbGwgaW5wdXQgZmlsdGVycy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoZmluYWwgUmV2RmlsdGVyW10gbGlzdCkgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShSZXZGaWx0ZXJbXSBsaXN0KSB7CiAJCWlmIChsaXN0Lmxlbmd0aCA9PSAyKQogCQkJcmV0dXJuIGNyZWF0ZShsaXN0WzBdLCBsaXN0WzFdKTsKIAkJaWYgKGxpc3QubGVuZ3RoIDwgMikKQEAgLTEwNiw3ICsxMDYsNyBAQCBwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoZmluYWwgUmV2RmlsdGVyW10gbGlzdCkgewogCSAqICAgICAgICAgICAgZmlsdGVycy4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhbGwgaW5wdXQgZmlsdGVycy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoZmluYWwgQ29sbGVjdGlvbjxSZXZGaWx0ZXI+IGxpc3QpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoQ29sbGVjdGlvbjxSZXZGaWx0ZXI+IGxpc3QpIHsKIAkJaWYgKGxpc3Quc2l6ZSgpIDwgMikKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuYXRMZWFzdFR3b0ZpbHRlcnNOZWVkZWQpOwogCQlmaW5hbCBSZXZGaWx0ZXJbXSBzdWJmaWx0ZXJzID0gbmV3IFJldkZpbHRlcltsaXN0LnNpemUoKV07CkBAIC0xMjMsNyArMTIzLDcgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmluYXJ5IGV4dGVuZHMgQW5kUmV2RmlsdGVyIHsKIAogCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVxdWlyZXNDb21taXRCb2R5OwogCi0JCUJpbmFyeShmaW5hbCBSZXZGaWx0ZXIgb25lLCBmaW5hbCBSZXZGaWx0ZXIgdHdvKSB7CisJCUJpbmFyeShSZXZGaWx0ZXIgb25lLCBSZXZGaWx0ZXIgdHdvKSB7CiAJCQlhID0gb25lOwogCQkJYiA9IHR3bzsKIAkJCXJlcXVpcmVzQ29tbWl0Qm9keSA9IGEucmVxdWlyZXNDb21taXRCb2R5KCkKQEAgLTEzMSw3ICsxMzEsNyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaW5hcnkgZXh0ZW5kcyBBbmRSZXZGaWx0ZXIgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gYS5pbmNsdWRlKHdhbGtlciwgYykgJiYgYi5pbmNsdWRlKHdhbGtlciwgYyk7CkBAIC0xNTksNyArMTU5LDcgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdCBleHRlbmRzIEFuZFJldkZpbHRlciB7CiAKIAkJcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcXVpcmVzQ29tbWl0Qm9keTsKIAotCQlMaXN0KGZpbmFsIFJldkZpbHRlcltdIGxpc3QpIHsKKwkJTGlzdChSZXZGaWx0ZXJbXSBsaXN0KSB7CiAJCQlzdWJmaWx0ZXJzID0gbGlzdDsKIAogCQkJYm9vbGVhbiByY2IgPSBmYWxzZTsKQEAgLTE2OSwxMCArMTY5LDEwIEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIExpc3QgZXh0ZW5kcyBBbmRSZXZGaWx0ZXIgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7Ci0JCQlmb3IgKGZpbmFsIFJldkZpbHRlciBmIDogc3ViZmlsdGVycykgeworCQkJZm9yIChSZXZGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpIHsKIAkJCQlpZiAoIWYuaW5jbHVkZSh3YWxrZXIsIGMpKQogCQkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0F1dGhvclJldkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9BdXRob3JSZXZGaWx0ZXIuamF2YQppbmRleCBlMDBmZWFmLi4zMzRkNGYwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0F1dGhvclJldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQXV0aG9yUmV2RmlsdGVyLmphdmEKQEAgLTgxLDcgKzgxLDcgQEAgcHJpdmF0ZSBBdXRob3JSZXZGaWx0ZXIoKSB7CiAJCS8vIERvbid0IHBlcm1pdCB1cyB0byBiZSBjcmVhdGVkLgogCX0KIAotCXN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgdGV4dEZvcihmaW5hbCBSZXZDb21taXQgY21pdCkgeworCXN0YXRpYyBSYXdDaGFyU2VxdWVuY2UgdGV4dEZvcihSZXZDb21taXQgY21pdCkgewogCQlmaW5hbCBieXRlW10gcmF3ID0gY21pdC5nZXRSYXdCdWZmZXIoKTsKIAkJZmluYWwgaW50IGIgPSBSYXdQYXJzZVV0aWxzLmF1dGhvcihyYXcsIDApOwogCQlpZiAoYiA8IDApCkBAIC05MSwxMiArOTEsMTIgQEAgc3RhdGljIFJhd0NoYXJTZXF1ZW5jZSB0ZXh0Rm9yKGZpbmFsIFJldkNvbW1pdCBjbWl0KSB7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGF0dGVyblNlYXJjaCBleHRlbmRzIFBhdHRlcm5NYXRjaFJldkZpbHRlciB7Ci0JCVBhdHRlcm5TZWFyY2goZmluYWwgU3RyaW5nIHBhdHRlcm5UZXh0KSB7CisJCVBhdHRlcm5TZWFyY2goU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCQlzdXBlcihwYXR0ZXJuVGV4dCwgdHJ1ZSwgdHJ1ZSwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwcm90ZWN0ZWQgQ2hhclNlcXVlbmNlIHRleHQoZmluYWwgUmV2Q29tbWl0IGNtaXQpIHsKKwkJcHJvdGVjdGVkIENoYXJTZXF1ZW5jZSB0ZXh0KFJldkNvbW1pdCBjbWl0KSB7CiAJCQlyZXR1cm4gdGV4dEZvcihjbWl0KTsKIAkJfQogCkBAIC0xMDcsMTIgKzEwNywxMiBAQCBwdWJsaWMgUmV2RmlsdGVyIGNsb25lKCkgewogCX0KIAogCXByaXZhdGUgc3RhdGljIGNsYXNzIFN1YlN0cmluZ1NlYXJjaCBleHRlbmRzIFN1YlN0cmluZ1JldkZpbHRlciB7Ci0JCVN1YlN0cmluZ1NlYXJjaChmaW5hbCBTdHJpbmcgcGF0dGVyblRleHQpIHsKKwkJU3ViU3RyaW5nU2VhcmNoKFN0cmluZyBwYXR0ZXJuVGV4dCkgewogCQkJc3VwZXIocGF0dGVyblRleHQpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBSYXdDaGFyU2VxdWVuY2UgdGV4dChmaW5hbCBSZXZDb21taXQgY21pdCkgeworCQlwcm90ZWN0ZWQgUmF3Q2hhclNlcXVlbmNlIHRleHQoUmV2Q29tbWl0IGNtaXQpIHsKIAkJCXJldHVybiB0ZXh0Rm9yKGNtaXQpOwogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Db21taXRUaW1lUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0NvbW1pdFRpbWVSZXZGaWx0ZXIuamF2YQppbmRleCA5ZjRmMTBmLi4zODgwNTE1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0NvbW1pdFRpbWVSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0NvbW1pdFRpbWVSZXZGaWx0ZXIuamF2YQpAQCAtNjQsNyArNjQsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tbWl0VGltZVJldkZpbHRlciBleHRlbmRzIFJldkZpbHRlciB7CiAJICogICAgICAgICAgICB0aGUgcG9pbnQgaW4gdGltZSB0byBjdXQgb24uCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgdG8gc2VsZWN0IGNvbW1pdHMgb24gb3IgYmVmb3JlIDxjb2RlPnRzPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBiZWZvcmUoZmluYWwgRGF0ZSB0cykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGJlZm9yZShEYXRlIHRzKSB7CiAJCXJldHVybiBiZWZvcmUodHMuZ2V0VGltZSgpKTsKIAl9CiAKQEAgLTc1LDcgKzc1LDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYmVmb3JlKGZpbmFsIERhdGUgdHMpIHsKIAkgKiAgICAgICAgICAgIHRoZSBwb2ludCBpbiB0aW1lIHRvIGN1dCBvbiwgaW4gbWlsbGlzZWNvbmRzCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgdG8gc2VsZWN0IGNvbW1pdHMgb24gb3IgYmVmb3JlIDxjb2RlPnRzPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBiZWZvcmUoZmluYWwgbG9uZyB0cykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGJlZm9yZShsb25nIHRzKSB7CiAJCXJldHVybiBuZXcgQmVmb3JlKHRzKTsKIAl9CiAKQEAgLTg2LDcgKzg2LDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYmVmb3JlKGZpbmFsIGxvbmcgdHMpIHsKIAkgKiAgICAgICAgICAgIHRoZSBwb2ludCBpbiB0aW1lIHRvIGN1dCBvbi4KIAkgKiBAcmV0dXJuIGEgbmV3IGZpbHRlciB0byBzZWxlY3QgY29tbWl0cyBvbiBvciBhZnRlciA8Y29kZT50czwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYWZ0ZXIoZmluYWwgRGF0ZSB0cykgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGFmdGVyKERhdGUgdHMpIHsKIAkJcmV0dXJuIGFmdGVyKHRzLmdldFRpbWUoKSk7CiAJfQogCkBAIC05Nyw3ICs5Nyw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgUmV2RmlsdGVyIGFmdGVyKGZpbmFsIERhdGUgdHMpIHsKIAkgKiAgICAgICAgICAgIHRoZSBwb2ludCBpbiB0aW1lIHRvIGN1dCBvbiwgaW4gbWlsbGlzZWNvbmRzLgogCSAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIHRvIHNlbGVjdCBjb21taXRzIG9uIG9yIGFmdGVyIDxjb2RlPnRzPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBhZnRlcihmaW5hbCBsb25nIHRzKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYWZ0ZXIobG9uZyB0cykgewogCQlyZXR1cm4gbmV3IEFmdGVyKHRzKTsKIAl9CiAKQEAgLTEwOSw3ICsxMDksNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBhZnRlcihmaW5hbCBsb25nIHRzKSB7CiAJICogQHBhcmFtIHVudGlsIHRoZSBwb2ludCBpbiB0aW1lIHRvIGN1dCBvZmYuCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgdG8gc2VsZWN0IGNvbW1pdHMgYmV0d2VlbiB0aGUgZ2l2ZW4gZGF0ZS90aW1lcy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBiZXR3ZWVuKGZpbmFsIERhdGUgc2luY2UsIGZpbmFsIERhdGUgdW50aWwpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIFJldkZpbHRlciBiZXR3ZWVuKERhdGUgc2luY2UsIERhdGUgdW50aWwpIHsKIAkJcmV0dXJuIGJldHdlZW4oc2luY2UuZ2V0VGltZSgpLCB1bnRpbC5nZXRUaW1lKCkpOwogCX0KIApAQCAtMTIxLDEzICsxMjEsMTMgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYmV0d2VlbihmaW5hbCBEYXRlIHNpbmNlLCBmaW5hbCBEYXRlIHVudGlsKSB7CiAJICogQHBhcmFtIHVudGlsIHRoZSBwb2ludCBpbiB0aW1lIHRvIGN1dCBvZmYsIGluIG1pbGxpc2NvbmRzLgogCSAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIHRvIHNlbGVjdCBjb21taXRzIGJldHdlZW4gdGhlIGdpdmVuIGRhdGUvdGltZXMuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYmV0d2VlbihmaW5hbCBsb25nIHNpbmNlLCBmaW5hbCBsb25nIHVudGlsKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBSZXZGaWx0ZXIgYmV0d2Vlbihsb25nIHNpbmNlLCBsb25nIHVudGlsKSB7CiAJCXJldHVybiBuZXcgQmV0d2VlbihzaW5jZSwgdW50aWwpOwogCX0KIAogCWZpbmFsIGludCB3aGVuOwogCi0JQ29tbWl0VGltZVJldkZpbHRlcihmaW5hbCBsb25nIHRzKSB7CisJQ29tbWl0VGltZVJldkZpbHRlcihsb25nIHRzKSB7CiAJCXdoZW4gPSAoaW50KSAodHMgLyAxMDAwKTsKIAl9CiAKQEAgLTE0NCwxMiArMTQ0LDEyIEBAIHB1YmxpYyBib29sZWFuIHJlcXVpcmVzQ29tbWl0Qm9keSgpIHsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBCZWZvcmUgZXh0ZW5kcyBDb21taXRUaW1lUmV2RmlsdGVyIHsKLQkJQmVmb3JlKGZpbmFsIGxvbmcgdHMpIHsKKwkJQmVmb3JlKGxvbmcgdHMpIHsKIAkJCXN1cGVyKHRzKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgY21pdCkKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGNtaXQpCiAJCQkJdGhyb3dzIFN0b3BXYWxrRXhjZXB0aW9uLCBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBjbWl0LmdldENvbW1pdFRpbWUoKSA8PSB3aGVuOwpAQCAtMTYzLDEyICsxNjMsMTIgQEAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBBZnRlciBleHRlbmRzIENvbW1pdFRpbWVSZXZGaWx0ZXIgewotCQlBZnRlcihmaW5hbCBsb25nIHRzKSB7CisJCUFmdGVyKGxvbmcgdHMpIHsKIAkJCXN1cGVyKHRzKTsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgY21pdCkKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGNtaXQpCiAJCQkJdGhyb3dzIFN0b3BXYWxrRXhjZXB0aW9uLCBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJCUluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJCS8vIFNpbmNlIHRoZSB3YWxrZXIgc29ydHMgY29tbWl0cyBieSBjb21taXQgdGltZSB3ZSBjYW4gYmUKQEAgLTE5MCwxMyArMTkwLDEzIEBAIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmV0d2VlbiBleHRlbmRzIENvbW1pdFRpbWVSZXZGaWx0ZXIgewogCQlwcml2YXRlIGZpbmFsIGludCB1bnRpbDsKIAotCQlCZXR3ZWVuKGZpbmFsIGxvbmcgc2luY2UsIGZpbmFsIGxvbmcgdW50aWwpIHsKKwkJQmV0d2Vlbihsb25nIHNpbmNlLCBsb25nIHVudGlsKSB7CiAJCQlzdXBlcihzaW5jZSk7CiAJCQl0aGlzLnVudGlsID0gKGludCkgKHVudGlsIC8gMTAwMCk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGNtaXQpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjbWl0KQogCQkJCXRocm93cyBTdG9wV2Fsa0V4Y2VwdGlvbiwgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gY21pdC5nZXRDb21taXRUaW1lKCkgPD0gdW50aWwgJiYgY21pdC5nZXRDb21taXRUaW1lKCkgPj0gd2hlbjsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQ29tbWl0dGVyUmV2RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL0NvbW1pdHRlclJldkZpbHRlci5qYXZhCmluZGV4IDRhMWIzYTYuLjM3Yzg0MGUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvQ29tbWl0dGVyUmV2RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Db21taXR0ZXJSZXZGaWx0ZXIuamF2YQpAQCAtODEsNyArODEsNyBAQCBwcml2YXRlIENvbW1pdHRlclJldkZpbHRlcigpIHsKIAkJLy8gRG9uJ3QgcGVybWl0IHVzIHRvIGJlIGNyZWF0ZWQuCiAJfQogCi0Jc3RhdGljIFJhd0NoYXJTZXF1ZW5jZSB0ZXh0Rm9yKGZpbmFsIFJldkNvbW1pdCBjbWl0KSB7CisJc3RhdGljIFJhd0NoYXJTZXF1ZW5jZSB0ZXh0Rm9yKFJldkNvbW1pdCBjbWl0KSB7CiAJCWZpbmFsIGJ5dGVbXSByYXcgPSBjbWl0LmdldFJhd0J1ZmZlcigpOwogCQlmaW5hbCBpbnQgYiA9IFJhd1BhcnNlVXRpbHMuY29tbWl0dGVyKHJhdywgMCk7CiAJCWlmIChiIDwgMCkKQEAgLTkxLDEyICs5MSwxMiBAQCBzdGF0aWMgUmF3Q2hhclNlcXVlbmNlIHRleHRGb3IoZmluYWwgUmV2Q29tbWl0IGNtaXQpIHsKIAl9CiAKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBQYXR0ZXJuU2VhcmNoIGV4dGVuZHMgUGF0dGVybk1hdGNoUmV2RmlsdGVyIHsKLQkJUGF0dGVyblNlYXJjaChmaW5hbCBTdHJpbmcgcGF0dGVyblRleHQpIHsKKwkJUGF0dGVyblNlYXJjaChTdHJpbmcgcGF0dGVyblRleHQpIHsKIAkJCXN1cGVyKHBhdHRlcm5UZXh0LCB0cnVlLCB0cnVlLCBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFyU2VxdWVuY2UgdGV4dChmaW5hbCBSZXZDb21taXQgY21pdCkgeworCQlwcm90ZWN0ZWQgQ2hhclNlcXVlbmNlIHRleHQoUmV2Q29tbWl0IGNtaXQpIHsKIAkJCXJldHVybiB0ZXh0Rm9yKGNtaXQpOwogCQl9CiAKQEAgLTEwNywxMiArMTA3LDEyIEBAIHB1YmxpYyBSZXZGaWx0ZXIgY2xvbmUoKSB7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3ViU3RyaW5nU2VhcmNoIGV4dGVuZHMgU3ViU3RyaW5nUmV2RmlsdGVyIHsKLQkJU3ViU3RyaW5nU2VhcmNoKGZpbmFsIFN0cmluZyBwYXR0ZXJuVGV4dCkgeworCQlTdWJTdHJpbmdTZWFyY2goU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCQlzdXBlcihwYXR0ZXJuVGV4dCk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFJhd0NoYXJTZXF1ZW5jZSB0ZXh0KGZpbmFsIFJldkNvbW1pdCBjbWl0KSB7CisJCXByb3RlY3RlZCBSYXdDaGFyU2VxdWVuY2UgdGV4dChSZXZDb21taXQgY21pdCkgewogCQkJcmV0dXJuIHRleHRGb3IoY21pdCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL01lc3NhZ2VSZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvTWVzc2FnZVJldkZpbHRlci5qYXZhCmluZGV4IGYxZjQwNjUuLjQ4MGFhYTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvTWVzc2FnZVJldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvTWVzc2FnZVJldkZpbHRlci5qYXZhCkBAIC04MSw3ICs4MSw3IEBAIHByaXZhdGUgTWVzc2FnZVJldkZpbHRlcigpIHsKIAkJLy8gRG9uJ3QgcGVybWl0IHVzIHRvIGJlIGNyZWF0ZWQuCiAJfQogCi0Jc3RhdGljIFJhd0NoYXJTZXF1ZW5jZSB0ZXh0Rm9yKGZpbmFsIFJldkNvbW1pdCBjbWl0KSB7CisJc3RhdGljIFJhd0NoYXJTZXF1ZW5jZSB0ZXh0Rm9yKFJldkNvbW1pdCBjbWl0KSB7CiAJCWZpbmFsIGJ5dGVbXSByYXcgPSBjbWl0LmdldFJhd0J1ZmZlcigpOwogCQlmaW5hbCBpbnQgYiA9IFJhd1BhcnNlVXRpbHMuY29tbWl0TWVzc2FnZShyYXcsIDApOwogCQlpZiAoYiA8IDApCkBAIC05MCwxMyArOTAsMTMgQEAgc3RhdGljIFJhd0NoYXJTZXF1ZW5jZSB0ZXh0Rm9yKGZpbmFsIFJldkNvbW1pdCBjbWl0KSB7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGF0dGVyblNlYXJjaCBleHRlbmRzIFBhdHRlcm5NYXRjaFJldkZpbHRlciB7Ci0JCVBhdHRlcm5TZWFyY2goZmluYWwgU3RyaW5nIHBhdHRlcm5UZXh0KSB7CisJCVBhdHRlcm5TZWFyY2goU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCQlzdXBlcihwYXR0ZXJuVGV4dCwgdHJ1ZSwgdHJ1ZSwgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFCiAJCQkJCXwgUGF0dGVybi5ET1RBTEwpOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXByb3RlY3RlZCBDaGFyU2VxdWVuY2UgdGV4dChmaW5hbCBSZXZDb21taXQgY21pdCkgeworCQlwcm90ZWN0ZWQgQ2hhclNlcXVlbmNlIHRleHQoUmV2Q29tbWl0IGNtaXQpIHsKIAkJCXJldHVybiB0ZXh0Rm9yKGNtaXQpOwogCQl9CiAKQEAgLTEwNywxMiArMTA3LDEyIEBAIHB1YmxpYyBSZXZGaWx0ZXIgY2xvbmUoKSB7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3ViU3RyaW5nU2VhcmNoIGV4dGVuZHMgU3ViU3RyaW5nUmV2RmlsdGVyIHsKLQkJU3ViU3RyaW5nU2VhcmNoKGZpbmFsIFN0cmluZyBwYXR0ZXJuVGV4dCkgeworCQlTdWJTdHJpbmdTZWFyY2goU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCQlzdXBlcihwYXR0ZXJuVGV4dCk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIFJhd0NoYXJTZXF1ZW5jZSB0ZXh0KGZpbmFsIFJldkNvbW1pdCBjbWl0KSB7CisJCXByb3RlY3RlZCBSYXdDaGFyU2VxdWVuY2UgdGV4dChSZXZDb21taXQgY21pdCkgewogCQkJcmV0dXJuIHRleHRGb3IoY21pdCk7CiAJCX0KIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL05vdFJldkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9Ob3RSZXZGaWx0ZXIuamF2YQppbmRleCA4NGI3ZjZiLi42OWRlYzU2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL05vdFJldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvTm90UmV2RmlsdGVyLmphdmEKQEAgLTYxLDEzICs2MSwxMyBAQCBwdWJsaWMgY2xhc3MgTm90UmV2RmlsdGVyIGV4dGVuZHMgUmV2RmlsdGVyIHsKIAkgKiAgICAgICAgICAgIGZpbHRlciB0byBuZWdhdGUuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IGRvZXMgdGhlIHJldmVyc2Ugb2YgPGNvZGU+YTwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIFJldkZpbHRlciBhKSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKFJldkZpbHRlciBhKSB7CiAJCXJldHVybiBuZXcgTm90UmV2RmlsdGVyKGEpOwogCX0KIAogCXByaXZhdGUgZmluYWwgUmV2RmlsdGVyIGE7CiAKLQlwcml2YXRlIE5vdFJldkZpbHRlcihmaW5hbCBSZXZGaWx0ZXIgb25lKSB7CisJcHJpdmF0ZSBOb3RSZXZGaWx0ZXIoUmV2RmlsdGVyIG9uZSkgewogCQlhID0gb25lOwogCX0KIApAQCAtNzksNyArNzksNyBAQCBwdWJsaWMgUmV2RmlsdGVyIG5lZ2F0ZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpCisJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uIHsKIAkJcmV0dXJuICFhLmluY2x1ZGUod2Fsa2VyLCBjKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvT3JSZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvT3JSZXZGaWx0ZXIuamF2YQppbmRleCBhMTQ3NjRhLi4xY2VmMTJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL09yUmV2RmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9PclJldkZpbHRlci5qYXZhCkBAIC03Miw3ICs3Miw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBPclJldkZpbHRlciBleHRlbmRzIFJldkZpbHRlciB7CiAJICogICAgICAgICAgICBzZWNvbmQgZmlsdGVyIHRvIHRlc3QuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYXQgbGVhc3Qgb25lIGlucHV0IGZpbHRlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBjcmVhdGUoZmluYWwgUmV2RmlsdGVyIGEsIGZpbmFsIFJldkZpbHRlciBiKSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKFJldkZpbHRlciBhLCBSZXZGaWx0ZXIgYikgewogCQlpZiAoYSA9PSBBTEwgfHwgYiA9PSBBTEwpCiAJCQlyZXR1cm4gQUxMOwogCQlyZXR1cm4gbmV3IEJpbmFyeShhLCBiKTsKQEAgLTg2LDcgKzg2LDcgQEAgcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIFJldkZpbHRlciBhLCBmaW5hbCBSZXZGaWx0ZXIgYikgewogCSAqICAgICAgICAgICAgZmlsdGVycy4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsdGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShmaW5hbCBSZXZGaWx0ZXJbXSBsaXN0KSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKFJldkZpbHRlcltdIGxpc3QpIHsKIAkJaWYgKGxpc3QubGVuZ3RoID09IDIpCiAJCQlyZXR1cm4gY3JlYXRlKGxpc3RbMF0sIGxpc3RbMV0pOwogCQlpZiAobGlzdC5sZW5ndGggPCAyKQpAQCAtMTA0LDcgKzEwNCw3IEBAIHB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGNyZWF0ZShmaW5hbCBSZXZGaWx0ZXJbXSBsaXN0KSB7CiAJICogICAgICAgICAgICBmaWx0ZXJzLgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWx0ZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKGZpbmFsIENvbGxlY3Rpb248UmV2RmlsdGVyPiBsaXN0KSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgY3JlYXRlKENvbGxlY3Rpb248UmV2RmlsdGVyPiBsaXN0KSB7CiAJCWlmIChsaXN0LnNpemUoKSA8IDIpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmF0TGVhc3RUd29GaWx0ZXJzTmVlZGVkKTsKIAkJZmluYWwgUmV2RmlsdGVyW10gc3ViZmlsdGVycyA9IG5ldyBSZXZGaWx0ZXJbbGlzdC5zaXplKCldOwpAQCAtMTIxLDcgKzEyMSw3IEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIEJpbmFyeSBleHRlbmRzIE9yUmV2RmlsdGVyIHsKIAogCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVxdWlyZXNDb21taXRCb2R5OwogCi0JCUJpbmFyeShmaW5hbCBSZXZGaWx0ZXIgb25lLCBmaW5hbCBSZXZGaWx0ZXIgdHdvKSB7CisJCUJpbmFyeShSZXZGaWx0ZXIgb25lLCBSZXZGaWx0ZXIgdHdvKSB7CiAJCQlhID0gb25lOwogCQkJYiA9IHR3bzsKIAkJCXJlcXVpcmVzQ29tbWl0Qm9keSA9IGEucmVxdWlyZXNDb21taXRCb2R5KCkKQEAgLTEyOSw3ICsxMjksNyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaW5hcnkgZXh0ZW5kcyBPclJldkZpbHRlciB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBhLmluY2x1ZGUod2Fsa2VyLCBjKSB8fCBiLmluY2x1ZGUod2Fsa2VyLCBjKTsKQEAgLTE1Nyw3ICsxNTcsNyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBMaXN0IGV4dGVuZHMgT3JSZXZGaWx0ZXIgewogCiAJCXByaXZhdGUgZmluYWwgYm9vbGVhbiByZXF1aXJlc0NvbW1pdEJvZHk7CiAKLQkJTGlzdChmaW5hbCBSZXZGaWx0ZXJbXSBsaXN0KSB7CisJCUxpc3QoUmV2RmlsdGVyW10gbGlzdCkgewogCQkJc3ViZmlsdGVycyA9IGxpc3Q7CiAKIAkJCWJvb2xlYW4gcmNiID0gZmFsc2U7CkBAIC0xNjcsMTAgKzE2NywxMCBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBMaXN0IGV4dGVuZHMgT3JSZXZGaWx0ZXIgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7Ci0JCQlmb3IgKGZpbmFsIFJldkZpbHRlciBmIDogc3ViZmlsdGVycykgeworCQkJZm9yIChSZXZGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpIHsKIAkJCQlpZiAoZi5pbmNsdWRlKHdhbGtlciwgYykpCiAJCQkJCXJldHVybiB0cnVlOwogCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9QYXR0ZXJuTWF0Y2hSZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvUGF0dGVybk1hdGNoUmV2RmlsdGVyLmphdmEKaW5kZXggZWRjZTIyNC4uNGY0MWVkZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9QYXR0ZXJuTWF0Y2hSZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1BhdHRlcm5NYXRjaFJldkZpbHRlci5qYXZhCkBAIC03Miw3ICs3Miw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBQYXR0ZXJuTWF0Y2hSZXZGaWx0ZXIgZXh0ZW5kcyBSZXZGaWx0ZXIgewogCSAqIEByZXR1cm4gc2FtZSBwYXR0ZXJuLCBidXQgcmUtZW5jb2RlZCB0byBtYXRjaCBvdXIgZnVubnkgcmF3IFVURi04CiAJICogICAgICAgICBjaGFyYWN0ZXIgc2VxdWVuY2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5SYXdDaGFyU2VxdWVuY2V9LgogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGZvcmNlVG9SYXcoZmluYWwgU3RyaW5nIHBhdHRlcm5UZXh0KSB7CisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgZm9yY2VUb1JhdyhTdHJpbmcgcGF0dGVyblRleHQpIHsKIAkJZmluYWwgYnl0ZVtdIGIgPSBDb25zdGFudHMuZW5jb2RlKHBhdHRlcm5UZXh0KTsKIAkJZmluYWwgU3RyaW5nQnVpbGRlciBuZWVkbGUgPSBuZXcgU3RyaW5nQnVpbGRlcihiLmxlbmd0aCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgYi5sZW5ndGg7IGkrKykKQEAgLTEyOCw3ICsxMjgsNyBAQCBwdWJsaWMgU3RyaW5nIHBhdHRlcm4oKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjbWl0KQorCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjbWl0KQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBjb21waWxlZFBhdHRlcm4ucmVzZXQodGV4dChjbWl0KSkubWF0Y2hlcygpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9SZXZGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvUmV2RmlsdGVyLmphdmEKaW5kZXggOTA2OGM1Ny4uMzlmMGQ2MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9SZXZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1JldkZpbHRlci5qYXZhCkBAIC0xMDMsNyArMTAzLDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIFJldkZpbHRlciB7CiAKIAlwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBbGxGaWx0ZXIgZXh0ZW5kcyBSZXZGaWx0ZXIgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpIHsKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpIHsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAKQEAgLTEyOCw3ICsxMjgsNyBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTm9uZUZpbHRlciBleHRlbmRzIFJldkZpbHRlciB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykgeworCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFJldldhbGsgd2Fsa2VyLCBSZXZDb21taXQgYykgewogCQkJcmV0dXJuIGZhbHNlOwogCQl9CiAKQEAgLTE4NCw3ICsxODQsNyBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTm9NZXJnZXNGaWx0ZXIgZXh0ZW5kcyBSZXZGaWx0ZXIgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpIHsKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpIHsKIAkJCXJldHVybiBjLmdldFBhcmVudENvdW50KCkgPCAyOwogCQl9CiAKQEAgLTIxNiw3ICsyMTYsNyBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTWVyZ2VCYXNlRmlsdGVyIGV4dGVuZHMgUmV2RmlsdGVyIHsKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjKSB7CisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKSB7CiAJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuY2Fubm90QmVDb21iaW5lZCk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9SZXZGbGFnRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1JldkZsYWdGaWx0ZXIuamF2YQppbmRleCA4MjI1ZTRkLi5jNjdjNDRiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1JldkZsYWdGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1JldkZsYWdGaWx0ZXIuamF2YQpAQCAtNjMsNyArNjMsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmV2RmxhZ0ZpbHRlciBleHRlbmRzIFJldkZpbHRlciB7CiAJICogICAgICAgICAgICB0aGUgZmxhZyB0byB0ZXN0LgogCSAqIEByZXR1cm4gZmlsdGVyIHRoYXQgc2VsZWN0cyBvbmx5IGNvbW1pdHMgd2l0aCBmbGFnIDxjb2RlPmE8L2NvZGU+LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhcyhmaW5hbCBSZXZGbGFnIGEpIHsKKwlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXMoUmV2RmxhZyBhKSB7CiAJCWZpbmFsIFJldkZsYWdTZXQgcyA9IG5ldyBSZXZGbGFnU2V0KCk7CiAJCXMuYWRkKGEpOwogCQlyZXR1cm4gbmV3IEhhc0FsbChzKTsKQEAgLTc2LDkgKzc2LDkgQEAgcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzKGZpbmFsIFJldkZsYWcgYSkgewogCSAqICAgICAgICAgICAgc2V0IG9mIGZsYWdzIHRvIHRlc3QuCiAJICogQHJldHVybiBmaWx0ZXIgdGhhdCBzZWxlY3RzIG9ubHkgY29tbWl0cyB3aXRoIGFsbCBmbGFncyBpbiA8Y29kZT5hPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXNBbGwoZmluYWwgUmV2RmxhZy4uLiBhKSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzQWxsKFJldkZsYWcuLi4gYSkgewogCQlmaW5hbCBSZXZGbGFnU2V0IHNldCA9IG5ldyBSZXZGbGFnU2V0KCk7Ci0JCWZvciAoZmluYWwgUmV2RmxhZyBmbGFnIDogYSkKKwkJZm9yIChSZXZGbGFnIGZsYWcgOiBhKQogCQkJc2V0LmFkZChmbGFnKTsKIAkJcmV0dXJuIG5ldyBIYXNBbGwoc2V0KTsKIAl9CkBAIC05MCw3ICs5MCw3IEBAIHB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhc0FsbChmaW5hbCBSZXZGbGFnLi4uIGEpIHsKIAkgKiAgICAgICAgICAgIHNldCBvZiBmbGFncyB0byB0ZXN0LgogCSAqIEByZXR1cm4gZmlsdGVyIHRoYXQgc2VsZWN0cyBvbmx5IGNvbW1pdHMgd2l0aCBhbGwgZmxhZ3MgaW4gPGNvZGU+YTwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzQWxsKGZpbmFsIFJldkZsYWdTZXQgYSkgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhc0FsbChSZXZGbGFnU2V0IGEpIHsKIAkJcmV0dXJuIG5ldyBIYXNBbGwobmV3IFJldkZsYWdTZXQoYSkpOwogCX0KIApAQCAtMTAxLDkgKzEwMSw5IEBAIHB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhc0FsbChmaW5hbCBSZXZGbGFnU2V0IGEpIHsKIAkgKiAgICAgICAgICAgIHNldCBvZiBmbGFncyB0byB0ZXN0LgogCSAqIEByZXR1cm4gZmlsdGVyIHRoYXQgc2VsZWN0cyBvbmx5IGNvbW1pdHMgd2l0aCBhbnkgZmxhZyBpbiA8Y29kZT5hPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXNBbnkoZmluYWwgUmV2RmxhZy4uLiBhKSB7CisJcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzQW55KFJldkZsYWcuLi4gYSkgewogCQlmaW5hbCBSZXZGbGFnU2V0IHNldCA9IG5ldyBSZXZGbGFnU2V0KCk7Ci0JCWZvciAoZmluYWwgUmV2RmxhZyBmbGFnIDogYSkKKwkJZm9yIChSZXZGbGFnIGZsYWcgOiBhKQogCQkJc2V0LmFkZChmbGFnKTsKIAkJcmV0dXJuIG5ldyBIYXNBbnkoc2V0KTsKIAl9CkBAIC0xMTUsMTMgKzExNSwxMyBAQCBwdWJsaWMgc3RhdGljIFJldkZpbHRlciBoYXNBbnkoZmluYWwgUmV2RmxhZy4uLiBhKSB7CiAJICogICAgICAgICAgICBzZXQgb2YgZmxhZ3MgdG8gdGVzdC4KIAkgKiBAcmV0dXJuIGZpbHRlciB0aGF0IHNlbGVjdHMgb25seSBjb21taXRzIHdpdGggYW55IGZsYWcgaW4gPGNvZGU+YTwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBSZXZGaWx0ZXIgaGFzQW55KGZpbmFsIFJldkZsYWdTZXQgYSkgeworCXB1YmxpYyBzdGF0aWMgUmV2RmlsdGVyIGhhc0FueShSZXZGbGFnU2V0IGEpIHsKIAkJcmV0dXJuIG5ldyBIYXNBbnkobmV3IFJldkZsYWdTZXQoYSkpOwogCX0KIAogCWZpbmFsIFJldkZsYWdTZXQgZmxhZ3M7CiAKLQlSZXZGbGFnRmlsdGVyKGZpbmFsIFJldkZsYWdTZXQgbSkgeworCVJldkZsYWdGaWx0ZXIoUmV2RmxhZ1NldCBtKSB7CiAJCWZsYWdzID0gbTsKIAl9CiAKQEAgLTEzOCwxMiArMTM4LDEyIEBAIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGFzQWxsIGV4dGVuZHMgUmV2RmxhZ0ZpbHRlciB7Ci0JCUhhc0FsbChmaW5hbCBSZXZGbGFnU2V0IG0pIHsKKwkJSGFzQWxsKFJldkZsYWdTZXQgbSkgewogCQkJc3VwZXIobSk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBjLmhhc0FsbChmbGFncyk7CkBAIC0xNTYsMTIgKzE1NiwxMiBAQCBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0NvbW1pdEJvZHkoKSB7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGFzQW55IGV4dGVuZHMgUmV2RmxhZ0ZpbHRlciB7Ci0JCUhhc0FueShmaW5hbCBSZXZGbGFnU2V0IG0pIHsKKwkJSGFzQW55KFJldkZsYWdTZXQgbSkgewogCQkJc3VwZXIobSk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBSZXZXYWxrIHdhbGtlciwgZmluYWwgUmV2Q29tbWl0IGMpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBjLmhhc0FueShmbGFncyk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1N1YlN0cmluZ1JldkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9yZXZ3YWxrL2ZpbHRlci9TdWJTdHJpbmdSZXZGaWx0ZXIuamF2YQppbmRleCAzZTZiMTQ4Li41NDY1MGRhIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3JldndhbGsvZmlsdGVyL1N1YlN0cmluZ1JldkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvcmV2d2Fsay9maWx0ZXIvU3ViU3RyaW5nUmV2RmlsdGVyLmphdmEKQEAgLTY1LDcgKzY1LDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIFN1YlN0cmluZ1JldkZpbHRlciBleHRlbmRzIFJldkZpbHRlciB7CiAJICogICAgICAgICBpZiB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC5yZXZ3YWxrLmZpbHRlci5QYXR0ZXJuTWF0Y2hSZXZGaWx0ZXJ9CiAJICogICAgICAgICBtdXN0IGJlIHVzZWQgaW5zdGVhZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2FmZShmaW5hbCBTdHJpbmcgcGF0dGVybikgeworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYWZlKFN0cmluZyBwYXR0ZXJuKSB7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0dGVybi5sZW5ndGgoKTsgaSsrKSB7CiAJCQlmaW5hbCBjaGFyIGMgPSBwYXR0ZXJuLmNoYXJBdChpKTsKIAkJCXN3aXRjaCAoYykgewpAQCAtOTYsMTMgKzk2LDEzIEBAIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBzYWZlKGZpbmFsIFN0cmluZyBwYXR0ZXJuKSB7CiAJICogICAgICAgICAgICB0aGUge0BsaW5rICNzYWZlKFN0cmluZyl9IGFzIHJlZ3VsYXIgZXhwcmVzc2lvbiBtZXRhCiAJICogICAgICAgICAgICBjaGFyYWN0ZXJzIGFyZSB0cmVhdGVkIGFzIGxpdGVyYWxzLgogCSAqLwotCXByb3RlY3RlZCBTdWJTdHJpbmdSZXZGaWx0ZXIoZmluYWwgU3RyaW5nIHBhdHRlcm5UZXh0KSB7CisJcHJvdGVjdGVkIFN1YlN0cmluZ1JldkZpbHRlcihTdHJpbmcgcGF0dGVyblRleHQpIHsKIAkJcGF0dGVybiA9IG5ldyBSYXdTdWJTdHJpbmdQYXR0ZXJuKHBhdHRlcm5UZXh0KTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgUmV2V2FsayB3YWxrZXIsIGZpbmFsIFJldkNvbW1pdCBjbWl0KQorCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoUmV2V2FsayB3YWxrZXIsIFJldkNvbW1pdCBjbWl0KQogCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQlJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBwYXR0ZXJuLm1hdGNoKHRleHQoY21pdCkpID49IDA7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9GaWxlQmFzZWRDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZy5qYXZhCmluZGV4IDNmMDY0ZTMuLjRiMjcyYmEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL0ZpbGVCYXNlZENvbmZpZy5qYXZhCkBAIC00OSw2ICs0OSw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC5zdG9yYWdlLmZpbGU7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CisKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CkBAIC0xNjQsOCArMTY2LDggQEAgcHVibGljIHZvaWQgbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29uZmlnSW52YWxpZEV4Y2VwdGlvbiB7CiAJCQkJfSBlbHNlIHsKIAkJCQkJZmluYWwgU3RyaW5nIGRlY29kZWQ7CiAJCQkJCWlmIChpc1V0ZjgoaW4pKSB7Ci0JCQkJCQlkZWNvZGVkID0gUmF3UGFyc2VVdGlscy5kZWNvZGUoCi0JCQkJCQkJCVJhd1BhcnNlVXRpbHMuVVRGOF9DSEFSU0VULCBpbiwgMywgaW4ubGVuZ3RoKTsKKwkJCQkJCWRlY29kZWQgPSBSYXdQYXJzZVV0aWxzLmRlY29kZShDSEFSU0VULAorCQkJCQkJCQlpbiwgMywgaW4ubGVuZ3RoKTsKIAkJCQkJCXV0ZjhCb20gPSB0cnVlOwogCQkJCQl9IGVsc2UgewogCQkJCQkJZGVjb2RlZCA9IFJhd1BhcnNlVXRpbHMuZGVjb2RlKGluKTsKQEAgLTIyMiw3ICsyMjQsNyBAQCBwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWJvcy53cml0ZSgweEVGKTsKIAkJCWJvcy53cml0ZSgweEJCKTsKIAkJCWJvcy53cml0ZSgweEJGKTsKLQkJCWJvcy53cml0ZSh0ZXh0LmdldEJ5dGVzKFJhd1BhcnNlVXRpbHMuVVRGOF9DSEFSU0VULm5hbWUoKSkpOworCQkJYm9zLndyaXRlKHRleHQuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQkJb3V0ID0gYm9zLnRvQnl0ZUFycmF5KCk7CiAJCX0gZWxzZSB7CiAJCQlvdXQgPSBDb25zdGFudHMuZW5jb2RlKHRleHQpOwpAQCAtMjUyLDcgKzI1NCw3IEBAIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogCQlzdXBlci5jbGVhcigpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIE9iamVjdElkIGhhc2goZmluYWwgYnl0ZVtdIHJhd1RleHQpIHsKKwlwcml2YXRlIHN0YXRpYyBPYmplY3RJZCBoYXNoKGJ5dGVbXSByYXdUZXh0KSB7CiAJCXJldHVybiBPYmplY3RJZC5mcm9tUmF3KENvbnN0YW50cy5uZXdNZXNzYWdlRGlnZXN0KCkuZGlnZXN0KHJhd1RleHQpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvZmlsZS9XaW5kb3dDYWNoZUNvbmZpZy5qYXZhCmluZGV4IDE5ZmM2M2UuLmMyZTZhNDIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9maWxlL1dpbmRvd0NhY2hlQ29uZmlnLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL2ZpbGUvV2luZG93Q2FjaGVDb25maWcuamF2YQpAQCAtOTgsNyArOTgsNyBAQCBwdWJsaWMgaW50IGdldFBhY2tlZEdpdE9wZW5GaWxlcygpIHsKIAkgKiAgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIHN0cmVhbXMgdG8gb3BlbiBhdCBhIHRpbWUuIE9wZW4gcGFja3MgY291bnQKIAkgKiAgICAgICAgICAgIGFnYWluc3QgdGhlIHByb2Nlc3MgbGltaXRzCiAJICovCi0JcHVibGljIHZvaWQgc2V0UGFja2VkR2l0T3BlbkZpbGVzKGZpbmFsIGludCBmZExpbWl0KSB7CisJcHVibGljIHZvaWQgc2V0UGFja2VkR2l0T3BlbkZpbGVzKGludCBmZExpbWl0KSB7CiAJCXBhY2tlZEdpdE9wZW5GaWxlcyA9IGZkTGltaXQ7CiAJfQogCkBAIC0xMjEsNyArMTIxLDcgQEAgcHVibGljIGxvbmcgZ2V0UGFja2VkR2l0TGltaXQoKSB7CiAJICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBieXRlcyBvZiBoZWFwIG1lbW9yeSB0byBkZWRpY2F0ZSB0byBjYWNoaW5nCiAJICogICAgICAgICAgICBwYWNrIGZpbGUgZGF0YS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWNrZWRHaXRMaW1pdChmaW5hbCBsb25nIG5ld0xpbWl0KSB7CisJcHVibGljIHZvaWQgc2V0UGFja2VkR2l0TGltaXQobG9uZyBuZXdMaW1pdCkgewogCQlwYWNrZWRHaXRMaW1pdCA9IG5ld0xpbWl0OwogCX0KIApAQCAtMTQyLDcgKzE0Miw3IEBAIHB1YmxpYyBpbnQgZ2V0UGFja2VkR2l0V2luZG93U2l6ZSgpIHsKIAkgKiBAcGFyYW0gbmV3U2l6ZQogCSAqICAgICAgICAgICAgc2l6ZSBpbiBieXRlcyBvZiBhIHNpbmdsZSB3aW5kb3cgcmVhZCBpbiBmcm9tIHRoZSBwYWNrIGZpbGUuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UGFja2VkR2l0V2luZG93U2l6ZShmaW5hbCBpbnQgbmV3U2l6ZSkgeworCXB1YmxpYyB2b2lkIHNldFBhY2tlZEdpdFdpbmRvd1NpemUoaW50IG5ld1NpemUpIHsKIAkJcGFja2VkR2l0V2luZG93U2l6ZSA9IG5ld1NpemU7CiAJfQogCkBAIC0xNjUsNyArMTY1LDcgQEAgcHVibGljIGJvb2xlYW4gaXNQYWNrZWRHaXRNTUFQKCkgewogCSAqICAgICAgICAgICAgZm9yIHdpbmRvd3M7IGZhbHNlIHJlYWRzIGVudGlyZSB3aW5kb3cgaW50byBhIGJ5dGVbXSB3aXRoCiAJICogICAgICAgICAgICBzdGFuZGFyZCByZWFkIGNhbGxzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhY2tlZEdpdE1NQVAoZmluYWwgYm9vbGVhbiB1c2VtbWFwKSB7CisJcHVibGljIHZvaWQgc2V0UGFja2VkR2l0TU1BUChib29sZWFuIHVzZW1tYXApIHsKIAkJcGFja2VkR2l0TU1BUCA9IHVzZW1tYXA7CiAJfQogCkBAIC0xODksNyArMTg5LDcgQEAgcHVibGljIGludCBnZXREZWx0YUJhc2VDYWNoZUxpbWl0KCkgewogCSAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gY2FjaGUgaW4gZGVsdGEgYmFzZSBjYWNoZSBmb3IKIAkgKiAgICAgICAgICAgIGluZmxhdGVkLCByZWNlbnRseSBhY2Nlc3NlZCBvYmplY3RzLCB3aXRob3V0IGRlbHRhIGNoYWlucy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWx0YUJhc2VDYWNoZUxpbWl0KGZpbmFsIGludCBuZXdMaW1pdCkgeworCXB1YmxpYyB2b2lkIHNldERlbHRhQmFzZUNhY2hlTGltaXQoaW50IG5ld0xpbWl0KSB7CiAJCWRlbHRhQmFzZUNhY2hlTGltaXQgPSBuZXdMaW1pdDsKIAl9CiAKQEAgLTIxMSw3ICsyMTEsNyBAQCBwdWJsaWMgaW50IGdldFN0cmVhbUZpbGVUaHJlc2hvbGQoKSB7CiAJICogICAgICAgICAgICBhcnJheSwgd2hpbGUgb2JqZWN0cyBiaWdnZXIgdGhhbiB0aGlzIHNpemUgcmVxdWlyZSB1c2luZyBhbgogCSAqICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLk9iamVjdFN0cmVhbX0uCiAJICovCi0JcHVibGljIHZvaWQgc2V0U3RyZWFtRmlsZVRocmVzaG9sZChmaW5hbCBpbnQgbmV3TGltaXQpIHsKKwlwdWJsaWMgdm9pZCBzZXRTdHJlYW1GaWxlVGhyZXNob2xkKGludCBuZXdMaW1pdCkgewogCQlzdHJlYW1GaWxlVGhyZXNob2xkID0gbmV3TGltaXQ7CiAJfQogCkBAIC0yMjYsNyArMjI2LDcgQEAgcHVibGljIHZvaWQgc2V0U3RyZWFtRmlsZVRocmVzaG9sZChmaW5hbCBpbnQgbmV3TGltaXQpIHsKIAkgKiBAcmV0dXJuIHtAY29kZSB0aGlzfS4KIAkgKiBAc2luY2UgMy4wCiAJICovCi0JcHVibGljIFdpbmRvd0NhY2hlQ29uZmlnIGZyb21Db25maWcoZmluYWwgQ29uZmlnIHJjKSB7CisJcHVibGljIFdpbmRvd0NhY2hlQ29uZmlnIGZyb21Db25maWcoQ29uZmlnIHJjKSB7CiAJCXNldFBhY2tlZEdpdE9wZW5GaWxlcyhyYy5nZXRJbnQoCiAJCQkJImNvcmUiLCBudWxsLCAicGFja2VkZ2l0b3BlbmZpbGVzIiwgZ2V0UGFja2VkR2l0T3BlbkZpbGVzKCkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCXNldFBhY2tlZEdpdExpbWl0KHJjLmdldExvbmcoCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvcGFjay9QYWNrQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N0b3JhZ2UvcGFjay9QYWNrQ29uZmlnLmphdmEKaW5kZXggNDg0Y2RlMi4uMjU2ZTQxZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdG9yYWdlL3BhY2svUGFja0NvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3RvcmFnZS9wYWNrL1BhY2tDb25maWcuamF2YQpAQCAtMTAzOSw3ICsxMDM5LDcgQEAgcHVibGljIHZvaWQgc2V0Qml0bWFwSW5hY3RpdmVCcmFuY2hBZ2VJbkRheXMoaW50IGFnZUluRGF5cykgewogCSAqIEBwYXJhbSByYwogCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbiB0byByZWFkIHByb3BlcnRpZXMgZnJvbS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBmcm9tQ29uZmlnKGZpbmFsIENvbmZpZyByYykgeworCXB1YmxpYyB2b2lkIGZyb21Db25maWcoQ29uZmlnIHJjKSB7CiAJCXNldE1heERlbHRhRGVwdGgocmMuZ2V0SW50KCJwYWNrIiwgImRlcHRoIiwgZ2V0TWF4RGVsdGFEZXB0aCgpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQlzZXREZWx0YVNlYXJjaFdpbmRvd1NpemUocmMuZ2V0SW50KAogCQkJCSJwYWNrIiwgIndpbmRvdyIsIGdldERlbHRhU2VhcmNoV2luZG93U2l6ZSgpKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlV2Fsay5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC9zdWJtb2R1bGUvU3VibW9kdWxlV2Fsay5qYXZhCmluZGV4IDIzMTRjZjEuLmNlODk5NWEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvc3VibW9kdWxlL1N1Ym1vZHVsZVdhbGsuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3N1Ym1vZHVsZS9TdWJtb2R1bGVXYWxrLmphdmEKQEAgLTExNSwxMSArMTE1LDEzIEBAIHB1YmxpYyBlbnVtIElnbm9yZVN1Ym1vZHVsZU1vZGUgewogCSAqCiAJICogQHBhcmFtIHJlcG9zaXRvcnkKIAkgKiAgICAgICAgICAgIGEge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnl9IG9iamVjdC4KLQkgKiBAcmV0dXJuIGdlbmVyYXRvciBvdmVyIHN1Ym1vZHVsZSBpbmRleCBlbnRyaWVzCisJICogQHJldHVybiBnZW5lcmF0b3Igb3ZlciBzdWJtb2R1bGUgaW5kZXggZW50cmllcy4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZQorCSAqICAgICAgICAgZm9yIGNhbGxpbmcge0BsaW5rICNjbG9zZSgpfS4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KIAlwdWJsaWMgc3RhdGljIFN1Ym1vZHVsZVdhbGsgZm9ySW5kZXgoUmVwb3NpdG9yeSByZXBvc2l0b3J5KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gVGhlIGNhbGxlciBjbG9zZXMgaXQKIAkJU3VibW9kdWxlV2FsayBnZW5lcmF0b3IgPSBuZXcgU3VibW9kdWxlV2FsayhyZXBvc2l0b3J5KTsKIAkJdHJ5IHsKIAkJCURpckNhY2hlIGluZGV4ID0gcmVwb3NpdG9yeS5yZWFkRGlyQ2FjaGUoKTsKQEAgLTM2OSw3ICszNzEsNyBAQCBlbHNlIGlmIChzdWJtb2R1bGVVcmwuc3RhcnRzV2l0aCgiLi4vIikpIHsgLy8kTk9OLU5MUy0xJAogCSAqICAgICAgICAgICAgdGhlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZXBvc2l0b3J5fS4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KLQlwdWJsaWMgU3VibW9kdWxlV2FsayhmaW5hbCBSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIFN1Ym1vZHVsZVdhbGsoUmVwb3NpdG9yeSByZXBvc2l0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0aGlzLnJlcG9zaXRvcnkgPSByZXBvc2l0b3J5OwogCQlyZXBvQ29uZmlnID0gcmVwb3NpdG9yeS5nZXRDb25maWcoKTsKIAkJd2FsayA9IG5ldyBUcmVlV2FsayhyZXBvc2l0b3J5KTsKQEAgLTM4Niw3ICszODgsNyBAQCBwdWJsaWMgU3VibW9kdWxlV2FsayhmaW5hbCBSZXBvc2l0b3J5IHJlcG9zaXRvcnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICAuZ2l0bW9kdWxlcyBjb25maWcgb2JqZWN0CiAJICogQHJldHVybiB0aGlzIGdlbmVyYXRvcgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldE1vZHVsZXNDb25maWcoZmluYWwgQ29uZmlnIGNvbmZpZykgeworCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldE1vZHVsZXNDb25maWcoQ29uZmlnIGNvbmZpZykgewogCQltb2R1bGVzQ29uZmlnID0gY29uZmlnOwogCQlsb2FkUGF0aE5hbWVzKCk7CiAJCXJldHVybiB0aGlzOwpAQCAtNDA1LDcgKzQwNyw3IEBAIHB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldE1vZHVsZXNDb25maWcoZmluYWwgQ29uZmlnIGNvbmZpZykgewogCSAqICAgICAgICAgICAgdHJlZSBjb250YWluaW5nIC5naXRtb2R1bGVzCiAJICogQHJldHVybiB0aGlzIGdlbmVyYXRvcgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldFJvb3RUcmVlKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHRyZWUpIHsKKwlwdWJsaWMgU3VibW9kdWxlV2FsayBzZXRSb290VHJlZShBYnN0cmFjdFRyZWVJdGVyYXRvciB0cmVlKSB7CiAJCXJvb3RUcmVlID0gdHJlZTsKIAkJbW9kdWxlc0NvbmZpZyA9IG51bGw7CiAJCXBhdGhUb05hbWUgPSBudWxsOwpAQCAtNDI2LDcgKzQyOCw3IEBAIHB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldFJvb3RUcmVlKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHRyZWUpIHsKIAkgKiBAcmV0dXJuIHRoaXMgZ2VuZXJhdG9yCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0Um9vdFRyZWUoZmluYWwgQW55T2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0Um9vdFRyZWUoQW55T2JqZWN0SWQgaWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIENhbm9uaWNhbFRyZWVQYXJzZXIgcCA9IG5ldyBDYW5vbmljYWxUcmVlUGFyc2VyKCk7CiAJCXAucmVzZXQod2Fsay5nZXRPYmplY3RSZWFkZXIoKSwgaWQpOwogCQlyb290VHJlZSA9IHA7CkBAIC01NjAsNyArNTYyLDcgQEAgcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0RmlsdGVyKFRyZWVGaWx0ZXIgZmlsdGVyKSB7CiAJICogQHJldHVybiB0aGlzIGdlbmVyYXRvcgogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29ycnVwdE9iamVjdEV4Y2VwdGlvbgogCSAqLwotCXB1YmxpYyBTdWJtb2R1bGVXYWxrIHNldFRyZWUoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgaXRlcmF0b3IpCisJcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0VHJlZShBYnN0cmFjdFRyZWVJdGVyYXRvciBpdGVyYXRvcikKIAkJCXRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKIAkJd2Fsay5hZGRUcmVlKGl0ZXJhdG9yKTsKIAkJcmV0dXJuIHRoaXM7CkBAIC01NzgsNyArNTgwLDcgQEAgcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0VHJlZShmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBpdGVyYXRvcikKIAkgKiBAdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBpZiBhbnkuCiAJICovCi0JcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0VHJlZShmaW5hbCBBbnlPYmplY3RJZCB0cmVlSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIFN1Ym1vZHVsZVdhbGsgc2V0VHJlZShBbnlPYmplY3RJZCB0cmVlSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdhbGsuYWRkVHJlZSh0cmVlSWQpOwogCQlyZXR1cm4gdGhpczsKIAl9CkBAIC03NTQsMTMgKzc1NiwxMSBAQCBwdWJsaWMgUmVwb3NpdG9yeSBnZXRSZXBvc2l0b3J5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KIAlwdWJsaWMgT2JqZWN0SWQgZ2V0SGVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVJlcG9zaXRvcnkgc3ViUmVwbyA9IGdldFJlcG9zaXRvcnkoKTsKLQkJaWYgKHN1YlJlcG8gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQl0cnkgeworCQl0cnkgKFJlcG9zaXRvcnkgc3ViUmVwbyA9IGdldFJlcG9zaXRvcnkoKSkgeworCQkJaWYgKHN1YlJlcG8gPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQogCQkJcmV0dXJuIHN1YlJlcG8ucmVzb2x2ZShDb25zdGFudHMuSEVBRCk7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWJSZXBvLmNsb3NlKCk7CiAJCX0KIAl9CiAKQEAgLTc3MSwxNCArNzcxLDEyIEBAIHB1YmxpYyBPYmplY3RJZCBnZXRIZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKi8KIAlwdWJsaWMgU3RyaW5nIGdldEhlYWRSZWYoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZXRSZXBvc2l0b3J5KCk7Ci0JCWlmIChzdWJSZXBvID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJdHJ5IHsKKwkJdHJ5IChSZXBvc2l0b3J5IHN1YlJlcG8gPSBnZXRSZXBvc2l0b3J5KCkpIHsKKwkJCWlmIChzdWJSZXBvID09IG51bGwpIHsKKwkJCQlyZXR1cm4gbnVsbDsKKwkJCX0KIAkJCVJlZiBoZWFkID0gc3ViUmVwby5leGFjdFJlZihDb25zdGFudHMuSEVBRCk7CiAJCQlyZXR1cm4gaGVhZCAhPSBudWxsID8gaGVhZC5nZXRMZWFmKCkuZ2V0TmFtZSgpIDogbnVsbDsKLQkJfSBmaW5hbGx5IHsKLQkJCXN1YlJlcG8uY2xvc2UoKTsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQW1hem9uUzMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0FtYXpvblMzLmphdmEKaW5kZXggZDdjNWI5ZC4uYTBmYzU3YyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQW1hem9uUzMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9BbWF6b25TMy5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKQEAgLTEyOCwxNCArMTI4LDE0IEBAIHB1YmxpYyBjbGFzcyBBbWF6b25TMyB7CiAJCVNJR05FRF9IRUFERVJTLmFkZCgiZGF0ZSIpOyAvLyROT04tTkxTLTEkCiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NpZ25lZEhlYWRlcihmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTaWduZWRIZWFkZXIoU3RyaW5nIG5hbWUpIHsKIAkJZmluYWwgU3RyaW5nIG5hbWVMQyA9IFN0cmluZ1V0aWxzLnRvTG93ZXJDYXNlKG5hbWUpOwogCQlyZXR1cm4gU0lHTkVEX0hFQURFUlMuY29udGFpbnMobmFtZUxDKSB8fCBuYW1lTEMuc3RhcnRzV2l0aCgieC1hbXotIik7IC8vJE5PTi1OTFMtMSQKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9DbGVhblN0cmluZyhmaW5hbCBMaXN0PFN0cmluZz4gbGlzdCkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyB0b0NsZWFuU3RyaW5nKExpc3Q8U3RyaW5nPiBsaXN0KSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0JCWZvciAoZmluYWwgU3RyaW5nIHYgOiBsaXN0KSB7CisJCWZvciAoU3RyaW5nIHYgOiBsaXN0KSB7CiAJCQlpZiAocy5sZW5ndGgoKSA+IDApCiAJCQkJcy5hcHBlbmQoJywnKTsKIAkJCXMuYXBwZW5kKHYucmVwbGFjZUFsbCgiXG4iLCAiIikudHJpbSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCkBAIC0xNDMsNyArMTQzLDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvQ2xlYW5TdHJpbmcoZmluYWwgTGlzdDxTdHJpbmc+IGxpc3QpIHsKIAkJcmV0dXJuIHMudG9TdHJpbmcoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlKGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbSwgZmluYWwgU3RyaW5nIGspIHsKKwlwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3ZlKE1hcDxTdHJpbmcsIFN0cmluZz4gbSwgU3RyaW5nIGspIHsKIAkJZmluYWwgU3RyaW5nIHIgPSBtLnJlbW92ZShrKTsKIAkJcmV0dXJuIHIgIT0gbnVsbCA/IHIgOiAiIjsgLy8kTk9OLU5MUy0xJAogCX0KQEAgLTI4Myw3ICsyODMsNyBAQCBlbHNlIGlmIChTdHJpbmdVdGlscy5lcXVhbHNJZ25vcmVDYXNlKCJQVUJMSUNfUkVBRCIsIHBhY2wpKSAvLyROT04tTkxTLTEkCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgc2VuZGluZyB0aGUgcmVxdWVzdCB3YXMgbm90IHBvc3NpYmxlLgogCSAqLwotCXB1YmxpYyBVUkxDb25uZWN0aW9uIGdldChmaW5hbCBTdHJpbmcgYnVja2V0LCBmaW5hbCBTdHJpbmcga2V5KQorCXB1YmxpYyBVUkxDb25uZWN0aW9uIGdldChTdHJpbmcgYnVja2V0LCBTdHJpbmcga2V5KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZm9yIChpbnQgY3VyQXR0ZW1wdCA9IDA7IGN1ckF0dGVtcHQgPCBtYXhBdHRlbXB0czsgY3VyQXR0ZW1wdCsrKSB7CiAJCQlmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjID0gb3BlbigiR0VUIiwgYnVja2V0LCBrZXkpOyAvLyROT04tTkxTLTEkCkBAIC0zMTIsNyArMzEyLDcgQEAgcHVibGljIFVSTENvbm5lY3Rpb24gZ2V0KGZpbmFsIFN0cmluZyBidWNrZXQsIGZpbmFsIFN0cmluZyBrZXkpCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgZGVjcnlwdGlvbiBjb3VsZCBub3QgYmUgY29uZmlndXJlZC4KIAkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZGVjcnlwdChmaW5hbCBVUkxDb25uZWN0aW9uIHUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIElucHV0U3RyZWFtIGRlY3J5cHQoVVJMQ29ubmVjdGlvbiB1KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gZW5jcnlwdGlvbi5kZWNyeXB0KHUuZ2V0SW5wdXRTdHJlYW0oKSk7CiAJfQogCkBAIC0zMzYsNyArMzM2LDcgQEAgcHVibGljIElucHV0U3RyZWFtIGRlY3J5cHQoZmluYWwgVVJMQ29ubmVjdGlvbiB1KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgICAgIHNlbmRpbmcgdGhlIHJlcXVlc3Qgd2FzIG5vdCBwb3NzaWJsZSwgb3IgdGhlIHJlc3BvbnNlIFhNTAogCSAqICAgICAgICAgICAgIGRvY3VtZW50IGNvdWxkIG5vdCBiZSBwYXJzZWQgcHJvcGVybHkuCiAJICovCi0JcHVibGljIExpc3Q8U3RyaW5nPiBsaXN0KGZpbmFsIFN0cmluZyBidWNrZXQsIFN0cmluZyBwcmVmaXgpCisJcHVibGljIExpc3Q8U3RyaW5nPiBsaXN0KFN0cmluZyBidWNrZXQsIFN0cmluZyBwcmVmaXgpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAocHJlZml4Lmxlbmd0aCgpID4gMCAmJiAhcHJlZml4LmVuZHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKIAkJCXByZWZpeCArPSAiLyI7IC8vJE5PTi1OTFMtMSQKQEAgLTM1OSw3ICszNTksNyBAQCBwdWJsaWMgTGlzdDxTdHJpbmc+IGxpc3QoZmluYWwgU3RyaW5nIGJ1Y2tldCwgU3RyaW5nIHByZWZpeCkKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBkZWxldGlvbiBmYWlsZWQgZHVlIHRvIGNvbW11bmljYXRpb25zIGVycm9yLgogCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZShmaW5hbCBTdHJpbmcgYnVja2V0LCBmaW5hbCBTdHJpbmcga2V5KQorCXB1YmxpYyB2b2lkIGRlbGV0ZShTdHJpbmcgYnVja2V0LCBTdHJpbmcga2V5KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZm9yIChpbnQgY3VyQXR0ZW1wdCA9IDA7IGN1ckF0dGVtcHQgPCBtYXhBdHRlbXB0czsgY3VyQXR0ZW1wdCsrKSB7CiAJCQlmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjID0gb3BlbigiREVMRVRFIiwgYnVja2V0LCBrZXkpOyAvLyROT04tTkxTLTEkCkBAIC0zOTYsNyArMzk2LDcgQEAgcHVibGljIHZvaWQgZGVsZXRlKGZpbmFsIFN0cmluZyBidWNrZXQsIGZpbmFsIFN0cmluZyBrZXkpCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgY3JlYXRpb24vdXBkYXRpbmcgZmFpbGVkIGR1ZSB0byBjb21tdW5pY2F0aW9ucyBlcnJvci4KIAkgKi8KLQlwdWJsaWMgdm9pZCBwdXQoZmluYWwgU3RyaW5nIGJ1Y2tldCwgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgYnl0ZVtdIGRhdGEpCisJcHVibGljIHZvaWQgcHV0KFN0cmluZyBidWNrZXQsIFN0cmluZyBrZXksIGJ5dGVbXSBkYXRhKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGVuY3J5cHRpb24gIT0gV2Fsa0VuY3J5cHRpb24uTk9ORSkgewogCQkJLy8gV2UgaGF2ZSB0byBjb3B5IHRvIHByb2R1Y2UgdGhlIGNpcGhlciB0ZXh0IGFueXdheSBzbyB1c2UKQEAgLTUyNCwxMiArNTI0LDExIEBAIElPRXhjZXB0aW9uIGVycm9yKGZpbmFsIFN0cmluZyBhY3Rpb24sIGZpbmFsIFN0cmluZyBrZXksCiAJCQkJSkdpdFRleHQuZ2V0KCkuYW1hem9uUzNBY3Rpb25GYWlsZWQsIGFjdGlvbiwga2V5LAogCQkJCUludGVnZXIudmFsdWVPZihIdHRwU3VwcG9ydC5yZXNwb25zZShjKSksCiAJCQkJYy5nZXRSZXNwb25zZU1lc3NhZ2UoKSkpOwotCQlmaW5hbCBJbnB1dFN0cmVhbSBlcnJvclN0cmVhbSA9IGMuZ2V0RXJyb3JTdHJlYW0oKTsKLQkJaWYgKGVycm9yU3RyZWFtID09IG51bGwpIHsKKwkJaWYgKGMuZ2V0RXJyb3JTdHJlYW0oKSA9PSBudWxsKSB7CiAJCQlyZXR1cm4gZXJyOwogCQl9CiAKLQkJdHJ5IHsKKwkJdHJ5IChJbnB1dFN0cmVhbSBlcnJvclN0cmVhbSA9IGMuZ2V0RXJyb3JTdHJlYW0oKSkgewogCQkJZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAJCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbMjA0OF07CiAJCQlmb3IgKDs7KSB7CkBAIC01NDUsMTMgKzU0NCwxMSBAQCBJT0V4Y2VwdGlvbiBlcnJvcihmaW5hbCBTdHJpbmcgYWN0aW9uLCBmaW5hbCBTdHJpbmcga2V5LAogCQkJaWYgKGJ1Zi5sZW5ndGggPiAwKSB7CiAJCQkJZXJyLmluaXRDYXVzZShuZXcgSU9FeGNlcHRpb24oIlxuIiArIG5ldyBTdHJpbmcoYnVmKSkpOyAvLyROT04tTkxTLTEkCiAJCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQllcnJvclN0cmVhbS5jbG9zZSgpOwogCQl9CiAJCXJldHVybiBlcnI7CiAJfQogCi0JSU9FeGNlcHRpb24gbWF4QXR0ZW1wdHMoZmluYWwgU3RyaW5nIGFjdGlvbiwgZmluYWwgU3RyaW5nIGtleSkgeworCUlPRXhjZXB0aW9uIG1heEF0dGVtcHRzKFN0cmluZyBhY3Rpb24sIFN0cmluZyBrZXkpIHsKIAkJcmV0dXJuIG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQlKR2l0VGV4dC5nZXQoKS5hbWF6b25TM0FjdGlvbkZhaWxlZEdpdmluZ1VwLCBhY3Rpb24sIGtleSwKIAkJCQlJbnRlZ2VyLnZhbHVlT2YobWF4QXR0ZW1wdHMpKSk7CkBAIC02MDAsMTAgKzU5NywxMCBAQCBIdHRwVVJMQ29ubmVjdGlvbiBvcGVuKGZpbmFsIFN0cmluZyBtZXRob2QsIGZpbmFsIFN0cmluZyBidWNrZXQsCiAJCXJldHVybiBjOwogCX0KIAotCXZvaWQgYXV0aG9yaXplKGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCBhdXRob3JpemUoSHR0cFVSTENvbm5lY3Rpb24gYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiByZXFIZHIgPSBjLmdldFJlcXVlc3RQcm9wZXJ0aWVzKCk7CiAJCWZpbmFsIFNvcnRlZE1hcDxTdHJpbmcsIFN0cmluZz4gc2lnSGRyID0gbmV3IFRyZWVNYXA8PigpOwotCQlmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiByZXFIZHIuZW50cnlTZXQoKSkgeworCQlmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiByZXFIZHIuZW50cnlTZXQoKSkgewogCQkJZmluYWwgU3RyaW5nIGhkciA9IGVudHJ5LmdldEtleSgpOwogCQkJaWYgKGlzU2lnbmVkSGVhZGVyKGhkcikpCiAJCQkJc2lnSGRyLnB1dChTdHJpbmdVdGlscy50b0xvd2VyQ2FzZShoZHIpLCB0b0NsZWFuU3RyaW5nKGVudHJ5LmdldFZhbHVlKCkpKTsKQEAgLTYyMiw3ICs2MTksNyBAQCB2b2lkIGF1dGhvcml6ZShmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlzLmFwcGVuZChyZW1vdmUoc2lnSGRyLCAiZGF0ZSIpKTsgLy8kTk9OLU5MUy0xJAogCQlzLmFwcGVuZCgnXG4nKTsKIAotCQlmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IHNpZ0hkci5lbnRyeVNldCgpKSB7CisJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlIDogc2lnSGRyLmVudHJ5U2V0KCkpIHsKIAkJCXMuYXBwZW5kKGUuZ2V0S2V5KCkpOwogCQkJcy5hcHBlbmQoJzonKTsKIAkJCXMuYXBwZW5kKGUuZ2V0VmFsdWUoKSk7CkBAIC02MzgsNyArNjM1LDcgQEAgdm9pZCBhdXRob3JpemUoZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIE1hYyBtID0gTWFjLmdldEluc3RhbmNlKEhNQUMpOwogCQkJbS5pbml0KHByaXZhdGVLZXkpOwotCQkJc2VjID0gQmFzZTY0LmVuY29kZUJ5dGVzKG0uZG9GaW5hbChzLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoVVRGXzgpKSk7CisJCQlzZWMgPSBCYXNlNjQuZW5jb2RlQnl0ZXMobS5kb0ZpbmFsKHMudG9TdHJpbmcoKS5nZXRCeXRlcyhDSEFSU0VUKSkpOwogCQl9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLm5vSE1BQ3N1cHBvcnQsIEhNQUMsIGUuZ2V0TWVzc2FnZSgpKSk7CiAJCX0gY2F0Y2ggKEludmFsaWRLZXlFeGNlcHRpb24gZSkgewpAQCAtNjQ3LDcgKzY0NCw3IEBAIHZvaWQgYXV0aG9yaXplKGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWMuc2V0UmVxdWVzdFByb3BlcnR5KCJBdXRob3JpemF0aW9uIiwgIkFXUyAiICsgcHVibGljS2V5ICsgIjoiICsgc2VjKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKIAl9CiAKLQlzdGF0aWMgUHJvcGVydGllcyBwcm9wZXJ0aWVzKGZpbmFsIEZpbGUgYXV0aEZpbGUpCisJc3RhdGljIFByb3BlcnRpZXMgcHJvcGVydGllcyhGaWxlIGF1dGhGaWxlKQogCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlmaW5hbCBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOwogCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oYXV0aEZpbGUpKSB7CkBAIC02NjcsNyArNjY0LDcgQEAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBMaXN0UGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewogCiAJCXByaXZhdGUgU3RyaW5nQnVpbGRlciBkYXRhOwogCi0JCUxpc3RQYXJzZXIoZmluYWwgU3RyaW5nIGJuLCBmaW5hbCBTdHJpbmcgcCkgeworCQlMaXN0UGFyc2VyKFN0cmluZyBibiwgU3RyaW5nIHApIHsKIAkJCWJ1Y2tldCA9IGJuOwogCQkJcHJlZml4ID0gcDsKIAkJfQpAQCAtNzMwLDcgKzcyNyw3IEBAIHB1YmxpYyB2b2lkIGlnbm9yYWJsZVdoaXRlc3BhY2UoZmluYWwgY2hhcltdIGNoLCBmaW5hbCBpbnQgcywKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGZpbmFsIGNoYXJbXSBjaCwgZmluYWwgaW50IHMsIGZpbmFsIGludCBuKQorCQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHMsIGludCBuKQogCQkJCXRocm93cyBTQVhFeGNlcHRpb24gewogCQkJaWYgKGRhdGEgIT0gbnVsbCkKIAkJCQlkYXRhLmFwcGVuZChjaCwgcywgbik7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlQ29ubmVjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZUNvbm5lY3Rpb24uamF2YQppbmRleCBjOGQxZDIyLi5mNjA0NWY2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VDb25uZWN0aW9uLmphdmEKQEAgLTg1LDcgKzg1LDcgQEAgcHVibGljIGZpbmFsIENvbGxlY3Rpb248UmVmPiBnZXRSZWZzKCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgZmluYWwgUmVmIGdldFJlZihmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBmaW5hbCBSZWYgZ2V0UmVmKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBhZHZlcnRpc2VkUmVmcy5nZXQobmFtZSk7CiAJfQogCkBAIC0xMzIsNyArMTMyLDcgQEAgcHJvdGVjdGVkIHZvaWQgc2V0UGVlclVzZXJBZ2VudChTdHJpbmcgYWdlbnQpIHsKIAkgKiAgICAgICAgICAgIHdpbGwgYmUgd3JhcHBlZCBpbiBhbiB1bm1vZGlmaWFibGUgd2F5IHRvIHByb3RlY3QgaXQsIGJ1dCBpdAogCSAqICAgICAgICAgICAgZG9lcyBub3QgZ2V0IGNvcGllZC4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhdmFpbGFibGUoZmluYWwgTWFwPFN0cmluZywgUmVmPiBhbGwpIHsKKwlwcm90ZWN0ZWQgdm9pZCBhdmFpbGFibGUoTWFwPFN0cmluZywgUmVmPiBhbGwpIHsKIAkJYWR2ZXJ0aXNlZFJlZnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoYWxsKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrQ29ubmVjdGlvbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tDb25uZWN0aW9uLmphdmEKaW5kZXggZTkyMjdlMy4uMzhlYWUxYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tDb25uZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tDb25uZWN0aW9uLmphdmEKQEAgLTEyMiw3ICsxMjIsNyBAQCBhYnN0cmFjdCBjbGFzcyBCYXNlUGFja0Nvbm5lY3Rpb24gZXh0ZW5kcyBCYXNlQ29ubmVjdGlvbiB7CiAJLyoqIEV4dHJhIG9iamVjdHMgdGhlIHJlbW90ZSBoYXMsIGJ1dCB3aGljaCBhcmVuJ3Qgb2ZmZXJlZCBhcyByZWZzLiAqLwogCXByb3RlY3RlZCBmaW5hbCBTZXQ8T2JqZWN0SWQ+IGFkZGl0aW9uYWxIYXZlcyA9IG5ldyBIYXNoU2V0PD4oKTsKIAotCUJhc2VQYWNrQ29ubmVjdGlvbihmaW5hbCBQYWNrVHJhbnNwb3J0IHBhY2tUcmFuc3BvcnQpIHsKKwlCYXNlUGFja0Nvbm5lY3Rpb24oUGFja1RyYW5zcG9ydCBwYWNrVHJhbnNwb3J0KSB7CiAJCXRyYW5zcG9ydCA9IChUcmFuc3BvcnQpIHBhY2tUcmFuc3BvcnQ7CiAJCWxvY2FsID0gdHJhbnNwb3J0LmxvY2FsOwogCQl1cmkgPSB0cmFuc3BvcnQudXJpOwpAQCAtMjc0LDcgKzI3NCw3IEBAIHByb3RlY3RlZCBUcmFuc3BvcnRFeGNlcHRpb24gbm9SZXBvc2l0b3J5KCkgewogCSAqICAgICAgICAgICAgb3B0aW9uIHN0cmluZwogCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIG9wdGlvbiBpcyBzdXBwb3J0ZWQKIAkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NhcGFibGVPZihmaW5hbCBTdHJpbmcgb3B0aW9uKSB7CisJcHJvdGVjdGVkIGJvb2xlYW4gaXNDYXBhYmxlT2YoU3RyaW5nIG9wdGlvbikgewogCQlyZXR1cm4gcmVtb3RlQ2FwYWJsaXRpZXMuY29udGFpbnMob3B0aW9uKTsKIAl9CiAKQEAgLTI4Nyw3ICsyODcsNyBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NhcGFibGVPZihmaW5hbCBTdHJpbmcgb3B0aW9uKSB7CiAJICogICAgICAgICAgICBvcHRpb24gd2Ugd2FudAogCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSByZXF1ZXN0ZWQgb3B0aW9uIGlzIHN1cHBvcnRlZAogCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHdhbnRDYXBhYmlsaXR5KGZpbmFsIFN0cmluZ0J1aWxkZXIgYiwgZmluYWwgU3RyaW5nIG9wdGlvbikgeworCXByb3RlY3RlZCBib29sZWFuIHdhbnRDYXBhYmlsaXR5KFN0cmluZ0J1aWxkZXIgYiwgU3RyaW5nIG9wdGlvbikgewogCQlpZiAoIWlzQ2FwYWJsZU9mKG9wdGlvbikpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWIuYXBwZW5kKCcgJyk7CkBAIC0zMTQsNyArMzE0LDcgQEAgcHVibGljIFN0cmluZyBnZXRQZWVyVXNlckFnZW50KCkgewogCQlyZXR1cm4gVXNlckFnZW50LmdldEFnZW50KHJlbW90ZUNhcGFibGl0aWVzLCBzdXBlci5nZXRQZWVyVXNlckFnZW50KCkpOwogCX0KIAotCXByaXZhdGUgUGFja1Byb3RvY29sRXhjZXB0aW9uIGR1cGxpY2F0ZUFkdmVydGlzZW1lbnQoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBkdXBsaWNhdGVBZHZlcnRpc2VtZW50KFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKHVyaSwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuZHVwbGljYXRlQWR2ZXJ0aXNlbWVudHNPZiwgbmFtZSkpOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tGZXRjaENvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrRmV0Y2hDb25uZWN0aW9uLmphdmEKaW5kZXggMTM4MzA0NS4uMGRmY2Q4NyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tGZXRjaENvbm5lY3Rpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja0ZldGNoQ29ubmVjdGlvbi5qYXZhCkBAIC00NSw4ICs0NSw2IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOwotCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwpAQCAtNTUsNyArNTMsNiBAQAogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5QYWNrUHJvdG9jb2xFeGNlcHRpb247CkBAIC0yMDAsNiArMTk3LDEzIEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlUGFja0ZldGNoQ29ubmVjdGlvbiBleHRlbmRzIEJhc2VQYWNrQ29ubmVjdGlvbgogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9BTExPV19SRUFDSEFCTEVfU0hBMV9JTl9XQU5UID0gR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX0FMTE9XX1JFQUNIQUJMRV9TSEExX0lOX1dBTlQ7CiAKKwkvKioKKwkgKiBUaGUgY2xpZW50IHNwZWNpZmllZCBhIGZpbHRlciBleHByZXNzaW9uLgorCSAqCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9GSUxURVIgPSBHaXRQcm90b2NvbENvbnN0YW50cy5PUFRJT05fRklMVEVSOworCiAJcHJpdmF0ZSBmaW5hbCBSZXZXYWxrIHdhbGs7CiAKIAkvKiogQWxsIGNvbW1pdHMgdGhhdCBhcmUgaW1tZWRpYXRlbHkgcmVhY2hhYmxlIGJ5IGEgbG9jYWwgcmVmLiAqLwpAQCAtMjQyLDEzICsyNDYsMTYgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VQYWNrRmV0Y2hDb25uZWN0aW9uIGV4dGVuZHMgQmFzZVBhY2tDb25uZWN0aW9uCiAKIAlwcml2YXRlIFBhY2tldExpbmVPdXQgcGNrU3RhdGU7CiAKKwkvKiogSWYgbm90IC0xLCB0aGUgbWF4aW11bSBibG9iIHNpemUgdG8gYmUgc2VudCB0byB0aGUgc2VydmVyLiAqLworCXByaXZhdGUgZmluYWwgbG9uZyBmaWx0ZXJCbG9iTGltaXQ7CisKIAkvKioKIAkgKiBDcmVhdGUgYSBuZXcgY29ubmVjdGlvbiB0byBmZXRjaCB1c2luZyB0aGUgbmF0aXZlIGdpdCB0cmFuc3BvcnQuCiAJICoKIAkgKiBAcGFyYW0gcGFja1RyYW5zcG9ydAogCSAqICAgICAgICAgICAgdGhlIHRyYW5zcG9ydC4KIAkgKi8KLQlwdWJsaWMgQmFzZVBhY2tGZXRjaENvbm5lY3Rpb24oZmluYWwgUGFja1RyYW5zcG9ydCBwYWNrVHJhbnNwb3J0KSB7CisJcHVibGljIEJhc2VQYWNrRmV0Y2hDb25uZWN0aW9uKFBhY2tUcmFuc3BvcnQgcGFja1RyYW5zcG9ydCkgewogCQlzdXBlcihwYWNrVHJhbnNwb3J0KTsKIAogCQlpZiAobG9jYWwgIT0gbnVsbCkgewpAQCAtMjYyLDYgKzI2OSw3IEBAIHB1YmxpYyBCYXNlUGFja0ZldGNoQ29ubmVjdGlvbihmaW5hbCBQYWNrVHJhbnNwb3J0IHBhY2tUcmFuc3BvcnQpIHsKIAkJfQogCQlpbmNsdWRlVGFncyA9IHRyYW5zcG9ydC5nZXRUYWdPcHQoKSAhPSBUYWdPcHQuTk9fVEFHUzsKIAkJdGhpblBhY2sgPSB0cmFuc3BvcnQuaXNGZXRjaFRoaW4oKTsKKwkJZmlsdGVyQmxvYkxpbWl0ID0gdHJhbnNwb3J0LmdldEZpbHRlckJsb2JMaW1pdCgpOwogCiAJCWlmIChsb2NhbCAhPSBudWxsKSB7CiAJCQl3YWxrID0gbmV3IFJldldhbGsobG9jYWwpOwpAQCAtMjg4LDcgKzI5Niw3IEBAIHN0YXRpYyBjbGFzcyBGZXRjaENvbmZpZyB7CiAKIAkJZmluYWwgYm9vbGVhbiBtaW5pbWFsTmVnb3RpYXRpb247CiAKLQkJRmV0Y2hDb25maWcoZmluYWwgQ29uZmlnIGMpIHsKKwkJRmV0Y2hDb25maWcoQ29uZmlnIGMpIHsKIAkJCWFsbG93T2ZzRGVsdGEgPSBjLmdldEJvb2xlYW4oInJlcGFjayIsICJ1c2VkZWx0YWJhc2VvZmZzZXQiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQltaW5pbWFsTmVnb3RpYXRpb24gPSBjLmdldEJvb2xlYW4oImZldGNoIiwgInVzZW1pbmltYWxuZWdvdGlhdGlvbiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQlmYWxzZSk7CkBAIC0zMzEsNyArMzM5LDcgQEAgcHVibGljIGJvb2xlYW4gZGlkRmV0Y2hUZXN0Q29ubmVjdGl2aXR5KCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRQYWNrTG9ja01lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKwlwdWJsaWMgdm9pZCBzZXRQYWNrTG9ja01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKIAkJbG9ja01lc3NhZ2UgPSBtZXNzYWdlOwogCX0KIApAQCAtNDEwLDkgKzQxOCw5IEBAIEZldGNoQ29uZmlnIGdldEZldGNoQ29uZmlnKCkgewogCQlyZXR1cm4gbG9jYWwuZ2V0Q29uZmlnKCkuZ2V0KEZldGNoQ29uZmlnOjpuZXcpOwogCX0KIAotCXByaXZhdGUgaW50IG1heFRpbWVXYW50ZWQoZmluYWwgQ29sbGVjdGlvbjxSZWY+IHdhbnRzKSB7CisJcHJpdmF0ZSBpbnQgbWF4VGltZVdhbnRlZChDb2xsZWN0aW9uPFJlZj4gd2FudHMpIHsKIAkJaW50IG1heFRpbWUgPSAwOwotCQlmb3IgKGZpbmFsIFJlZiByIDogd2FudHMpIHsKKwkJZm9yIChSZWYgciA6IHdhbnRzKSB7CiAJCQl0cnkgewogCQkJCWZpbmFsIFJldk9iamVjdCBvYmogPSB3YWxrLnBhcnNlQW55KHIuZ2V0T2JqZWN0SWQoKSk7CiAJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFJldkNvbW1pdCkgewpAQCAtNDI3LDEwICs0MzUsOSBAQCBwcml2YXRlIGludCBtYXhUaW1lV2FudGVkKGZpbmFsIENvbGxlY3Rpb248UmVmPiB3YW50cykgewogCQlyZXR1cm4gbWF4VGltZTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgbWFya1JlYWNoYWJsZShmaW5hbCBTZXQ8T2JqZWN0SWQ+IGhhdmUsIGZpbmFsIGludCBtYXhUaW1lKQorCXByaXZhdGUgdm9pZCBtYXJrUmVhY2hhYmxlKFNldDxPYmplY3RJZD4gaGF2ZSwgaW50IG1heFRpbWUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlNYXA8U3RyaW5nLCBSZWY+IHJlZnMgPSBsb2NhbC5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoQUxMKTsKLQkJZm9yIChmaW5hbCBSZWYgciA6IHJlZnMudmFsdWVzKCkpIHsKKwkJZm9yIChSZWYgciA6IGxvY2FsLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpKSB7CiAJCQlPYmplY3RJZCBpZCA9IHIuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKIAkJCWlmIChpZCA9PSBudWxsKQogCQkJCWlkID0gci5nZXRPYmplY3RJZCgpOwpAQCAtNDgyLDEwICs0ODksMTAgQEAgcHJpdmF0ZSB2b2lkIHBhcnNlUmVhY2hhYmxlKE9iamVjdElkIGlkKSB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gc2VuZFdhbnRzKGZpbmFsIENvbGxlY3Rpb248UmVmPiB3YW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXByaXZhdGUgYm9vbGVhbiBzZW5kV2FudHMoQ29sbGVjdGlvbjxSZWY+IHdhbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFBhY2tldExpbmVPdXQgcCA9IHN0YXRlbGVzc1JQQyA/IHBja1N0YXRlIDogcGNrT3V0OwogCQlib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLQkJZm9yIChmaW5hbCBSZWYgciA6IHdhbnQpIHsKKwkJZm9yIChSZWYgciA6IHdhbnQpIHsKIAkJCU9iamVjdElkIG9iamVjdElkID0gci5nZXRPYmplY3RJZCgpOwogCQkJaWYgKG9iamVjdElkID09IG51bGwpIHsKIAkJCQljb250aW51ZTsKQEAgLTUyNCw2ICs1MzEsMTEgQEAgcHJpdmF0ZSBib29sZWFuIHNlbmRXYW50cyhmaW5hbCBDb2xsZWN0aW9uPFJlZj4gd2FudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGZpcnN0KSB7CiAJCQlyZXR1cm4gZmFsc2U7CiAJCX0KKwkJaWYgKGZpbHRlckJsb2JMaW1pdCA9PSAwKSB7CisJCQlwLndyaXRlU3RyaW5nKE9QVElPTl9GSUxURVIgKyAiIGJsb2I6bm9uZSIpOyAvLyROT04tTkxTLTEkCisJCX0gZWxzZSBpZiAoZmlsdGVyQmxvYkxpbWl0ID4gMCkgeworCQkJcC53cml0ZVN0cmluZyhPUFRJT05fRklMVEVSICsgIiBibG9iOmxpbWl0PSIgKyBmaWx0ZXJCbG9iTGltaXQpOyAvLyROT04tTkxTLTEkCisJCX0KIAkJcC5lbmQoKTsKIAkJb3V0TmVlZHNFbmQgPSBmYWxzZTsKIAkJcmV0dXJuIHRydWU7CkBAIC01NjQsMTEgKzU3NiwxNiBAQCBlbHNlIGlmICh3YW50Q2FwYWJpbGl0eShsaW5lLCBPUFRJT05fU0lERV9CQU5EKSkKIAkJCQkJT1BUSU9OX01VTFRJX0FDS19ERVRBSUxFRCkpOwogCQl9CiAKKwkJaWYgKGZpbHRlckJsb2JMaW1pdCA+PSAwICYmICF3YW50Q2FwYWJpbGl0eShsaW5lLCBPUFRJT05fRklMVEVSKSkgeworCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbih1cmksCisJCQkJCUpHaXRUZXh0LmdldCgpLmZpbHRlclJlcXVpcmVzQ2FwYWJpbGl0eSk7CisJCX0KKwogCQlhZGRVc2VyQWdlbnRDYXBhYmlsaXR5KGxpbmUpOwogCQlyZXR1cm4gbGluZS50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgdm9pZCBuZWdvdGlhdGUoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiwKKwlwcml2YXRlIHZvaWQgbmVnb3RpYXRlKFByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlDYW5jZWxsZWRFeGNlcHRpb24gewogCQlmaW5hbCBNdXRhYmxlT2JqZWN0SWQgYWNrSWQgPSBuZXcgTXV0YWJsZU9iamVjdElkKCk7CiAJCWludCByZXN1bHRzUGVuZGluZyA9IDA7CkBAIC03NjgsNyArNzg1LDcgQEAgcHVibGljIFJldkZpbHRlciBjbG9uZSgpIHsKIAkJCX0KIAogCQkJQE92ZXJyaWRlCi0JCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFJldldhbGsgd2Fsa2VyLCBmaW5hbCBSZXZDb21taXQgYykgeworCQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShSZXZXYWxrIHdhbGtlciwgUmV2Q29tbWl0IGMpIHsKIAkJCQlmaW5hbCBib29sZWFuIHJlbW90ZUtub3dzSXNDb21tb24gPSBjLmhhcyhDT01NT04pOwogCQkJCWlmIChjLmhhcyhBRFZFUlRJU0VEKSkgewogCQkJCQkvLyBSZW1vdGUgYWR2ZXJ0aXNlZCB0aGlzLCBhbmQgd2UgaGF2ZSBpdCwgaGVuY2UgY29tbW9uLgpAQCAtNzg5LDE0ICs4MDYsMTQgQEAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNDb21taXRCb2R5KCkgewogCX0KIAogCXByaXZhdGUgdm9pZCBtYXJrUmVmc0FkdmVydGlzZWQoKSB7Ci0JCWZvciAoZmluYWwgUmVmIHIgOiBnZXRSZWZzKCkpIHsKKwkJZm9yIChSZWYgciA6IGdldFJlZnMoKSkgewogCQkJbWFya0FkdmVydGlzZWQoci5nZXRPYmplY3RJZCgpKTsKIAkJCWlmIChyLmdldFBlZWxlZE9iamVjdElkKCkgIT0gbnVsbCkKIAkJCQltYXJrQWR2ZXJ0aXNlZChyLmdldFBlZWxlZE9iamVjdElkKCkpOwogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG1hcmtBZHZlcnRpc2VkKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHJpdmF0ZSB2b2lkIG1hcmtBZHZlcnRpc2VkKEFueU9iamVjdElkIGlkKSB7CiAJCXRyeSB7CiAJCQl3YWxrLnBhcnNlQW55KGlkKS5hZGQoQURWRVJUSVNFRCk7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHJlYWRFcnJvcikgewpAQCAtODA0LDcgKzgyMSw3IEBAIHByaXZhdGUgdm9pZCBtYXJrQWR2ZXJ0aXNlZChmaW5hbCBBbnlPYmplY3RJZCBpZCkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG1hcmtDb21tb24oZmluYWwgUmV2T2JqZWN0IG9iaiwgZmluYWwgQWNrTmFja1Jlc3VsdCBhbnIpCisJcHJpdmF0ZSB2b2lkIG1hcmtDb21tb24oUmV2T2JqZWN0IG9iaiwgQWNrTmFja1Jlc3VsdCBhbnIpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoc3RhdGVsZXNzUlBDICYmIGFuciA9PSBBY2tOYWNrUmVzdWx0LkFDS19DT01NT04gJiYgIW9iai5oYXMoU1RBVEUpKSB7CiAJCQlTdHJpbmdCdWlsZGVyIHM7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja1B1c2hDb25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUGFja1B1c2hDb25uZWN0aW9uLmphdmEKaW5kZXggZWU2ZjI5ZS4uNjk2MjRmZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVBhY2tQdXNoQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Jhc2VQYWNrUHVzaENvbm5lY3Rpb24uamF2YQpAQCAtMTQ2LDcgKzE0Niw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlUGFja1B1c2hDb25uZWN0aW9uIGV4dGVuZHMgQmFzZVBhY2tDb25uZWN0aW9uIGltcGxlbWVuCiAJICogQHBhcmFtIHBhY2tUcmFuc3BvcnQKIAkgKiAgICAgICAgICAgIHRoZSB0cmFuc3BvcnQuCiAJICovCi0JcHVibGljIEJhc2VQYWNrUHVzaENvbm5lY3Rpb24oZmluYWwgUGFja1RyYW5zcG9ydCBwYWNrVHJhbnNwb3J0KSB7CisJcHVibGljIEJhc2VQYWNrUHVzaENvbm5lY3Rpb24oUGFja1RyYW5zcG9ydCBwYWNrVHJhbnNwb3J0KSB7CiAJCXN1cGVyKHBhY2tUcmFuc3BvcnQpOwogCQl0aGluUGFjayA9IHRyYW5zcG9ydC5pc1B1c2hUaGluKCk7CiAJCWF0b21pYyA9IHRyYW5zcG9ydC5pc1B1c2hBdG9taWMoKTsKQEAgLTI1Niw3ICsyNTYsNyBAQCBwcml2YXRlIHZvaWQgd3JpdGVDb21tYW5kcyhmaW5hbCBDb2xsZWN0aW9uPFJlbW90ZVJlZlVwZGF0ZT4gcmVmVXBkYXRlcywKIAkJCQkJCQlwdXNoT3B0aW9ucy50b1N0cmluZygpKSk7CiAJCX0KIAotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZWZVcGRhdGVzKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlZlVwZGF0ZXMpIHsKIAkJCWlmICghY2FwYWJsZURlbGV0ZVJlZnMgJiYgcnJ1LmlzRGVsZXRlKCkpIHsKIAkJCQlycnUuc2V0U3RhdHVzKFN0YXR1cy5SRUpFQ1RFRF9OT0RFTEVURSk7CiAJCQkJY29udGludWU7CkBAIC0yOTQsNyArMjk0LDcgQEAgcHJpdmF0ZSB2b2lkIHdyaXRlQ29tbWFuZHMoZmluYWwgQ29sbGVjdGlvbjxSZW1vdGVSZWZVcGRhdGU+IHJlZlVwZGF0ZXMsCiAJfQogCiAJcHJpdmF0ZSB2b2lkIHRyYW5zbWl0T3B0aW9ucygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZvciAoZmluYWwgU3RyaW5nIHB1c2hPcHRpb24gOiBwdXNoT3B0aW9ucykgeworCQlmb3IgKFN0cmluZyBwdXNoT3B0aW9uIDogcHVzaE9wdGlvbnMpIHsKIAkJCXBja091dC53cml0ZVN0cmluZyhwdXNoT3B0aW9uKTsKIAkJfQogCkBAIC0zMzIsMTcgKzMzMiwxNyBAQCBwcml2YXRlIHZvaWQgd3JpdGVQYWNrKGZpbmFsIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcmVmVXBkYXRlcywKIAkJU2V0PE9iamVjdElkPiByZW1vdGVPYmplY3RzID0gbmV3IEhhc2hTZXQ8PigpOwogCQlTZXQ8T2JqZWN0SWQ+IG5ld09iamVjdHMgPSBuZXcgSGFzaFNldDw+KCk7CiAKLQkJdHJ5IChmaW5hbCBQYWNrV3JpdGVyIHdyaXRlciA9IG5ldyBQYWNrV3JpdGVyKHRyYW5zcG9ydC5nZXRQYWNrQ29uZmlnKCksCisJCXRyeSAoUGFja1dyaXRlciB3cml0ZXIgPSBuZXcgUGFja1dyaXRlcih0cmFuc3BvcnQuZ2V0UGFja0NvbmZpZygpLAogCQkJCWxvY2FsLm5ld09iamVjdFJlYWRlcigpKSkgewogCi0JCQlmb3IgKGZpbmFsIFJlZiByIDogZ2V0UmVmcygpKSB7CisJCQlmb3IgKFJlZiByIDogZ2V0UmVmcygpKSB7CiAJCQkJLy8gb25seSBhZGQgb2JqZWN0cyB0aGF0IHdlIGFjdHVhbGx5IGhhdmUKIAkJCQlPYmplY3RJZCBvaWQgPSByLmdldE9iamVjdElkKCk7CiAJCQkJaWYgKGxvY2FsLmhhc09iamVjdChvaWQpKQogCQkJCQlyZW1vdGVPYmplY3RzLmFkZChvaWQpOwogCQkJfQogCQkJcmVtb3RlT2JqZWN0cy5hZGRBbGwoYWRkaXRpb25hbEhhdmVzKTsKLQkJCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHIgOiByZWZVcGRhdGVzLnZhbHVlcygpKSB7CisJCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSByIDogcmVmVXBkYXRlcy52YWx1ZXMoKSkgewogCQkJCWlmICghT2JqZWN0SWQuemVyb0lkKCkuZXF1YWxzKHIuZ2V0TmV3T2JqZWN0SWQoKSkpCiAJCQkJCW5ld09iamVjdHMuYWRkKHIuZ2V0TmV3T2JqZWN0SWQoKSk7CiAJCQl9CkBAIC0zNjUsNyArMzY1LDcgQEAgcHJpdmF0ZSB2b2lkIHdyaXRlUGFjayhmaW5hbCBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlZlVwZGF0ZXMsCiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVhZFN0YXR1c1JlcG9ydChmaW5hbCBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlZlVwZGF0ZXMpCisJcHJpdmF0ZSB2b2lkIHJlYWRTdGF0dXNSZXBvcnQoTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiByZWZVcGRhdGVzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgU3RyaW5nIHVucGFja0xpbmUgPSByZWFkU3RyaW5nTG9uZ1RpbWVvdXQoKTsKIAkJaWYgKCF1bnBhY2tMaW5lLnN0YXJ0c1dpdGgoInVucGFjayAiKSkgLy8kTk9OLU5MUy0xJApAQCAtNDExLDcgKzQxMSw3IEBAIHByaXZhdGUgdm9pZCByZWFkU3RhdHVzUmVwb3J0KGZpbmFsIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcmVmVXBkYXRlcykKIAkJCQlycnUuc2V0TWVzc2FnZShtZXNzYWdlKTsKIAkJCX0KIAkJfQotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiByZWZVcGRhdGVzLnZhbHVlcygpKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHJlZlVwZGF0ZXMudmFsdWVzKCkpIHsKIAkJCWlmIChycnUuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzLkFXQUlUSU5HX1JFUE9SVCkKIAkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQkJSkdpdFRleHQuZ2V0KCkuZXhwZWN0ZWRSZXBvcnRGb3JSZWZOb3RSZWNlaXZlZCAsIHVyaSwgcnJ1LmdldFJlbW90ZU5hbWUoKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQmFzZVJlY2VpdmVQYWNrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUmVjZWl2ZVBhY2suamF2YQppbmRleCA4ZjM2NWZjLi5kMzQxOWJjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUmVjZWl2ZVBhY2suamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CYXNlUmVjZWl2ZVBhY2suamF2YQpAQCAtMzEyLDcgKzMxMiw3IEBAIHB1YmxpYyB2b2lkIHNldFB1c2hDZXJ0aWZpY2F0ZShQdXNoQ2VydGlmaWNhdGUgY2VydCkgewogCSAqIEBwYXJhbSBpbnRvCiAJICogICAgICAgICAgICB0aGUgZGVzdGluYXRpb24gcmVwb3NpdG9yeS4KIAkgKi8KLQlwcm90ZWN0ZWQgQmFzZVJlY2VpdmVQYWNrKGZpbmFsIFJlcG9zaXRvcnkgaW50bykgeworCXByb3RlY3RlZCBCYXNlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBpbnRvKSB7CiAJCWRiID0gaW50bzsKIAkJd2FsayA9IG5ldyBSZXZXYWxrKGRiKTsKIApAQCAtMzQ2LDcgKzM0Niw3IEBAIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgUmVjZWl2ZUNvbmZpZyB7CiAJCWZpbmFsIGxvbmcgbWF4RGlzY2FyZEJ5dGVzOwogCQlmaW5hbCBTaWduZWRQdXNoQ29uZmlnIHNpZ25lZFB1c2g7CiAKLQkJUmVjZWl2ZUNvbmZpZyhmaW5hbCBDb25maWcgY29uZmlnKSB7CisJCVJlY2VpdmVDb25maWcoQ29uZmlnIGNvbmZpZykgewogCQkJYWxsb3dDcmVhdGVzID0gdHJ1ZTsKIAkJCWFsbG93RGVsZXRlcyA9ICFjb25maWcuZ2V0Qm9vbGVhbigicmVjZWl2ZSIsICJkZW55ZGVsZXRlcyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQlhbGxvd05vbkZhc3RGb3J3YXJkcyA9ICFjb25maWcuZ2V0Qm9vbGVhbigicmVjZWl2ZSIsIC8vJE5PTi1OTFMtMSQKQEAgLTU1NCw3ICs1NTQsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0JpRGlyZWN0aW9uYWxQaXBlKCkgewogCSAqICAgICAgICAgICAgY29tbWFuZHMgYmVmb3JlIHdyaXRpbmcgb3V0cHV0IGFuZCBkb2VzIG5vdCBwZXJmb3JtIHRoZQogCSAqICAgICAgICAgICAgaW5pdGlhbCBhZHZlcnRpc2luZy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCaURpcmVjdGlvbmFsUGlwZShmaW5hbCBib29sZWFuIHR3b1dheSkgeworCXB1YmxpYyB2b2lkIHNldEJpRGlyZWN0aW9uYWxQaXBlKGJvb2xlYW4gdHdvV2F5KSB7CiAJCWJpRGlyZWN0aW9uYWxQaXBlID0gdHdvV2F5OwogCX0KIApAQCAtNTk4LDcgKzU5OCw3IEBAIHB1YmxpYyBib29sZWFuIGlzQ2hlY2tSZWNlaXZlZE9iamVjdHMoKSB7CiAJICogICAgICAgICAgICBhc3N1bWUgYWxsIHJlY2VpdmVkIG9iamVjdHMgYXJlIHZhbGlkLgogCSAqIEBzZWUgI3NldE9iamVjdENoZWNrZXIoT2JqZWN0Q2hlY2tlcikKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGVja1JlY2VpdmVkT2JqZWN0cyhmaW5hbCBib29sZWFuIGNoZWNrKSB7CisJcHVibGljIHZvaWQgc2V0Q2hlY2tSZWNlaXZlZE9iamVjdHMoYm9vbGVhbiBjaGVjaykgewogCQlpZiAoY2hlY2sgJiYgb2JqZWN0Q2hlY2tlciA9PSBudWxsKQogCQkJc2V0T2JqZWN0Q2hlY2tlcihuZXcgT2JqZWN0Q2hlY2tlcigpKTsKIAkJZWxzZSBpZiAoIWNoZWNrICYmIG9iamVjdENoZWNrZXIgIT0gbnVsbCkKQEAgLTYzMiw3ICs2MzIsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0FsbG93Q3JlYXRlcygpIHsKIAkgKiBAcGFyYW0gY2FuQ3JlYXRlCiAJICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gdG8gcGVybWl0IGNyZWF0ZSByZWYgY29tbWFuZHMgdG8gYmUgcHJvY2Vzc2VkLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG93Q3JlYXRlcyhmaW5hbCBib29sZWFuIGNhbkNyZWF0ZSkgeworCXB1YmxpYyB2b2lkIHNldEFsbG93Q3JlYXRlcyhib29sZWFuIGNhbkNyZWF0ZSkgewogCQlhbGxvd0NyZWF0ZXMgPSBjYW5DcmVhdGU7CiAJfQogCkBAIC02NTEsNyArNjUxLDcgQEAgcHVibGljIGJvb2xlYW4gaXNBbGxvd0RlbGV0ZXMoKSB7CiAJICogQHBhcmFtIGNhbkRlbGV0ZQogCSAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRvIHBlcm1pdCBkZWxldGUgcmVmIGNvbW1hbmRzIHRvIGJlIHByb2Nlc3NlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd0RlbGV0ZXMoZmluYWwgYm9vbGVhbiBjYW5EZWxldGUpIHsKKwlwdWJsaWMgdm9pZCBzZXRBbGxvd0RlbGV0ZXMoYm9vbGVhbiBjYW5EZWxldGUpIHsKIAkJYWxsb3dBbnlEZWxldGVzID0gY2FuRGVsZXRlOwogCX0KIApAQCAtNjk3LDcgKzY5Nyw3IEBAIHB1YmxpYyBib29sZWFuIGlzQWxsb3dOb25GYXN0Rm9yd2FyZHMoKSB7CiAJICogICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gdG8gcGVybWl0IHRoZSBjbGllbnQgdG8gYXNrIGZvciBub24tZmFzdC1mb3J3YXJkCiAJICogICAgICAgICAgICB1cGRhdGVzIG9mIGFuIGV4aXN0aW5nIHJlZi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd05vbkZhc3RGb3J3YXJkcyhmaW5hbCBib29sZWFuIGNhblJld2luZCkgeworCXB1YmxpYyB2b2lkIHNldEFsbG93Tm9uRmFzdEZvcndhcmRzKGJvb2xlYW4gY2FuUmV3aW5kKSB7CiAJCWFsbG93Tm9uRmFzdEZvcndhcmRzID0gY2FuUmV3aW5kOwogCX0KIApAQCAtNzQ3LDcgKzc0Nyw3IEBAIHB1YmxpYyBQZXJzb25JZGVudCBnZXRSZWZMb2dJZGVudCgpIHsKIAkgKiAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUgcmVwb3NpdG9yeQogCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbi4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZMb2dJZGVudChmaW5hbCBQZXJzb25JZGVudCBwaSkgeworCXB1YmxpYyB2b2lkIHNldFJlZkxvZ0lkZW50KFBlcnNvbklkZW50IHBpKSB7CiAJCXJlZkxvZ0lkZW50ID0gcGk7CiAJfQogCkBAIC03ODQsNyArNzg0LDcgQEAgcHVibGljIFJlZkZpbHRlciBnZXRSZWZGaWx0ZXIoKSB7CiAJICogQHBhcmFtIGFkdmVydGlzZVJlZnNIb29rCiAJICogICAgICAgICAgICB0aGUgaG9vazsgbWF5IGJlIG51bGwgdG8gc2hvdyBhbGwgcmVmcy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBZHZlcnRpc2VSZWZzSG9vayhmaW5hbCBBZHZlcnRpc2VSZWZzSG9vayBhZHZlcnRpc2VSZWZzSG9vaykgeworCXB1YmxpYyB2b2lkIHNldEFkdmVydGlzZVJlZnNIb29rKEFkdmVydGlzZVJlZnNIb29rIGFkdmVydGlzZVJlZnNIb29rKSB7CiAJCWlmIChhZHZlcnRpc2VSZWZzSG9vayAhPSBudWxsKQogCQkJdGhpcy5hZHZlcnRpc2VSZWZzSG9vayA9IGFkdmVydGlzZVJlZnNIb29rOwogCQllbHNlCkBAIC04MDEsNyArODAxLDcgQEAgcHVibGljIHZvaWQgc2V0QWR2ZXJ0aXNlUmVmc0hvb2soZmluYWwgQWR2ZXJ0aXNlUmVmc0hvb2sgYWR2ZXJ0aXNlUmVmc0hvb2spIHsKIAkgKiBAcGFyYW0gcmVmRmlsdGVyCiAJICogICAgICAgICAgICB0aGUgZmlsdGVyOyBtYXkgYmUgbnVsbCB0byBzaG93IGFsbCByZWZzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZkZpbHRlcihmaW5hbCBSZWZGaWx0ZXIgcmVmRmlsdGVyKSB7CisJcHVibGljIHZvaWQgc2V0UmVmRmlsdGVyKFJlZkZpbHRlciByZWZGaWx0ZXIpIHsKIAkJdGhpcy5yZWZGaWx0ZXIgPSByZWZGaWx0ZXIgIT0gbnVsbCA/IHJlZkZpbHRlciA6IFJlZkZpbHRlci5ERUZBVUxUOwogCX0KIApAQCAtODIyLDcgKzgyMiw3IEBAIHB1YmxpYyBpbnQgZ2V0VGltZW91dCgpIHsKIAkgKiAgICAgICAgICAgIGJlZm9yZSBhYm9ydGluZyBhbiBJTyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbiB3aXRoIHRoZQogCSAqICAgICAgICAgICAgY29ubmVjdGVkIGNsaWVudC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGZpbmFsIGludCBzZWNvbmRzKSB7CisJcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgc2Vjb25kcykgewogCQl0aW1lb3V0ID0gc2Vjb25kczsKIAl9CiAKQEAgLTg2Nyw3ICs4NjcsNyBAQCBwdWJsaWMgdm9pZCBzZXRNYXhDb21tYW5kRGlzY2FyZEJ5dGVzKGxvbmcgbGltaXQpIHsKIAkgKiBAcGFyYW0gbGltaXQKIAkgKiAgICAgICAgICAgIHRoZSBHaXQgb2JqZWN0IHNpemUgbGltaXQuIElmIHplcm8gdGhlbiB0aGVyZSBpcyBub3QgbGltaXQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0TWF4T2JqZWN0U2l6ZUxpbWl0KGZpbmFsIGxvbmcgbGltaXQpIHsKKwlwdWJsaWMgdm9pZCBzZXRNYXhPYmplY3RTaXplTGltaXQobG9uZyBsaW1pdCkgewogCQltYXhPYmplY3RTaXplTGltaXQgPSBsaW1pdDsKIAl9CiAKQEAgLTg4MCw3ICs4ODAsNyBAQCBwdWJsaWMgdm9pZCBzZXRNYXhPYmplY3RTaXplTGltaXQoZmluYWwgbG9uZyBsaW1pdCkgewogCSAqICAgICAgICAgICAgdGhlIHBhY2sgc2l6ZSBsaW1pdCwgaW4gYnl0ZXMKIAkgKiBAc2luY2UgMy4zCiAJICovCi0JcHVibGljIHZvaWQgc2V0TWF4UGFja1NpemVMaW1pdChmaW5hbCBsb25nIGxpbWl0KSB7CisJcHVibGljIHZvaWQgc2V0TWF4UGFja1NpemVMaW1pdChsb25nIGxpbWl0KSB7CiAJCWlmIChsaW1pdCA8IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS5yZWNlaXZlUGFja0ludmFsaWRMaW1pdCwgTG9uZy52YWx1ZU9mKGxpbWl0KSkpOwpAQCAtMTAzNyw3ICsxMDM3LDcgQEAgcHVibGljIExpc3Q8UmVjZWl2ZUNvbW1hbmQ+IGdldEFsbENvbW1hbmRzKCkgewogCSAqICAgICAgICAgICAgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHByb2JsZW0gaWRlbnRpZmllZCBieSB0aGUgaG9vay4gVGhlCiAJICogICAgICAgICAgICBzdHJpbmcgbXVzdCBub3QgZW5kIHdpdGggYW4gTEYsIGFuZCBtdXN0IG5vdCBjb250YWluIGFuIExGLgogCSAqLwotCXB1YmxpYyB2b2lkIHNlbmRFcnJvcihmaW5hbCBTdHJpbmcgd2hhdCkgeworCXB1YmxpYyB2b2lkIHNlbmRFcnJvcihTdHJpbmcgd2hhdCkgewogCQlpZiAocmVmcyA9PSBudWxsKSB7CiAJCQlpZiAoYWR2ZXJ0aXNlRXJyb3IgPT0gbnVsbCkKIAkJCQlhZHZlcnRpc2VFcnJvciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CkBAIC0xMDcwLDcgKzEwNzAsNyBAQCBwcml2YXRlIHZvaWQgZmF0YWxFcnJvcihTdHJpbmcgbXNnKSB7CiAJICogICAgICAgICAgICBzdHJpbmcgZGVzY3JpYmluZyB0aGUgcHJvYmxlbSBpZGVudGlmaWVkIGJ5IHRoZSBob29rLiBUaGUKIAkgKiAgICAgICAgICAgIHN0cmluZyBtdXN0IG5vdCBlbmQgd2l0aCBhbiBMRiwgYW5kIG11c3Qgbm90IGNvbnRhaW4gYW4gTEYuCiAJICovCi0JcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoZmluYWwgU3RyaW5nIHdoYXQpIHsKKwlwdWJsaWMgdm9pZCBzZW5kTWVzc2FnZShTdHJpbmcgd2hhdCkgewogCQltc2dPdXRXcmFwcGVyLndyaXRlKENvbnN0YW50cy5lbmNvZGUod2hhdCArICJcbiIpKTsgLy8kTk9OLU5MUy0xJAogCX0KIApAQCAtMTIyMSw3ICsxMjIxLDcgQEAgcHJvdGVjdGVkIHZvaWQgdW5sb2NrUGFjaygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5TZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgaG9vayBkZW5pZWQgYWR2ZXJ0aXNlbWVudC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZW5kQWR2ZXJ0aXNlZFJlZnMoZmluYWwgUmVmQWR2ZXJ0aXNlciBhZHYpCisJcHVibGljIHZvaWQgc2VuZEFkdmVydGlzZWRSZWZzKFJlZkFkdmVydGlzZXIgYWR2KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24gewogCQlpZiAoYWR2ZXJ0aXNlRXJyb3IgIT0gbnVsbCkgewogCQkJYWR2LndyaXRlT25lKCJFUlIgIiArIGFkdmVydGlzZUVycm9yKTsgLy8kTk9OLU5MUy0xJApAQCAtMTQ0OCw3ICsxNDQ4LDcgQEAgdm9pZCBjaGVja1JlcXVlc3RXYXNSZWFkKCkgewogCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGEgcGFjayBpcyBleHBlY3RlZCBiYXNlZCBvbiB0aGUgbGlzdCBvZiBjb21tYW5kcy4KIAkgKi8KIAlwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkUGFjaygpIHsKLQkJZm9yIChmaW5hbCBSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgeworCQlmb3IgKFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CiAJCQlpZiAoY21kLmdldFR5cGUoKSAhPSBSZWNlaXZlQ29tbWFuZC5UeXBlLkRFTEVURSkKIAkJCQlyZXR1cm4gdHJ1ZTsKIAkJfQpAQCAtMTU0OSwyMSArMTU0OSwyMSBAQCBwcml2YXRlIHZvaWQgY2hlY2tDb25uZWN0aXZpdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJCXBhcnNlciA9IG51bGw7CiAKLQkJdHJ5IChmaW5hbCBPYmplY3RXYWxrIG93ID0gbmV3IE9iamVjdFdhbGsoZGIpKSB7CisJCXRyeSAoT2JqZWN0V2FsayBvdyA9IG5ldyBPYmplY3RXYWxrKGRiKSkgewogCQkJaWYgKGJhc2VPYmplY3RzICE9IG51bGwpIHsKIAkJCQlvdy5zb3J0KFJldlNvcnQuVE9QTyk7CiAJCQkJaWYgKCFiYXNlT2JqZWN0cy5pc0VtcHR5KCkpCiAJCQkJCW93LnNvcnQoUmV2U29ydC5CT1VOREFSWSwgdHJ1ZSk7CiAJCQl9CiAKLQkJCWZvciAoZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKKwkJCWZvciAoUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKIAkJCQlpZiAoY21kLmdldFJlc3VsdCgpICE9IFJlc3VsdC5OT1RfQVRURU1QVEVEKQogCQkJCQljb250aW51ZTsKIAkJCQlpZiAoY21kLmdldFR5cGUoKSA9PSBSZWNlaXZlQ29tbWFuZC5UeXBlLkRFTEVURSkKIAkJCQkJY29udGludWU7CiAJCQkJb3cubWFya1N0YXJ0KG93LnBhcnNlQW55KGNtZC5nZXROZXdJZCgpKSk7CiAJCQl9Ci0JCQlmb3IgKGZpbmFsIE9iamVjdElkIGhhdmUgOiBhZHZlcnRpc2VkSGF2ZXMpIHsKKwkJCWZvciAoT2JqZWN0SWQgaGF2ZSA6IGFkdmVydGlzZWRIYXZlcykgewogCQkJCVJldk9iamVjdCBvID0gb3cucGFyc2VBbnkoaGF2ZSk7CiAJCQkJb3cubWFya1VuaW50ZXJlc3Rpbmcobyk7CiAKQEAgLTE2MTksNyArMTYxOSw3IEBAIHByaXZhdGUgdm9pZCBjaGVja0Nvbm5lY3Rpdml0eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogVmFsaWRhdGUgdGhlIGNvbW1hbmQgbGlzdC4KIAkgKi8KIAlwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZUNvbW1hbmRzKCkgewotCQlmb3IgKGZpbmFsIFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CisJCWZvciAoUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKIAkJCWZpbmFsIFJlZiByZWYgPSBjbWQuZ2V0UmVmKCk7CiAJCQlpZiAoY21kLmdldFJlc3VsdCgpICE9IFJlc3VsdC5OT1RfQVRURU1QVEVEKQogCQkJCWNvbnRpbnVlOwpAQCAtMTc4NCw3ICsxNzg0LDcgQEAgcHJvdGVjdGVkIHZvaWQgZmFpbFBlbmRpbmdDb21tYW5kcygpIHsKIAkgKiBAcmV0dXJuIGEgY29weSBvZiB0aGUgY29tbWFuZCBsaXN0IGNvbnRhaW5pbmcgb25seSB0aG9zZSBjb21tYW5kcyB3aXRoIHRoZQogCSAqICAgICAgICAgZGVzaXJlZCBzdGF0dXMuCiAJICovCi0JcHJvdGVjdGVkIExpc3Q8UmVjZWl2ZUNvbW1hbmQ+IGZpbHRlckNvbW1hbmRzKGZpbmFsIFJlc3VsdCB3YW50KSB7CisJcHJvdGVjdGVkIExpc3Q8UmVjZWl2ZUNvbW1hbmQ+IGZpbHRlckNvbW1hbmRzKFJlc3VsdCB3YW50KSB7CiAJCXJldHVybiBSZWNlaXZlQ29tbWFuZC5maWx0ZXIoY29tbWFuZHMsIHdhbnQpOwogCX0KIApAQCAtMTgzOCw3ICsxODM4LDcgQEAgcHJvdGVjdGVkIHZvaWQgc2VuZFN0YXR1c1JlcG9ydChmaW5hbCBib29sZWFuIGZvckNsaWVudCwKIAkJaWYgKHVucGFja0Vycm9yICE9IG51bGwpIHsKIAkJCW91dC5zZW5kU3RyaW5nKCJ1bnBhY2sgZXJyb3IgIiArIHVucGFja0Vycm9yLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQKIAkJCWlmIChmb3JDbGllbnQpIHsKLQkJCQlmb3IgKGZpbmFsIFJlY2VpdmVDb21tYW5kIGNtZCA6IGNvbW1hbmRzKSB7CisJCQkJZm9yIChSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgewogCQkJCQlvdXQuc2VuZFN0cmluZygibmcgIiArIGNtZC5nZXRSZWZOYW1lKCkgLy8kTk9OLU5MUy0xJAogCQkJCQkJCSsgIiBuL2EgKHVucGFja2VyIGVycm9yKSIpOyAvLyROT04tTkxTLTEkCiAJCQkJfQpAQCAtMTg0OCw3ICsxODQ4LDcgQEAgcHJvdGVjdGVkIHZvaWQgc2VuZFN0YXR1c1JlcG9ydChmaW5hbCBib29sZWFuIGZvckNsaWVudCwKIAogCQlpZiAoZm9yQ2xpZW50KQogCQkJb3V0LnNlbmRTdHJpbmcoInVucGFjayBvayIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoZmluYWwgUmVjZWl2ZUNvbW1hbmQgY21kIDogY29tbWFuZHMpIHsKKwkJZm9yIChSZWNlaXZlQ29tbWFuZCBjbWQgOiBjb21tYW5kcykgewogCQkJaWYgKGNtZC5nZXRSZXN1bHQoKSA9PSBSZXN1bHQuT0spIHsKIAkJCQlpZiAoZm9yQ2xpZW50KQogCQkJCQlvdXQuc2VuZFN0cmluZygib2sgIiArIGNtZC5nZXRSZWZOYW1lKCkpOyAvLyROT04tTkxTLTEkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVGZXRjaENvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZUZldGNoQ29ubmVjdGlvbi5qYXZhCmluZGV4IDM5ZWZhYmYuLjQ0OWY1MjkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZUZldGNoQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZUZldGNoQ29ubmVjdGlvbi5qYXZhCkBAIC00Nyw4ICs0Nyw2IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOwotCiBpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTk4LDcgKzk2LDcgQEAgY2xhc3MgQnVuZGxlRmV0Y2hDb25uZWN0aW9uIGV4dGVuZHMgQmFzZUZldGNoQ29ubmVjdGlvbiB7CiAKIAlwcml2YXRlIFBhY2tMb2NrIHBhY2tMb2NrOwogCi0JQnVuZGxlRmV0Y2hDb25uZWN0aW9uKFRyYW5zcG9ydCB0cmFuc3BvcnRCdW5kbGUsIGZpbmFsIElucHV0U3RyZWFtIHNyYykgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJQnVuZGxlRmV0Y2hDb25uZWN0aW9uKFRyYW5zcG9ydCB0cmFuc3BvcnRCdW5kbGUsIElucHV0U3RyZWFtIHNyYykgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyYW5zcG9ydCA9IHRyYW5zcG9ydEJ1bmRsZTsKIAkJYmluID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oc3JjKTsKIAkJdHJ5IHsKQEAgLTE1NSwxMiArMTUzLDEyIEBAIHByaXZhdGUgdm9pZCByZWFkQnVuZGxlVjIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlhdmFpbGFibGUoYXZhaWwpOwogCX0KIAotCXByaXZhdGUgUGFja1Byb3RvY29sRXhjZXB0aW9uIGR1cGxpY2F0ZUFkdmVydGlzZW1lbnQoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBkdXBsaWNhdGVBZHZlcnRpc2VtZW50KFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKHRyYW5zcG9ydC51cmksCiAJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuZHVwbGljYXRlQWR2ZXJ0aXNlbWVudHNPZiwgbmFtZSkpOwogCX0KIAotCXByaXZhdGUgU3RyaW5nIHJlYWRMaW5lKGZpbmFsIGJ5dGVbXSBoZHJidWYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgcmVhZExpbmUoYnl0ZVtdIGhkcmJ1ZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJU3RyaW5nQnVpbGRlciBsaW5lID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKIAkJYm9vbGVhbiBkb25lID0gZmFsc2U7CiAJCXdoaWxlICghZG9uZSkgewpAQCAtMjEyLDcgKzIxMCw3IEBAIHByb3RlY3RlZCB2b2lkIGRvRmV0Y2goZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIHNldFBhY2tMb2NrTWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworCXB1YmxpYyB2b2lkIHNldFBhY2tMb2NrTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewogCQlsb2NrTWVzc2FnZSA9IG1lc3NhZ2U7CiAJfQogCkBAIC0yMjgsMTMgKzIyNiwxMyBAQCBwcml2YXRlIHZvaWQgdmVyaWZ5UHJlcmVxdWlzaXRlcygpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlpZiAocHJlcmVxcy5pc0VtcHR5KCkpCiAJCQlyZXR1cm47CiAKLQkJdHJ5IChmaW5hbCBSZXZXYWxrIHJ3ID0gbmV3IFJldldhbGsodHJhbnNwb3J0LmxvY2FsKSkgeworCQl0cnkgKFJldldhbGsgcncgPSBuZXcgUmV2V2Fsayh0cmFuc3BvcnQubG9jYWwpKSB7CiAJCQlmaW5hbCBSZXZGbGFnIFBSRVJFUSA9IHJ3Lm5ld0ZsYWcoIlBSRVJFUSIpOyAvLyROT04tTkxTLTEkCiAJCQlmaW5hbCBSZXZGbGFnIFNFRU4gPSBydy5uZXdGbGFnKCJTRUVOIik7IC8vJE5PTi1OTFMtMSQKIAogCQkJZmluYWwgTWFwPE9iamVjdElkLCBTdHJpbmc+IG1pc3NpbmcgPSBuZXcgSGFzaE1hcDw+KCk7CiAJCQlmaW5hbCBMaXN0PFJldk9iamVjdD4gY29tbWl0cyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQkJZm9yIChmaW5hbCBNYXAuRW50cnk8T2JqZWN0SWQsIFN0cmluZz4gZSA6IHByZXJlcXMuZW50cnlTZXQoKSkgeworCQkJZm9yIChNYXAuRW50cnk8T2JqZWN0SWQsIFN0cmluZz4gZSA6IHByZXJlcXMuZW50cnlTZXQoKSkgewogCQkJCU9iamVjdElkIHAgPSBlLmdldEtleSgpOwogCQkJCXRyeSB7CiAJCQkJCWZpbmFsIFJldkNvbW1pdCBjID0gcncucGFyc2VDb21taXQocCk7CkBAIC0yNTQsMTMgKzI1MiwxMyBAQCBwcml2YXRlIHZvaWQgdmVyaWZ5UHJlcmVxdWlzaXRlcygpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQkJCXRocm93IG5ldyBNaXNzaW5nQnVuZGxlUHJlcmVxdWlzaXRlRXhjZXB0aW9uKHRyYW5zcG9ydC51cmksCiAJCQkJCQltaXNzaW5nKTsKIAotCQkJTWFwPFN0cmluZywgUmVmPiBsb2NhbFJlZnM7CisJCQlMaXN0PFJlZj4gbG9jYWxSZWZzOwogCQkJdHJ5IHsKLQkJCQlsb2NhbFJlZnMgPSB0cmFuc3BvcnQubG9jYWwuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7CisJCQkJbG9jYWxSZWZzID0gdHJhbnNwb3J0LmxvY2FsLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpOwogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24odHJhbnNwb3J0LnVyaSwgZS5nZXRNZXNzYWdlKCksIGUpOwogCQkJfQotCQkJZm9yIChmaW5hbCBSZWYgciA6IGxvY2FsUmVmcy52YWx1ZXMoKSkgeworCQkJZm9yIChSZWYgciA6IGxvY2FsUmVmcykgewogCQkJCXRyeSB7CiAJCQkJCXJ3Lm1hcmtTdGFydChydy5wYXJzZUNvbW1pdChyLmdldE9iamVjdElkKCkpKTsKIAkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiByZWFkRXJyb3IpIHsKQEAgLTI4NCw3ICsyODIsNyBAQCBwcml2YXRlIHZvaWQgdmVyaWZ5UHJlcmVxdWlzaXRlcygpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQkJfQogCiAJCQlpZiAocmVtYWluaW5nID4gMCkgewotCQkJCWZvciAoZmluYWwgUmV2T2JqZWN0IG8gOiBjb21taXRzKSB7CisJCQkJZm9yIChSZXZPYmplY3QgbyA6IGNvbW1pdHMpIHsKIAkJCQkJaWYgKCFvLmhhcyhTRUVOKSkKIAkJCQkJCW1pc3NpbmcucHV0KG8sIHByZXJlcXMuZ2V0KG8pKTsKIAkJCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9CdW5kbGVXcml0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZVdyaXRlci5qYXZhCmluZGV4IDM1YWM3NzkuLmYyYTI2MWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZVdyaXRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0J1bmRsZVdyaXRlci5qYXZhCkBAIC0xNTEsNyArMTUxLDcgQEAgcHVibGljIHZvaWQgc2V0UGFja0NvbmZpZyhQYWNrQ29uZmlnIHBjKSB7CiAJICogQHBhcmFtIGlkCiAJICogICAgICAgICAgICBvYmplY3QgdG8gcGFjay4gTXVsdGlwbGUgcmVmcyBtYXkgcG9pbnQgdG8gdGhlIHNhbWUgb2JqZWN0LgogCSAqLwotCXB1YmxpYyB2b2lkIGluY2x1ZGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHVibGljIHZvaWQgaW5jbHVkZShTdHJpbmcgbmFtZSwgQW55T2JqZWN0SWQgaWQpIHsKIAkJYm9vbGVhbiB2YWxpZFJlZk5hbWUgPSBSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKG5hbWUpIHx8IENvbnN0YW50cy5IRUFELmVxdWFscyhuYW1lKTsKIAkJaWYgKCF2YWxpZFJlZk5hbWUpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWRSZWZOYW1lLCBuYW1lKSk7CkBAIC0xNjksNyArMTY5LDcgQEAgcHVibGljIHZvaWQgaW5jbHVkZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKIAkgKiBAcGFyYW0gcgogCSAqICAgICAgICAgICAgdGhlIHJlZiB0byBpbmNsdWRlLgogCSAqLwotCXB1YmxpYyB2b2lkIGluY2x1ZGUoZmluYWwgUmVmIHIpIHsKKwlwdWJsaWMgdm9pZCBpbmNsdWRlKFJlZiByKSB7CiAJCWluY2x1ZGUoci5nZXROYW1lKCksIHIuZ2V0T2JqZWN0SWQoKSk7CiAKIAkJaWYgKHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSAhPSBudWxsKQpAQCAtMTkyLDcgKzE5Miw3IEBAIGVsc2UgaWYgKHIuZ2V0T2JqZWN0SWQoKSAhPSBudWxsCiAJICogICAgICAgICAgICBwYXJzZWQgYW5kIG5vdCBkaXNwb3NlZCBpbiBvcmRlciB0byBtYXhpbWl6ZSB0aGUgYW1vdW50IG9mCiAJICogICAgICAgICAgICBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIHRoZSBidW5kbGUgc3RyZWFtLgogCSAqLwotCXB1YmxpYyB2b2lkIGFzc3VtZShmaW5hbCBSZXZDb21taXQgYykgeworCXB1YmxpYyB2b2lkIGFzc3VtZShSZXZDb21taXQgYykgewogCQlpZiAoYyAhPSBudWxsKQogCQkJYXNzdW1lLmFkZChjKTsKIAl9CkBAIC0yMjEsNyArMjIxLDcgQEAgcHVibGljIHZvaWQgd3JpdGVCdW5kbGUoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE91dHB1dFN0cmVhbSBvcykKIAkJCWZpbmFsIEhhc2hTZXQ8T2JqZWN0SWQ+IGluYyA9IG5ldyBIYXNoU2V0PD4oKTsKIAkJCWZpbmFsIEhhc2hTZXQ8T2JqZWN0SWQ+IGV4YyA9IG5ldyBIYXNoU2V0PD4oKTsKIAkJCWluYy5hZGRBbGwoaW5jbHVkZS52YWx1ZXMoKSk7Ci0JCQlmb3IgKGZpbmFsIFJldkNvbW1pdCByIDogYXNzdW1lKQorCQkJZm9yIChSZXZDb21taXQgciA6IGFzc3VtZSkKIAkJCQlleGMuYWRkKHIuZ2V0SWQoKSk7CiAJCQlwYWNrV3JpdGVyLnNldEluZGV4RGlzYWJsZWQodHJ1ZSk7CiAJCQlwYWNrV3JpdGVyLnNldERlbHRhQmFzZUFzT2Zmc2V0KHRydWUpOwpAQCAtMjM2LDcgKzIzNiw3IEBAIHB1YmxpYyB2b2lkIHdyaXRlQnVuZGxlKFByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPdXRwdXRTdHJlYW0gb3MpCiAJCQl3LndyaXRlKCdcbicpOwogCiAJCQlmaW5hbCBjaGFyW10gdG1wID0gbmV3IGNoYXJbQ29uc3RhbnRzLk9CSkVDVF9JRF9TVFJJTkdfTEVOR1RIXTsKLQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IGEgOiBhc3N1bWUpIHsKKwkJCWZvciAoUmV2Q29tbWl0IGEgOiBhc3N1bWUpIHsKIAkJCQl3LndyaXRlKCctJyk7CiAJCQkJYS5jb3B5VG8odG1wLCB3KTsKIAkJCQlpZiAoYS5nZXRSYXdCdWZmZXIoKSAhPSBudWxsKSB7CkBAIC0yNDUsNyArMjQ1LDcgQEAgcHVibGljIHZvaWQgd3JpdGVCdW5kbGUoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIE91dHB1dFN0cmVhbSBvcykKIAkJCQl9CiAJCQkJdy53cml0ZSgnXG4nKTsKIAkJCX0KLQkJCWZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0SWQ+IGUgOiBpbmNsdWRlLmVudHJ5U2V0KCkpIHsKKwkJCWZvciAoTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0SWQ+IGUgOiBpbmNsdWRlLmVudHJ5U2V0KCkpIHsKIAkJCQllLmdldFZhbHVlKCkuY29weVRvKHRtcCwgdyk7CiAJCQkJdy53cml0ZSgnICcpOwogCQkJCXcud3JpdGUoZS5nZXRLZXkoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Db25uZWN0aW9uLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Db25uZWN0aW9uLmphdmEKaW5kZXggYmNjNTExMC4uZDRjNTE0ZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0Nvbm5lY3Rpb24uamF2YQpAQCAtOTUsNyArOTUsNyBAQCBwdWJsaWMgaW50ZXJmYWNlIENvbm5lY3Rpb24gZXh0ZW5kcyBBdXRvQ2xvc2VhYmxlIHsKIAkgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIHJlZiB0byBvYnRhaW4uCiAJICogQHJldHVybiB0aGUgcmVxdWVzdGVkIHJlZjsgbnVsbCBpZiB0aGUgcmVtb3RlIGRpZCBub3QgYWR2ZXJ0aXNlIHRoaXMgcmVmLgogCSAqLwotCXB1YmxpYyBSZWYgZ2V0UmVmKGZpbmFsIFN0cmluZyBuYW1lKTsKKwlwdWJsaWMgUmVmIGdldFJlZihTdHJpbmcgbmFtZSk7CiAKIAkvKioKIAkgKiB7QGluaGVyaXREb2N9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vbi5qYXZhCmluZGV4IDJmYzVlYjIuLjcyODljZTcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vbi5qYXZhCkBAIC01Myw3ICs1Myw5IEBACiBpbXBvcnQgamF2YS5uZXQuU29ja2V0QWRkcmVzczsKIGltcG9ydCBqYXZhLm5ldC5Tb2NrZXRFeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLkpHaXRUZXh0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlBlcnNvbklkZW50OwpAQCAtMTA3LDcgKzEwOSw3IEBAIHB1YmxpYyBEYWVtb24oKSB7CiAJICogICAgICAgICAgICBwb3J0IHdpbGwgYmUgY2hvc2VuIG9uIGFsbCBuZXR3b3JrIGludGVyZmFjZXMuCiAJICovCiAJQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0JcHVibGljIERhZW1vbihmaW5hbCBJbmV0U29ja2V0QWRkcmVzcyBhZGRyKSB7CisJcHVibGljIERhZW1vbihJbmV0U29ja2V0QWRkcmVzcyBhZGRyKSB7CiAJCW15QWRkcmVzcyA9IGFkZHI7CiAJCXByb2Nlc3NvcnMgPSBuZXcgVGhyZWFkR3JvdXAoIkdpdC1EYWVtb24iKTsgLy8kTk9OLU5MUy0xJAogCkBAIC0xNTMsMTIgKzE1NSwxNyBAQCBwdWJsaWMgUmVjZWl2ZVBhY2sgY3JlYXRlKERhZW1vbkNsaWVudCByZXEsIFJlcG9zaXRvcnkgZGIpCiAKIAkJCQkJQE92ZXJyaWRlCiAJCQkJCXByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoZmluYWwgRGFlbW9uQ2xpZW50IGRjLAotCQkJCQkJCWZpbmFsIFJlcG9zaXRvcnkgZGIpIHRocm93cyBJT0V4Y2VwdGlvbiwKKwkJCQkJCQlmaW5hbCBSZXBvc2l0b3J5IGRiLAorCQkJCQkJCUBOdWxsYWJsZSBDb2xsZWN0aW9uPFN0cmluZz4gZXh0cmFQYXJhbWV0ZXJzKQorCQkJCQkJCXRocm93cyBJT0V4Y2VwdGlvbiwKIAkJCQkJCQlTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwKIAkJCQkJCQlTZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbiB7CiAJCQkJCQlVcGxvYWRQYWNrIHVwID0gdXBsb2FkUGFja0ZhY3RvcnkuY3JlYXRlKGRjLCBkYik7CiAJCQkJCQlJbnB1dFN0cmVhbSBpbiA9IGRjLmdldElucHV0U3RyZWFtKCk7CiAJCQkJCQlPdXRwdXRTdHJlYW0gb3V0ID0gZGMuZ2V0T3V0cHV0U3RyZWFtKCk7CisJCQkJCQlpZiAoZXh0cmFQYXJhbWV0ZXJzICE9IG51bGwpIHsKKwkJCQkJCQl1cC5zZXRFeHRyYVBhcmFtZXRlcnMoZXh0cmFQYXJhbWV0ZXJzKTsKKwkJCQkJCX0KIAkJCQkJCXVwLnVwbG9hZChpbiwgb3V0LCBudWxsKTsKIAkJCQkJfQogCQkJCX0sIG5ldyBEYWVtb25TZXJ2aWNlKCJyZWNlaXZlLXBhY2siLCAicmVjZWl2ZXBhY2siKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApAQCAtMTY4LDcgKzE3NSw5IEBAIHByb3RlY3RlZCB2b2lkIGV4ZWN1dGUoZmluYWwgRGFlbW9uQ2xpZW50IGRjLAogCiAJCQkJCUBPdmVycmlkZQogCQkJCQlwcm90ZWN0ZWQgdm9pZCBleGVjdXRlKGZpbmFsIERhZW1vbkNsaWVudCBkYywKLQkJCQkJCQlmaW5hbCBSZXBvc2l0b3J5IGRiKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJCQkJCQkJZmluYWwgUmVwb3NpdG9yeSBkYiwKKwkJCQkJCQlATnVsbGFibGUgQ29sbGVjdGlvbjxTdHJpbmc+IGV4dHJhUGFyYW1ldGVycykKKwkJCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQkJCQkJU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24sCiAJCQkJCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gewogCQkJCQkJUmVjZWl2ZVBhY2sgcnAgPSByZWNlaXZlUGFja0ZhY3RvcnkuY3JlYXRlKGRjLCBkYik7CkBAIC0yMDAsNyArMjA5LDcgQEAgcHVibGljIHN5bmNocm9uaXplZCBJbmV0U29ja2V0QWRkcmVzcyBnZXRBZGRyZXNzKCkgewogCXB1YmxpYyBzeW5jaHJvbml6ZWQgRGFlbW9uU2VydmljZSBnZXRTZXJ2aWNlKFN0cmluZyBuYW1lKSB7CiAJCWlmICghbmFtZS5zdGFydHNXaXRoKCJnaXQtIikpIC8vJE5PTi1OTFMtMSQKIAkJCW5hbWUgPSAiZ2l0LSIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0JCWZvciAoZmluYWwgRGFlbW9uU2VydmljZSBzIDogc2VydmljZXMpIHsKKwkJZm9yIChEYWVtb25TZXJ2aWNlIHMgOiBzZXJ2aWNlcykgewogCQkJaWYgKHMuZ2V0Q29tbWFuZE5hbWUoKS5lcXVhbHMobmFtZSkpCiAJCQkJcmV0dXJuIHM7CiAJCX0KQEAgLTIyNCw3ICsyMzMsNyBAQCBwdWJsaWMgaW50IGdldFRpbWVvdXQoKSB7CiAJICogICAgICAgICAgICBiZWZvcmUgYWJvcnRpbmcgYW4gSU8gcmVhZCBvciB3cml0ZSBvcGVyYXRpb24gd2l0aCB0aGUKIAkgKiAgICAgICAgICAgIGNvbm5lY3RlZCBjbGllbnQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChmaW5hbCBpbnQgc2Vjb25kcykgeworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IHNlY29uZHMpIHsKIAkJdGltZW91dCA9IHNlY29uZHM7CiAJfQogCkBAIC00MTEsNyArNDIwLDcgQEAgcHVibGljIHZvaWQgc3RvcEFuZFdhaXQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gewogCQl9CiAJfQogCi0Jdm9pZCBzdGFydENsaWVudChmaW5hbCBTb2NrZXQgcykgeworCXZvaWQgc3RhcnRDbGllbnQoU29ja2V0IHMpIHsKIAkJZmluYWwgRGFlbW9uQ2xpZW50IGRjID0gbmV3IERhZW1vbkNsaWVudCh0aGlzKTsKIAogCQlmaW5hbCBTb2NrZXRBZGRyZXNzIHBlZXIgPSBzLmdldFJlbW90ZVNvY2tldEFkZHJlc3MoKTsKQEAgLTQ0NSw4ICs0NTQsOCBAQCBwdWJsaWMgdm9pZCBydW4oKSB7CiAJCX0uc3RhcnQoKTsKIAl9CiAKLQlzeW5jaHJvbml6ZWQgRGFlbW9uU2VydmljZSBtYXRjaFNlcnZpY2UoZmluYWwgU3RyaW5nIGNtZCkgewotCQlmb3IgKGZpbmFsIERhZW1vblNlcnZpY2UgZCA6IHNlcnZpY2VzKSB7CisJc3luY2hyb25pemVkIERhZW1vblNlcnZpY2UgbWF0Y2hTZXJ2aWNlKFN0cmluZyBjbWQpIHsKKwkJZm9yIChEYWVtb25TZXJ2aWNlIGQgOiBzZXJ2aWNlcykgewogCQkJaWYgKGQuaGFuZGxlcyhjbWQpKQogCQkJCXJldHVybiBkOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb25DbGllbnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vbkNsaWVudC5qYXZhCmluZGV4IGE5NzMxYWMuLjUxYzQ5MTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vbkNsaWVudC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vbkNsaWVudC5qYXZhCkBAIC01MCw2ICs1MCw4IEBACiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CiBpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5yZXNvbHZlci5TZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbjsKQEAgLTY2LDExICs2OCwxMSBAQCBwdWJsaWMgY2xhc3MgRGFlbW9uQ2xpZW50IHsKIAogCXByaXZhdGUgT3V0cHV0U3RyZWFtIHJhd091dDsKIAotCURhZW1vbkNsaWVudChmaW5hbCBEYWVtb24gZCkgeworCURhZW1vbkNsaWVudChEYWVtb24gZCkgewogCQlkYWVtb24gPSBkOwogCX0KIAotCXZvaWQgc2V0UmVtb3RlQWRkcmVzcyhmaW5hbCBJbmV0QWRkcmVzcyBpYSkgeworCXZvaWQgc2V0UmVtb3RlQWRkcmVzcyhJbmV0QWRkcmVzcyBpYSkgewogCQlwZWVyID0gaWE7CiAJfQogCkBAIC0xMTAsNyArMTEyLDcgQEAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB7CiAJCXJldHVybiByYXdPdXQ7CiAJfQogCi0Jdm9pZCBleGVjdXRlKGZpbmFsIFNvY2tldCBzb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24sCisJdm9pZCBleGVjdXRlKFNvY2tldCBzb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlTZXJ2aWNlTm90RW5hYmxlZEV4Y2VwdGlvbiwgU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gewogCQlyYXdJbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHNvY2suZ2V0SW5wdXRTdHJlYW0oKSk7CiAJCXJhd091dCA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShzb2NrLmdldE91dHB1dFN0cmVhbSgpKTsKQEAgLTExOCw2ICsxMjAsMTQgQEAgdm9pZCBleGVjdXRlKGZpbmFsIFNvY2tldCBzb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCWlmICgwIDwgZGFlbW9uLmdldFRpbWVvdXQoKSkKIAkJCXNvY2suc2V0U29UaW1lb3V0KGRhZW1vbi5nZXRUaW1lb3V0KCkgKiAxMDAwKTsKIAkJU3RyaW5nIGNtZCA9IG5ldyBQYWNrZXRMaW5lSW4ocmF3SW4pLnJlYWRTdHJpbmdSYXcoKTsKKworCQlDb2xsZWN0aW9uPFN0cmluZz4gZXh0cmFQYXJhbWV0ZXJzID0gbnVsbDsKKworCQlpbnQgbnVsbnVsID0gY21kLmluZGV4T2YoIlwwXDAiKTsgLy8kTk9OLU5MUy0xJAorCQlpZiAobnVsbnVsICE9IC0xKSB7CisJCQlleHRyYVBhcmFtZXRlcnMgPSBBcnJheXMuYXNMaXN0KGNtZC5zdWJzdHJpbmcobnVsbnVsICsgMikuc3BsaXQoIlwwIikpOyAvLyROT04tTkxTLTEkCisJCX0KKwogCQlmaW5hbCBpbnQgbnVsID0gY21kLmluZGV4T2YoJ1wwJyk7CiAJCWlmIChudWwgPj0gMCkgewogCQkJLy8gTmV3ZXIgY2xpZW50cyBoaWRlIGEgImhvc3QiIGhlYWRlciBiZWhpbmQgdGhpcyBieXRlLgpAQCAtMTMxLDYgKzE0MSw2IEBAIHZvaWQgZXhlY3V0ZShmaW5hbCBTb2NrZXQgc29jaykgdGhyb3dzIElPRXhjZXB0aW9uLAogCQlpZiAoc3J2ID09IG51bGwpCiAJCQlyZXR1cm47CiAJCXNvY2suc2V0U29UaW1lb3V0KDApOwotCQlzcnYuZXhlY3V0ZSh0aGlzLCBjbWQpOworCQlzcnYuZXhlY3V0ZSh0aGlzLCBjbWQsIGV4dHJhUGFyYW1ldGVycyk7CiAJfQogfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGFlbW9uU2VydmljZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRGFlbW9uU2VydmljZS5qYXZhCmluZGV4IDcxMmViMjIuLjZkMmJlZTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RhZW1vblNlcnZpY2UuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EYWVtb25TZXJ2aWNlLmphdmEKQEAgLTQ1LDcgKzQ1LDkgQEAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25maWc7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uZmlnLlNlY3Rpb25QYXJzZXI7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKQEAgLTY1LDcgKzY3LDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIERhZW1vblNlcnZpY2UgewogCiAJcHJpdmF0ZSBib29sZWFuIG92ZXJyaWRhYmxlOwogCi0JRGFlbW9uU2VydmljZShmaW5hbCBTdHJpbmcgY21kTmFtZSwgZmluYWwgU3RyaW5nIGNmZ05hbWUpIHsKKwlEYWVtb25TZXJ2aWNlKFN0cmluZyBjbWROYW1lLCBTdHJpbmcgY2ZnTmFtZSkgewogCQljb21tYW5kID0gY21kTmFtZS5zdGFydHNXaXRoKCJnaXQtIikgPyBjbWROYW1lIDogImdpdC0iICsgY21kTmFtZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCWNvbmZpZ0tleSA9IGNmZyAtPiBuZXcgU2VydmljZUNvbmZpZyhEYWVtb25TZXJ2aWNlLnRoaXMsIGNmZywgY2ZnTmFtZSk7CiAJCW92ZXJyaWRhYmxlID0gdHJ1ZTsKQEAgLTk2LDcgKzk4LDcgQEAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewogCSAqICAgICAgICAgICAge0Bjb2RlIHRydWV9IHRvIGFsbG93IHRoaXMgc2VydmljZSB0byBiZSB1c2VkOyB7QGNvZGUgZmFsc2V9CiAJICogICAgICAgICAgICB0byBkZW55IGl0LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoZmluYWwgYm9vbGVhbiBvbikgeworCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBvbikgewogCQllbmFibGVkID0gb247CiAJfQogCkBAIC0xMjAsNyArMTIyLDcgQEAgcHVibGljIGJvb2xlYW4gaXNPdmVycmlkYWJsZSgpIHsKIAkgKiAgICAgICAgICAgIGVuYWJsZWQgc3RhdGUgd2l0aCB0aGUgPGNvZGU+ZGFlbW9uLnNlcnZpY2VuYW1lPC9jb2RlPiBjb25maWcKIAkgKiAgICAgICAgICAgIHNldHRpbmcuCiAJICovCi0JcHVibGljIHZvaWQgc2V0T3ZlcnJpZGFibGUoZmluYWwgYm9vbGVhbiBvbikgeworCXB1YmxpYyB2b2lkIHNldE92ZXJyaWRhYmxlKGJvb2xlYW4gb24pIHsKIAkJb3ZlcnJpZGFibGUgPSBvbjsKIAl9CiAKQEAgLTE0MCwxOSArMTQyLDIwIEBAIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWFuZE5hbWUoKSB7CiAJICogICAgICAgICAgICBpbnB1dCBsaW5lIGZyb20gdGhlIGNsaWVudC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBjb21tYW5kIGNhbiBhY2NlcHQgdGhlIGdpdmVuIGNvbW1hbmQgbGluZS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYW5kbGVzKGZpbmFsIFN0cmluZyBjb21tYW5kTGluZSkgeworCXB1YmxpYyBib29sZWFuIGhhbmRsZXMoU3RyaW5nIGNvbW1hbmRMaW5lKSB7CiAJCXJldHVybiBjb21tYW5kLmxlbmd0aCgpICsgMSA8IGNvbW1hbmRMaW5lLmxlbmd0aCgpCiAJCQkJJiYgY29tbWFuZExpbmUuY2hhckF0KGNvbW1hbmQubGVuZ3RoKCkpID09ICcgJwogCQkJCSYmIGNvbW1hbmRMaW5lLnN0YXJ0c1dpdGgoY29tbWFuZCk7CiAJfQogCi0Jdm9pZCBleGVjdXRlKGZpbmFsIERhZW1vbkNsaWVudCBjbGllbnQsIGZpbmFsIFN0cmluZyBjb21tYW5kTGluZSkKKwl2b2lkIGV4ZWN1dGUoRGFlbW9uQ2xpZW50IGNsaWVudCwgU3RyaW5nIGNvbW1hbmRMaW5lLAorCQkJQE51bGxhYmxlIENvbGxlY3Rpb248U3RyaW5nPiBleHRyYVBhcmFtZXRlcnMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAogCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGNvbW1hbmRMaW5lLnN1YnN0cmluZyhjb21tYW5kLmxlbmd0aCgpICsgMSk7CiAJCXRyeSAoUmVwb3NpdG9yeSBkYiA9IGNsaWVudC5nZXREYWVtb24oKS5vcGVuUmVwb3NpdG9yeShjbGllbnQsIG5hbWUpKSB7CiAJCQlpZiAoaXNFbmFibGVkRm9yKGRiKSkgewotCQkJCWV4ZWN1dGUoY2xpZW50LCBkYik7CisJCQkJZXhlY3V0ZShjbGllbnQsIGRiLCBleHRyYVBhcmFtZXRlcnMpOwogCQkJfQogCQl9IGNhdGNoIChTZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24gZSkgewogCQkJLy8gQW4gZXJyb3Igd2hlbiBvcGVuaW5nIHRoZSByZXBvIG1lYW5zIHRoZSBjbGllbnQgaXMgZXhwZWN0aW5nIGEgcmVmCkBAIC0xNjIsMTMgKzE2NSwxNCBAQCB2b2lkIGV4ZWN1dGUoZmluYWwgRGFlbW9uQ2xpZW50IGNsaWVudCwgZmluYWwgU3RyaW5nIGNvbW1hbmRMaW5lKQogCQl9CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZEZvcihmaW5hbCBSZXBvc2l0b3J5IGRiKSB7CisJcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZEZvcihSZXBvc2l0b3J5IGRiKSB7CiAJCWlmIChpc092ZXJyaWRhYmxlKCkpCiAJCQlyZXR1cm4gZGIuZ2V0Q29uZmlnKCkuZ2V0KGNvbmZpZ0tleSkuZW5hYmxlZDsKIAkJcmV0dXJuIGlzRW5hYmxlZCgpOwogCX0KIAotCWFic3RyYWN0IHZvaWQgZXhlY3V0ZShEYWVtb25DbGllbnQgY2xpZW50LCBSZXBvc2l0b3J5IGRiKQorCWFic3RyYWN0IHZvaWQgZXhlY3V0ZShEYWVtb25DbGllbnQgY2xpZW50LCBSZXBvc2l0b3J5IGRiLAorCQkJQE51bGxhYmxlIENvbGxlY3Rpb248U3RyaW5nPiBleHRyYVBhcmFtZXRlcnMpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZpY2VOb3RFbmFibGVkRXhjZXB0aW9uLAogCQkJU2VydmljZU5vdEF1dGhvcml6ZWRFeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9EZWZhdWx0U3NoU2Vzc2lvbkZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RlZmF1bHRTc2hTZXNzaW9uRmFjdG9yeS5qYXZhCmluZGV4IGE3NDlmYmMuLjVmNzRlNzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RlZmF1bHRTc2hTZXNzaW9uRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0RlZmF1bHRTc2hTZXNzaW9uRmFjdG9yeS5qYXZhCkBAIC02MSw3ICs2MSw3IEBACiBjbGFzcyBEZWZhdWx0U3NoU2Vzc2lvbkZhY3RvcnkgZXh0ZW5kcyBKc2NoQ29uZmlnU2Vzc2lvbkZhY3RvcnkgewogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKGZpbmFsIE9wZW5Tc2hDb25maWcuSG9zdCBoYywgZmluYWwgU2Vzc2lvbiBzZXNzaW9uKSB7CisJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKE9wZW5Tc2hDb25maWcuSG9zdCBoYywgU2Vzc2lvbiBzZXNzaW9uKSB7CiAJCS8vIE5vIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiByZXF1aXJlZC4KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaEhlYWRSZWNvcmQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoSGVhZFJlY29yZC5qYXZhCmluZGV4IDQyMWVmMjEuLjM0YWIzNjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoSGVhZFJlY29yZC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoSGVhZFJlY29yZC5qYXZhCkBAIC02Myw3ICs2Myw3IEBAIGNsYXNzIEZldGNoSGVhZFJlY29yZCB7CiAKIAlVUklpc2ggc291cmNlVVJJOwogCi0Jdm9pZCB3cml0ZShmaW5hbCBXcml0ZXIgcHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCB3cml0ZShXcml0ZXIgcHcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIFN0cmluZyB0eXBlOwogCQlmaW5hbCBTdHJpbmcgbmFtZTsKIAkJaWYgKHNvdXJjZU5hbWUuc3RhcnRzV2l0aChSX0hFQURTKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hQcm9jZXNzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaFByb2Nlc3MuamF2YQppbmRleCAxMTdlODQ0Li5jNDNhYjE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaFByb2Nlc3MuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaFByb2Nlc3MuamF2YQpAQCAtMTA2LDEyICsxMDYsMTIgQEAgY2xhc3MgRmV0Y2hQcm9jZXNzIHsKIAogCXByaXZhdGUgTWFwPFN0cmluZywgUmVmPiBsb2NhbFJlZnM7CiAKLQlGZXRjaFByb2Nlc3MoZmluYWwgVHJhbnNwb3J0IHQsIGZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gZikgeworCUZldGNoUHJvY2VzcyhUcmFuc3BvcnQgdCwgQ29sbGVjdGlvbjxSZWZTcGVjPiBmKSB7CiAJCXRyYW5zcG9ydCA9IHQ7CiAJCXRvRmV0Y2ggPSBmOwogCX0KIAotCXZvaWQgZXhlY3V0ZShmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgRmV0Y2hSZXN1bHQgcmVzdWx0KQorCXZvaWQgZXhlY3V0ZShQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgRmV0Y2hSZXN1bHQgcmVzdWx0KQogCQkJdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJYXNrRm9yLmNsZWFyKCk7CiAJCWxvY2FsVXBkYXRlcy5jbGVhcigpOwpAQCAtMTIzLDcgKzEyMyw3IEBAIHZvaWQgZXhlY3V0ZShmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgZmluYWwgRmV0Y2hSZXN1bHQgcmVzdWx0KQogCQkJZXhlY3V0ZUltcChtb25pdG9yLCByZXN1bHQpOwogCQl9IGZpbmFsbHkgewogCQkJdHJ5IHsKLQkJCWZvciAoZmluYWwgUGFja0xvY2sgbG9jayA6IHBhY2tMb2NrcykKKwkJCWZvciAoUGFja0xvY2sgbG9jayA6IHBhY2tMb2NrcykKIAkJCQlsb2NrLnVubG9jaygpOwogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewogCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwpAQCAtMTM5LDcgKzEzOSw3IEBAIHByaXZhdGUgdm9pZCBleGVjdXRlSW1wKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAogCQkJcmVzdWx0LnNldEFkdmVydGlzZWRSZWZzKHRyYW5zcG9ydC5nZXRVUkkoKSwgY29ubi5nZXRSZWZzTWFwKCkpOwogCQkJcmVzdWx0LnBlZXJVc2VyQWdlbnQgPSBjb25uLmdldFBlZXJVc2VyQWdlbnQoKTsKIAkJCWZpbmFsIFNldDxSZWY+IG1hdGNoZWQgPSBuZXcgSGFzaFNldDw+KCk7Ci0JCQlmb3IgKGZpbmFsIFJlZlNwZWMgc3BlYyA6IHRvRmV0Y2gpIHsKKwkJCWZvciAoUmVmU3BlYyBzcGVjIDogdG9GZXRjaCkgewogCQkJCWlmIChzcGVjLmdldFNvdXJjZSgpID09IG51bGwpCiAJCQkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCQkJSkdpdFRleHQuZ2V0KCkuc291cmNlUmVmTm90U3BlY2lmaWVkRm9yUmVmc3BlYywgc3BlYykpOwpAQCAtMTc2LDcgKzE3Niw3IEBAIGVsc2UgaWYgKHRhZ29wdCA9PSBUYWdPcHQuRkVUQ0hfVEFHUykKIAkJCQkvLwogCQkJCWhhdmUuYWRkQWxsKGFza0Zvci5rZXlTZXQoKSk7CiAJCQkJYXNrRm9yLmNsZWFyKCk7Ci0JCQkJZm9yIChmaW5hbCBSZWYgciA6IGFkZGl0aW9uYWxUYWdzKSB7CisJCQkJZm9yIChSZWYgciA6IGFkZGl0aW9uYWxUYWdzKSB7CiAJCQkJCU9iamVjdElkIGlkID0gci5nZXRQZWVsZWRPYmplY3RJZCgpOwogCQkJCQlpZiAoaWQgPT0gbnVsbCkKIAkJCQkJCWlkID0gci5nZXRPYmplY3RJZCgpOwpAQCAtMTk4LDcgKzE5OCw3IEBAIGVsc2UgaWYgKHRhZ29wdCA9PSBUYWdPcHQuRkVUQ0hfVEFHUykKIAkJCQkubmV3QmF0Y2hVcGRhdGUoKQogCQkJCS5zZXRBbGxvd05vbkZhc3RGb3J3YXJkcyh0cnVlKQogCQkJCS5zZXRSZWZMb2dNZXNzYWdlKCJmZXRjaCIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCXRyeSAoZmluYWwgUmV2V2FsayB3YWxrID0gbmV3IFJldldhbGsodHJhbnNwb3J0LmxvY2FsKSkgeworCQl0cnkgKFJldldhbGsgd2FsayA9IG5ldyBSZXZXYWxrKHRyYW5zcG9ydC5sb2NhbCkpIHsKIAkJCWlmIChtb25pdG9yIGluc3RhbmNlb2YgQmF0Y2hpbmdQcm9ncmVzc01vbml0b3IpIHsKIAkJCQkoKEJhdGNoaW5nUHJvZ3Jlc3NNb25pdG9yKSBtb25pdG9yKS5zZXREZWxheVN0YXJ0KAogCQkJCQkJMjUwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwpAQCAtMjU3LDcgKzI1Nyw3IEBAIHByaXZhdGUgdm9pZCBhZGRVcGRhdGVCYXRjaENvbW1hbmRzKEZldGNoUmVzdWx0IHJlc3VsdCwKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBmZXRjaE9iamVjdHMoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCisJcHJpdmF0ZSB2b2lkIGZldGNoT2JqZWN0cyhQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgewogCQkJY29ubi5zZXRQYWNrTG9ja01lc3NhZ2UoImpnaXQgZmV0Y2ggIiArIHRyYW5zcG9ydC51cmkpOyAvLyROT04tTkxTLTEkCkBAIC0yNzEsNyArMjcxLDcgQEAgcHJpdmF0ZSB2b2lkIGZldGNoT2JqZWN0cyhmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKIAkJCQkJSkdpdFRleHQuZ2V0KCkucGVlckRpZE5vdFN1cHBseUFDb21wbGV0ZU9iamVjdEdyYXBoKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgY2xvc2VDb25uZWN0aW9uKGZpbmFsIEZldGNoUmVzdWx0IHJlc3VsdCkgeworCXByaXZhdGUgdm9pZCBjbG9zZUNvbm5lY3Rpb24oRmV0Y2hSZXN1bHQgcmVzdWx0KSB7CiAJCWlmIChjb25uICE9IG51bGwpIHsKIAkJCWNvbm4uY2xvc2UoKTsKIAkJCXJlc3VsdC5hZGRNZXNzYWdlcyhjb25uLmdldE1lc3NhZ2VzKCkpOwpAQCAtMjk1LDEyICsyOTUsMTIgQEAgcHJpdmF0ZSB2b2lkIHJlb3BlbkNvbm5lY3Rpb24oKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLAogCQkvLyBuZXcgY29ubmVjdGlvbiBoYXMgb2ZmZXJlZCB0byB1cy4KIAkJLy8KIAkJZmluYWwgSGFzaE1hcDxPYmplY3RJZCwgUmVmPiBhdmFpbCA9IG5ldyBIYXNoTWFwPD4oKTsKLQkJZm9yIChmaW5hbCBSZWYgciA6IGNvbm4uZ2V0UmVmcygpKQorCQlmb3IgKFJlZiByIDogY29ubi5nZXRSZWZzKCkpCiAJCQlhdmFpbC5wdXQoci5nZXRPYmplY3RJZCgpLCByKTsKIAogCQlmaW5hbCBDb2xsZWN0aW9uPFJlZj4gd2FudHMgPSBuZXcgQXJyYXlMaXN0PD4oYXNrRm9yLnZhbHVlcygpKTsKIAkJYXNrRm9yLmNsZWFyKCk7Ci0JCWZvciAoZmluYWwgUmVmIHdhbnQgOiB3YW50cykgeworCQlmb3IgKFJlZiB3YW50IDogd2FudHMpIHsKIAkJCWZpbmFsIFJlZiBuZXdSZWYgPSBhdmFpbC5nZXQod2FudC5nZXRPYmplY3RJZCgpKTsKIAkJCWlmIChuZXdSZWYgIT0gbnVsbCkgewogCQkJCWFza0Zvci5wdXQobmV3UmVmLmdldE9iamVjdElkKCksIG5ld1JlZik7CkBAIC0zMTEsNyArMzExLDcgQEAgcHJpdmF0ZSB2b2lkIHJlb3BlbkNvbm5lY3Rpb24oKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVRyYWNraW5nUmVmVXBkYXRlKGZpbmFsIE9iamVjdElkIHdhbnQpIHsKKwlwcml2YXRlIHZvaWQgcmVtb3ZlVHJhY2tpbmdSZWZVcGRhdGUoT2JqZWN0SWQgd2FudCkgewogCQlmaW5hbCBJdGVyYXRvcjxUcmFja2luZ1JlZlVwZGF0ZT4gaSA9IGxvY2FsVXBkYXRlcy5pdGVyYXRvcigpOwogCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKIAkJCWZpbmFsIFRyYWNraW5nUmVmVXBkYXRlIHUgPSBpLm5leHQoKTsKQEAgLTMyMCw3ICszMjAsNyBAQCBwcml2YXRlIHZvaWQgcmVtb3ZlVHJhY2tpbmdSZWZVcGRhdGUoZmluYWwgT2JqZWN0SWQgd2FudCkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUZldGNoSGVhZFJlY29yZChmaW5hbCBPYmplY3RJZCB3YW50KSB7CisJcHJpdmF0ZSB2b2lkIHJlbW92ZUZldGNoSGVhZFJlY29yZChPYmplY3RJZCB3YW50KSB7CiAJCWZpbmFsIEl0ZXJhdG9yPEZldGNoSGVhZFJlY29yZD4gaSA9IGZldGNoSGVhZFVwZGF0ZXMuaXRlcmF0b3IoKTsKIAkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7CiAJCQlmaW5hbCBGZXRjaEhlYWRSZWNvcmQgZmggPSBpLm5leHQoKTsKQEAgLTMyOSw3ICszMjksNyBAQCBwcml2YXRlIHZvaWQgcmVtb3ZlRmV0Y2hIZWFkUmVjb3JkKGZpbmFsIE9iamVjdElkIHdhbnQpIHsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCB1cGRhdGVGRVRDSF9IRUFEKGZpbmFsIEZldGNoUmVzdWx0IHJlc3VsdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgdXBkYXRlRkVUQ0hfSEVBRChGZXRjaFJlc3VsdCByZXN1bHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCUZpbGUgbWV0YSA9IHRyYW5zcG9ydC5sb2NhbC5nZXREaXJlY3RvcnkoKTsKIAkJaWYgKG1ldGEgPT0gbnVsbCkKIAkJCXJldHVybjsKQEAgLTMzOCw3ICszMzgsNyBAQCBwcml2YXRlIHZvaWQgdXBkYXRlRkVUQ0hfSEVBRChmaW5hbCBGZXRjaFJlc3VsdCByZXN1bHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlpZiAobG9jay5sb2NrKCkpIHsKIAkJCQl0cnkgKFdyaXRlciB3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcigKIAkJCQkJCWxvY2suZ2V0T3V0cHV0U3RyZWFtKCkpKSB7Ci0JCQkJCWZvciAoZmluYWwgRmV0Y2hIZWFkUmVjb3JkIGggOiBmZXRjaEhlYWRVcGRhdGVzKSB7CisJCQkJCWZvciAoRmV0Y2hIZWFkUmVjb3JkIGggOiBmZXRjaEhlYWRVcGRhdGVzKSB7CiAJCQkJCQloLndyaXRlKHcpOwogCQkJCQkJcmVzdWx0LmFkZChoKTsKIAkJCQkJfQpAQCAtMzUyLDEwICszNTIsMTAgQEAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUZFVENIX0hFQUQoZmluYWwgRmV0Y2hSZXN1bHQgcmVzdWx0KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJcHJpdmF0ZSBib29sZWFuIGFza0ZvcklzQ29tcGxldGUoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKLQkJCXRyeSAoZmluYWwgT2JqZWN0V2FsayBvdyA9IG5ldyBPYmplY3RXYWxrKHRyYW5zcG9ydC5sb2NhbCkpIHsKLQkJCQlmb3IgKGZpbmFsIE9iamVjdElkIHdhbnQgOiBhc2tGb3Iua2V5U2V0KCkpCisJCQl0cnkgKE9iamVjdFdhbGsgb3cgPSBuZXcgT2JqZWN0V2Fsayh0cmFuc3BvcnQubG9jYWwpKSB7CisJCQkJZm9yIChPYmplY3RJZCB3YW50IDogYXNrRm9yLmtleVNldCgpKQogCQkJCQlvdy5tYXJrU3RhcnQob3cucGFyc2VBbnkod2FudCkpOwotCQkJCWZvciAoZmluYWwgUmVmIHJlZiA6IGxvY2FsUmVmcygpLnZhbHVlcygpKQorCQkJCWZvciAoUmVmIHJlZiA6IGxvY2FsUmVmcygpLnZhbHVlcygpKQogCQkJCQlvdy5tYXJrVW5pbnRlcmVzdGluZyhvdy5wYXJzZUFueShyZWYuZ2V0T2JqZWN0SWQoKSkpOwogCQkJCW93LmNoZWNrQ29ubmVjdGl2aXR5KCk7CiAJCQl9CkBAIC0zNjcsMTUgKzM2NywxNSBAQCBwcml2YXRlIGJvb2xlYW4gYXNrRm9ySXNDb21wbGV0ZSgpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFdpbGRjYXJkKGZpbmFsIFJlZlNwZWMgc3BlYywgZmluYWwgU2V0PFJlZj4gbWF0Y2hlZCkKKwlwcml2YXRlIHZvaWQgZXhwYW5kV2lsZGNhcmQoUmVmU3BlYyBzcGVjLCBTZXQ8UmVmPiBtYXRjaGVkKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7Ci0JCWZvciAoZmluYWwgUmVmIHNyYyA6IGNvbm4uZ2V0UmVmcygpKSB7CisJCWZvciAoUmVmIHNyYyA6IGNvbm4uZ2V0UmVmcygpKSB7CiAJCQlpZiAoc3BlYy5tYXRjaFNvdXJjZShzcmMpICYmIG1hdGNoZWQuYWRkKHNyYykpCiAJCQkJd2FudChzcmMsIHNwZWMuZXhwYW5kRnJvbVNvdXJjZShzcmMpKTsKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBleHBhbmRTaW5nbGUoZmluYWwgUmVmU3BlYyBzcGVjLCBmaW5hbCBTZXQ8UmVmPiBtYXRjaGVkKQorCXByaXZhdGUgdm9pZCBleHBhbmRTaW5nbGUoUmVmU3BlYyBzcGVjLCBTZXQ8UmVmPiBtYXRjaGVkKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCVN0cmluZyB3YW50ID0gc3BlYy5nZXRTb3VyY2UoKTsKIAkJaWYgKE9iamVjdElkLmlzSWQod2FudCkpIHsKQEAgLTM5NSw3ICszOTUsNyBAQCBwcml2YXRlIHZvaWQgZXhwYW5kU2luZ2xlKGZpbmFsIFJlZlNwZWMgc3BlYywgZmluYWwgU2V0PFJlZj4gbWF0Y2hlZCkKIAlwcml2YXRlIENvbGxlY3Rpb248UmVmPiBleHBhbmRBdXRvRm9sbG93VGFncygpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlmaW5hbCBDb2xsZWN0aW9uPFJlZj4gYWRkaXRpb25hbFRhZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJZmluYWwgTWFwPFN0cmluZywgUmVmPiBoYXZlUmVmcyA9IGxvY2FsUmVmcygpOwotCQlmb3IgKGZpbmFsIFJlZiByIDogY29ubi5nZXRSZWZzKCkpIHsKKwkJZm9yIChSZWYgciA6IGNvbm4uZ2V0UmVmcygpKSB7CiAJCQlpZiAoIWlzVGFnKHIpKQogCQkJCWNvbnRpbnVlOwogCkBAIC00MTksNyArNDE5LDcgQEAgcHJpdmF0ZSBDb2xsZWN0aW9uPFJlZj4gZXhwYW5kQXV0b0ZvbGxvd1RhZ3MoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAogCXByaXZhdGUgdm9pZCBleHBhbmRGZXRjaFRhZ3MoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmluYWwgTWFwPFN0cmluZywgUmVmPiBoYXZlUmVmcyA9IGxvY2FsUmVmcygpOwotCQlmb3IgKGZpbmFsIFJlZiByIDogY29ubi5nZXRSZWZzKCkpIHsKKwkJZm9yIChSZWYgciA6IGNvbm4uZ2V0UmVmcygpKSB7CiAJCQlpZiAoIWlzVGFnKHIpKSB7CiAJCQkJY29udGludWU7CiAJCQl9CkBAIC00MzQsMTIgKzQzNCwxMiBAQCBwcml2YXRlIHZvaWQgZXhwYW5kRmV0Y2hUYWdzKCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgd2FudFRhZyhmaW5hbCBSZWYgcikgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHdhbnRUYWcoUmVmIHIpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl3YW50KHIsIG5ldyBSZWZTcGVjKCkuc2V0U291cmNlKHIuZ2V0TmFtZSgpKQogCQkJCS5zZXREZXN0aW5hdGlvbihyLmdldE5hbWUoKSkuc2V0Rm9yY2VVcGRhdGUodHJ1ZSkpOwogCX0KIAotCXByaXZhdGUgdm9pZCB3YW50KGZpbmFsIFJlZiBzcmMsIGZpbmFsIFJlZlNwZWMgc3BlYykKKwlwcml2YXRlIHZvaWQgd2FudChSZWYgc3JjLCBSZWZTcGVjIHNwZWMpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmluYWwgT2JqZWN0SWQgbmV3SWQgPSBzcmMuZ2V0T2JqZWN0SWQoKTsKIAkJaWYgKG5ld0lkID09IG51bGwpIHsKQEAgLTQ5NywxMiArNDk3LDE1IEBAIHByaXZhdGUgTWFwPFN0cmluZywgUmVmPiBsb2NhbFJlZnMoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAogCXByaXZhdGUgdm9pZCBkZWxldGVTdGFsZVRyYWNraW5nUmVmcyhGZXRjaFJlc3VsdCByZXN1bHQsCiAJCQlCYXRjaFJlZlVwZGF0ZSBiYXRjaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZmluYWwgU2V0PFJlZj4gcHJvY2Vzc2VkID0gbmV3IEhhc2hTZXQ8PigpOwotCQlmb3IgKGZpbmFsIFJlZiByZWYgOiBsb2NhbFJlZnMoKS52YWx1ZXMoKSkgewotCQkJZmluYWwgU3RyaW5nIHJlZm5hbWUgPSByZWYuZ2V0TmFtZSgpOwotCQkJZm9yIChmaW5hbCBSZWZTcGVjIHNwZWMgOiB0b0ZldGNoKSB7CisJCVNldDxSZWY+IHByb2Nlc3NlZCA9IG5ldyBIYXNoU2V0PD4oKTsKKwkJZm9yIChSZWYgcmVmIDogbG9jYWxSZWZzKCkudmFsdWVzKCkpIHsKKwkJCWlmIChyZWYuaXNTeW1ib2xpYygpKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlTdHJpbmcgcmVmbmFtZSA9IHJlZi5nZXROYW1lKCk7CisJCQlmb3IgKFJlZlNwZWMgc3BlYyA6IHRvRmV0Y2gpIHsKIAkJCQlpZiAoc3BlYy5tYXRjaERlc3RpbmF0aW9uKHJlZm5hbWUpKSB7Ci0JCQkJCWZpbmFsIFJlZlNwZWMgcyA9IHNwZWMuZXhwYW5kRnJvbURlc3RpbmF0aW9uKHJlZm5hbWUpOworCQkJCQlSZWZTcGVjIHMgPSBzcGVjLmV4cGFuZEZyb21EZXN0aW5hdGlvbihyZWZuYW1lKTsKIAkJCQkJaWYgKHJlc3VsdC5nZXRBZHZlcnRpc2VkUmVmKHMuZ2V0U291cmNlKCkpID09IG51bGwKIAkJCQkJCQkmJiBwcm9jZXNzZWQuYWRkKHJlZikpIHsKIAkJCQkJCWRlbGV0ZVRyYWNraW5nUmVmKHJlc3VsdCwgYmF0Y2gsIHMsIHJlZik7CkBAIC01MjYsMTEgKzUyOSwxMSBAQCBwcml2YXRlIHZvaWQgZGVsZXRlVHJhY2tpbmdSZWYoZmluYWwgRmV0Y2hSZXN1bHQgcmVzdWx0LAogCQliYXRjaC5hZGRDb21tYW5kKHVwZGF0ZS5hc1JlY2VpdmVDb21tYW5kKCkpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYWcoZmluYWwgUmVmIHIpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVGFnKFJlZiByKSB7CiAJCXJldHVybiBpc1RhZyhyLmdldE5hbWUoKSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RhZyhmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYWcoU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIG5hbWUuc3RhcnRzV2l0aChDb25zdGFudHMuUl9UQUdTKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoUmVzdWx0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9GZXRjaFJlc3VsdC5qYXZhCmluZGV4IDI2NjdlYzMuLmFkNGM1ZTkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0ZldGNoUmVzdWx0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvRmV0Y2hSZXN1bHQuamF2YQpAQCAtNjgsNyArNjgsNyBAQCBwdWJsaWMgY2xhc3MgRmV0Y2hSZXN1bHQgZXh0ZW5kcyBPcGVyYXRpb25SZXN1bHQgewogCQlzdWJtb2R1bGVzID0gbmV3IEhhc2hNYXA8PigpOwogCX0KIAotCXZvaWQgYWRkKGZpbmFsIEZldGNoSGVhZFJlY29yZCByKSB7CisJdm9pZCBhZGQoRmV0Y2hIZWFkUmVjb3JkIHIpIHsKIAkJaWYgKCFyLm5vdEZvck1lcmdlKQogCQkJZm9yTWVyZ2UuYWRkKHIpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0dpdFByb3RvY29sQ29uc3RhbnRzLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9HaXRQcm90b2NvbENvbnN0YW50cy5qYXZhCmluZGV4IDIwMzExNDcuLjEwY2Q3NzUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0dpdFByb3RvY29sQ29uc3RhbnRzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvR2l0UHJvdG9jb2xDb25zdGFudHMuamF2YQpAQCAtMTA4LDYgKzEwOCwxNCBAQCBwdWJsaWMgY2xhc3MgR2l0UHJvdG9jb2xDb25zdGFudHMgewogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9TSEFMTE9XID0gInNoYWxsb3ciOyAvLyROT04tTkxTLTEkCiAKIAkvKioKKwkgKiBUaGUgY2xpZW50IHdhbnRzIHRoZSAiZGVlcGVuIiBjb21tYW5kIHRvIGJlIGludGVycHJldGVkIGFzIHJlbGF0aXZlIHRvCisJICogdGhlIGNsaWVudCdzIHNoYWxsb3cgY29tbWl0cy4KKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fREVFUEVOX1JFTEFUSVZFID0gImRlZXBlbi1yZWxhdGl2ZSI7IC8vJE5PTi1OTFMtMSQKKworCS8qKgogCSAqIFRoZSBjbGllbnQgZG9lcyBub3Qgd2FudCBwcm9ncmVzcyBtZXNzYWdlcyBhbmQgd2lsbCBpZ25vcmUgdGhlbS4KIAkgKgogCSAqIEBzaW5jZSAzLjIKQEAgLTE1Miw2ICsxNjAsMTMgQEAgcHVibGljIGNsYXNzIEdpdFByb3RvY29sQ29uc3RhbnRzIHsKIAlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05fUFVTSF9DRVJUID0gInB1c2gtY2VydCI7IC8vJE5PTi1OTFMtMSQKIAogCS8qKgorCSAqIFRoZSBjbGllbnQgc3BlY2lmaWVkIGEgZmlsdGVyIGV4cHJlc3Npb24uCisJICoKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OX0ZJTFRFUiA9ICJmaWx0ZXIiOyAvLyROT04tTkxTLTEkCisKKwkvKioKIAkgKiBUaGUgY2xpZW50IHN1cHBvcnRzIGF0b21pYyBwdXNoZXMuIElmIHRoaXMgb3B0aW9uIGlzIHVzZWQsIHRoZSBzZXJ2ZXIKIAkgKiB3aWxsIHVwZGF0ZSBhbGwgcmVmcyB3aXRoaW4gb25lIGF0b21pYyB0cmFuc2FjdGlvbi4KIAkgKgpAQCAtMjE1LDYgKzIzMCwyMCBAQCBwdWJsaWMgY2xhc3MgR2l0UHJvdG9jb2xDb25zdGFudHMgewogCSAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBUEFCSUxJVFlfUFVTSF9PUFRJT05TID0gInB1c2gtb3B0aW9ucyI7IC8vJE5PTi1OTFMtMSQKIAorCS8qKgorCSAqIFRoZSBzZXJ2ZXIgc3VwcG9ydHMgbGlzdGluZyByZWZzIHVzaW5nIHByb3RvY29sIHYyLgorCSAqCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTFNfUkVGUyA9ICJscy1yZWZzIjsgLy8kTk9OLU5MUy0xJAorCisJLyoqCisJICogVGhlIHNlcnZlciBzdXBwb3J0cyBmZXRjaCB1c2luZyBwcm90b2NvbCB2Mi4KKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0ZFVENIID0gImZldGNoIjsgLy8kTk9OLU5MUy0xJAorCiAJc3RhdGljIGVudW0gTXVsdGlBY2sgewogCQlPRkYsIENPTlRJTlVFLCBERVRBSUxFRDsKIAl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9ITUFDU0hBMU5vbmNlR2VuZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9ITUFDU0hBMU5vbmNlR2VuZXJhdG9yLmphdmEKaW5kZXggNmMyNmI3MC4uMTQxNTMzNCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSE1BQ1NIQTFOb25jZUdlbmVyYXRvci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0hNQUNTSEExTm9uY2VHZW5lcmF0b3IuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydDsKIAogaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuSVNPXzg4NTlfMTsKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uRmlsZTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CkBAIC0xMDIsNyArMTAyLDcgQEAgcHVibGljIHN5bmNocm9uaXplZCBTdHJpbmcgY3JlYXRlTm9uY2UoUmVwb3NpdG9yeSByZXBvLCBsb25nIHRpbWVzdGFtcCkKIAkJfQogCiAJCVN0cmluZyBpbnB1dCA9IHBhdGggKyAiOiIgKyBTdHJpbmcudmFsdWVPZih0aW1lc3RhbXApOyAvLyROT04tTkxTLTEkCi0JCWJ5dGVbXSByYXdIbWFjID0gbWFjLmRvRmluYWwoaW5wdXQuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJYnl0ZVtdIHJhd0htYWMgPSBtYWMuZG9GaW5hbChpbnB1dC5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCXJldHVybiBMb25nLnRvU3RyaW5nKHRpbWVzdGFtcCkgKyAiLSIgKyB0b0hleChyYXdIbWFjKTsgLy8kTk9OLU5MUy0xJAogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSHR0cEF1dGhNZXRob2QuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0h0dHBBdXRoTWV0aG9kLmphdmEKaW5kZXggYzQwZDk2My4uZmIwMzE5MCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSHR0cEF1dGhNZXRob2QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9IdHRwQXV0aE1ldGhvZC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLkh0dHBTdXBwb3J0LkhEUl9BVVRIT1JJWkFUSU9OOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuSHR0cFN1cHBvcnQuSERSX1dXV19BVVRIRU5USUNBVEU7CiAKQEAgLTUxLDYgKzUxLDcgQEAKIGltcG9ydCBqYXZhLm5ldC5VUkw7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJlUmFuZG9tOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKQEAgLTU5LDcgKzYwLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuaHR0cC5IdHRwQ29ubmVjdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuQmFzZTY0OwpAQCAtMTYwLDEwICsxNjAsMTAgQEAgc3RhdGljIEh0dHBBdXRoTWV0aG9kIHNjYW5SZXNwb25zZShmaW5hbCBIdHRwQ29ubmVjdGlvbiBjb25uLAogCQlmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnMgPSBjb25uLmdldEhlYWRlckZpZWxkcygpOwogCQlIdHRwQXV0aE1ldGhvZCBhdXRoZW50aWNhdGlvbiA9IFR5cGUuTk9ORS5tZXRob2QoRU1QVFlfU1RSSU5HKTsKIAotCQlmb3IgKGZpbmFsIEVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IGhlYWRlcnMuZW50cnlTZXQoKSkgeworCQlmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IGhlYWRlcnMuZW50cnlTZXQoKSkgewogCQkJaWYgKEhEUl9XV1dfQVVUSEVOVElDQVRFLmVxdWFsc0lnbm9yZUNhc2UoZW50cnkuZ2V0S2V5KCkpKSB7CiAJCQkJaWYgKGVudHJ5LmdldFZhbHVlKCkgIT0gbnVsbCkgewotCQkJCQlmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKwkJCQkJZm9yIChTdHJpbmcgdmFsdWUgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CiAJCQkJCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSAhPSAwKSB7CiAJCQkJCQkJZmluYWwgU3RyaW5nW10gdmFsdWVQYXJ0ID0gdmFsdWUuc3BsaXQoCiAJCQkJCQkJCQlTQ0hFTUFfTkFNRV9TRVBBUkFUT1IsIDIpOwpAQCAtMzA3LDE1ICszMDcsMTUgQEAgcHVibGljIEJhc2ljKCkgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgYXV0aG9yaXplKGZpbmFsIFN0cmluZyB1c2VybmFtZSwgZmluYWwgU3RyaW5nIHBhc3N3b3JkKSB7CisJCXZvaWQgYXV0aG9yaXplKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7CiAJCQl0aGlzLnVzZXIgPSB1c2VybmFtZTsKIAkJCXRoaXMucGFzcyA9IHBhc3N3b3JkOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgY29uZmlndXJlUmVxdWVzdChmaW5hbCBIdHRwQ29ubmVjdGlvbiBjb25uKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl2b2lkIGNvbmZpZ3VyZVJlcXVlc3QoSHR0cENvbm5lY3Rpb24gY29ubikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCVN0cmluZyBpZGVudCA9IHVzZXIgKyAiOiIgKyBwYXNzOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZW5jID0gQmFzZTY0LmVuY29kZUJ5dGVzKGlkZW50LmdldEJ5dGVzKFVURl84KSk7CisJCQlTdHJpbmcgZW5jID0gQmFzZTY0LmVuY29kZUJ5dGVzKGlkZW50LmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJCWNvbm4uc2V0UmVxdWVzdFByb3BlcnR5KEhEUl9BVVRIT1JJWkFUSU9OLCB0eXBlLmdldFNjaGVtZU5hbWUoKQogCQkJCQkrICIgIiArIGVuYyk7IC8vJE5PTi1OTFMtMSQKIAkJfQpAQCAtMzIzLDcgKzMyMyw3IEBAIHZvaWQgY29uZmlndXJlUmVxdWVzdChmaW5hbCBIdHRwQ29ubmVjdGlvbiBjb25uKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLyoqIFBlcmZvcm1zIEhUVFAgZGlnZXN0IGF1dGhlbnRpY2F0aW9uLiAqLwogCXByaXZhdGUgc3RhdGljIGNsYXNzIERpZ2VzdCBleHRlbmRzIEh0dHBBdXRoTWV0aG9kIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmFuZG9tIFBSTkcgPSBuZXcgUmFuZG9tKCk7CisJCXByaXZhdGUgc3RhdGljIGZpbmFsIFNlY3VyZVJhbmRvbSBQUk5HID0gbmV3IFNlY3VyZVJhbmRvbSgpOwogCiAJCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXM7CiAKQEAgLTM0NiwxNCArMzQ2LDE0IEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIERpZ2VzdCBleHRlbmRzIEh0dHBBdXRoTWV0aG9kIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIGF1dGhvcml6ZShmaW5hbCBTdHJpbmcgdXNlcm5hbWUsIGZpbmFsIFN0cmluZyBwYXNzd29yZCkgeworCQl2b2lkIGF1dGhvcml6ZShTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgewogCQkJdGhpcy51c2VyID0gdXNlcm5hbWU7CiAJCQl0aGlzLnBhc3MgPSBwYXNzd29yZDsKIAkJfQogCiAJCUBTdXBwcmVzc1dhcm5pbmdzKCJib3hpbmciKQogCQlAT3ZlcnJpZGUKLQkJdm9pZCBjb25maWd1cmVSZXF1ZXN0KGZpbmFsIEh0dHBDb25uZWN0aW9uIGNvbm4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXZvaWQgY29uZmlndXJlUmVxdWVzdChIdHRwQ29ubmVjdGlvbiBjb25uKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiByID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogCiAJCQlmaW5hbCBTdHJpbmcgcmVhbG0gPSBwYXJhbXMuZ2V0KCJyZWFsbSIpOyAvLyROT04tTkxTLTEkCkBAIC00MzAsMTUgKzQzMCwxNSBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdXJpKFVSTCB1KSB7CiAKIAkJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEgoU3RyaW5nIGRhdGEpIHsKIAkJCU1lc3NhZ2VEaWdlc3QgbWQgPSBuZXdNRDUoKTsKLQkJCW1kLnVwZGF0ZShkYXRhLmdldEJ5dGVzKFVURl84KSk7CisJCQltZC51cGRhdGUoZGF0YS5nZXRCeXRlcyhDSEFSU0VUKSk7CiAJCQlyZXR1cm4gTEhFWChtZC5kaWdlc3QoKSk7CiAJCX0KIAogCQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgS0QoU3RyaW5nIHNlY3JldCwgU3RyaW5nIGRhdGEpIHsKIAkJCU1lc3NhZ2VEaWdlc3QgbWQgPSBuZXdNRDUoKTsKLQkJCW1kLnVwZGF0ZShzZWNyZXQuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCW1kLnVwZGF0ZShzZWNyZXQuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQkJbWQudXBkYXRlKChieXRlKSAnOicpOwotCQkJbWQudXBkYXRlKGRhdGEuZ2V0Qnl0ZXMoVVRGXzgpKTsKKwkJCW1kLnVwZGF0ZShkYXRhLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJCXJldHVybiBMSEVYKG1kLmRpZ2VzdCgpKTsKIAkJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9JbnNlY3VyZUNpcGhlckZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0luc2VjdXJlQ2lwaGVyRmFjdG9yeS5qYXZhCmluZGV4IDczMzg0YTEuLmQ0OTQyNzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0luc2VjdXJlQ2lwaGVyRmFjdG9yeS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0luc2VjdXJlQ2lwaGVyRmFjdG9yeS5qYXZhCkBAIC01NCw3ICs1NCw3IEBACiAgKiBUaGlzIGlzIGEgaGFjayBmb3Ige0BsaW5rIFdhbGtFbmNyeXB0aW9ufSB0byBjcmVhdGUgYW55IGNpcGhlciBjb25maWd1cmVkIGJ5CiAgKiB0aGUgZW5kLXVzZXIuIFVzaW5nIHRoaXMgY2xhc3MgYWxsb3dzIEpHaXQgdG8gdmlvbGF0ZSBFcnJvclByb25lJ3Mgc2VjdXJpdHkKICAqIHJlY29tbWVuZGF0aW9ucyAoPGEKLSAqIGhyZWY9Imh0dHA6Ly9lcnJvcnByb25lLmluZm8vYnVncGF0dGVybi9JbnNlY3VyZUNyeXB0b1VzYWdlIgorICogaHJlZj0iaHR0cHM6Ly9lcnJvcnByb25lLmluZm8vYnVncGF0dGVybi9JbnNlY3VyZUNyeXB0b1VzYWdlIgogICogPkluc2VjdXJlQ3J5cHRvVXNhZ2U8L2E+KSwgd2hpY2ggaXMgbm90IHNlY3VyZS4KICAqLwogY2xhc3MgSW5zZWN1cmVDaXBoZXJGYWN0b3J5IHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0pzY2hDb25maWdTZXNzaW9uRmFjdG9yeS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSnNjaENvbmZpZ1Nlc3Npb25GYWN0b3J5LmphdmEKaW5kZXggMmEyMjJmYi4uZWFiM2IzYyAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSnNjaENvbmZpZ1Nlc3Npb25GYWN0b3J5LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSnNjaENvbmZpZ1Nlc3Npb25GYWN0b3J5LmphdmEKQEAgLTcwLDYgKzcwLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5Db25maWdSZXBvc2l0b3J5OworaW1wb3J0IGNvbS5qY3JhZnQuanNjaC5Db25maWdSZXBvc2l0b3J5LkNvbmZpZzsKIGltcG9ydCBjb20uamNyYWZ0LmpzY2guSlNjaDsKIGltcG9ydCBjb20uamNyYWZ0LmpzY2guSlNjaEV4Y2VwdGlvbjsKIGltcG9ydCBjb20uamNyYWZ0LmpzY2guU2Vzc2lvbjsKQEAgLTIyMiwxMCArMjIzLDMwIEBAIFNlc3Npb24gY3JlYXRlU2Vzc2lvbihDcmVkZW50aWFsc1Byb3ZpZGVyIGNyZWRlbnRpYWxzUHJvdmlkZXIsCiAJCQlzZXNzaW9uLnNldFVzZXJJbmZvKG5ldyBDcmVkZW50aWFsc1Byb3ZpZGVyVXNlckluZm8oc2Vzc2lvbiwKIAkJCQkJY3JlZGVudGlhbHNQcm92aWRlcikpOwogCQl9CisJCXNhZmVDb25maWcoc2Vzc2lvbiwgaGMuZ2V0Q29uZmlnKCkpOwogCQljb25maWd1cmUoaGMsIHNlc3Npb24pOwogCQlyZXR1cm4gc2Vzc2lvbjsKIAl9CiAKKwlwcml2YXRlIHZvaWQgc2FmZUNvbmZpZyhTZXNzaW9uIHNlc3Npb24sIENvbmZpZyBjZmcpIHsKKwkJLy8gRW5zdXJlIHRoYXQgSnNjaCBjaGVja3MgYWxsIGNvbmZpZ3VyZWQgYWxnb3JpdGhtcywgbm90IGp1c3QgaXRzCisJCS8vIGJ1aWx0LWluIG9uZXMuIE90aGVyd2lzZSBpdCBtYXkgcHJvcG9zZSBhbiBhbGdvcml0aG0gZm9yIHdoaWNoIGl0CisJCS8vIGRvZXNuJ3QgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiwgYW5kIHRoZW4gcnVuIGludG8gYW4gTlBFIGlmIHRoYXQKKwkJLy8gYWxnb3JpdGhtIGVuZHMgdXAgYmVpbmcgY2hvc2VuLgorCQljb3B5Q29uZmlnVmFsdWVUb1Nlc3Npb24oc2Vzc2lvbiwgY2ZnLCAiQ2lwaGVycyIsICJDaGVja0NpcGhlcnMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWNvcHlDb25maWdWYWx1ZVRvU2Vzc2lvbihzZXNzaW9uLCBjZmcsICJLZXhBbGdvcml0aG1zIiwgIkNoZWNrS2V4ZXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCWNvcHlDb25maWdWYWx1ZVRvU2Vzc2lvbihzZXNzaW9uLCBjZmcsICJIb3N0S2V5QWxnb3JpdGhtcyIsIC8vJE5PTi1OTFMtMSQKKwkJCQkiQ2hlY2tTaWduYXR1cmVzIik7IC8vJE5PTi1OTFMtMSQKKwl9CisKKwlwcml2YXRlIHZvaWQgY29weUNvbmZpZ1ZhbHVlVG9TZXNzaW9uKFNlc3Npb24gc2Vzc2lvbiwgQ29uZmlnIGNmZywKKwkJCVN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHsKKwkJU3RyaW5nIHZhbHVlID0gY2ZnLmdldFZhbHVlKGZyb20pOworCQlpZiAodmFsdWUgIT0gbnVsbCkgeworCQkJc2Vzc2lvbi5zZXRDb25maWcodG8sIHZhbHVlKTsKKwkJfQorCX0KKwogCXByaXZhdGUgdm9pZCBzZXRVc2VyTmFtZShTZXNzaW9uIHNlc3Npb24sIFN0cmluZyB1c2VyTmFtZSkgewogCQkvLyBKc2NoIDAuMS41NCBwaWNrcyB1cCB0aGUgdXNlciBuYW1lIGZyb20gdGhlIHNzaCBjb25maWcsIGV2ZW4gaWYgYW4KIAkJLy8gZXhwbGljaXQgdXNlciBuYW1lIHdhcyBnaXZlbiEgV2UgbXVzdCBjb3JyZWN0IHRoYXQgaWYgfi8uc3NoL2NvbmZpZwpAQCAtMzA5LDcgKzMzMCw3IEBAIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUpTY2goSlNjaCBqc2NoKSB7CiAJICogQHRocm93cyBjb20uamNyYWZ0LmpzY2guSlNjaEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24gY291bGQgbm90IGJlIGNyZWF0ZWQuCiAJICovCi0JcHJvdGVjdGVkIEpTY2ggZ2V0SlNjaChmaW5hbCBPcGVuU3NoQ29uZmlnLkhvc3QgaGMsIEZTIGZzKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIEpTY2ggZ2V0SlNjaChPcGVuU3NoQ29uZmlnLkhvc3QgaGMsIEZTIGZzKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiB7CiAJCWlmIChkZWZhdWx0SlNjaCA9PSBudWxsKSB7CiAJCQlkZWZhdWx0SlNjaCA9IGNyZWF0ZURlZmF1bHRKU2NoKGZzKTsKIAkJCWlmIChkZWZhdWx0SlNjaC5nZXRDb25maWdSZXBvc2l0b3J5KCkgPT0gbnVsbCkgewpAQCAtMzUxLDEzICszNzIsMTUgQEAgcHJvdGVjdGVkIEpTY2ggZ2V0SlNjaChmaW5hbCBPcGVuU3NoQ29uZmlnLkhvc3QgaGMsIEZTIGZzKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbgogCSAqLwogCXByb3RlY3RlZCBKU2NoIGNyZWF0ZURlZmF1bHRKU2NoKEZTIGZzKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiB7CiAJCWZpbmFsIEpTY2gganNjaCA9IG5ldyBKU2NoKCk7CisJCUpTY2guc2V0Q29uZmlnKCJzc2gtcnNhIiwgSlNjaC5nZXRDb25maWcoInNpZ25hdHVyZS5yc2EiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQlKU2NoLnNldENvbmZpZygic3NoLWRzcyIsIEpTY2guZ2V0Q29uZmlnKCJzaWduYXR1cmUuZHNzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJY29uZmlndXJlSlNjaChqc2NoKTsKIAkJa25vd25Ib3N0cyhqc2NoLCBmcyk7CiAJCWlkZW50aXRpZXMoanNjaCwgZnMpOwogCQlyZXR1cm4ganNjaDsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGtub3duSG9zdHMoZmluYWwgSlNjaCBzY2gsIEZTIGZzKSB0aHJvd3MgSlNjaEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSBzdGF0aWMgdm9pZCBrbm93bkhvc3RzKEpTY2ggc2NoLCBGUyBmcykgdGhyb3dzIEpTY2hFeGNlcHRpb24gewogCQlmaW5hbCBGaWxlIGhvbWUgPSBmcy51c2VySG9tZSgpOwogCQlpZiAoaG9tZSA9PSBudWxsKQogCQkJcmV0dXJuOwpAQCAtMzcxLDcgKzM5NCw3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQga25vd25Ib3N0cyhmaW5hbCBKU2NoIHNjaCwgRlMgZnMpIHRocm93cyBKU2NoRXhjZXB0aW9uIHsKIAkJfQogCX0KIAotCXByaXZhdGUgc3RhdGljIHZvaWQgaWRlbnRpdGllcyhmaW5hbCBKU2NoIHNjaCwgRlMgZnMpIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIGlkZW50aXRpZXMoSlNjaCBzY2gsIEZTIGZzKSB7CiAJCWZpbmFsIEZpbGUgaG9tZSA9IGZzLnVzZXJIb21lKCk7CiAJCWlmIChob21lID09IG51bGwpCiAJCQlyZXR1cm47CkBAIC0zODMsNyArNDA2LDcgQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBpZGVudGl0aWVzKGZpbmFsIEpTY2ggc2NoLCBGUyBmcykgewogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkSWRlbnRpdHkoZmluYWwgSlNjaCBzY2gsIGZpbmFsIEZpbGUgcHJpdikgeworCXByaXZhdGUgc3RhdGljIHZvaWQgbG9hZElkZW50aXR5KEpTY2ggc2NoLCBGaWxlIHByaXYpIHsKIAkJaWYgKHByaXYuaXNGaWxlKCkpIHsKIAkJCXRyeSB7CiAJCQkJc2NoLmFkZElkZW50aXR5KHByaXYuZ2V0QWJzb2x1dGVQYXRoKCkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSnNjaFNlc3Npb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0pzY2hTZXNzaW9uLmphdmEKaW5kZXggMDgxZDA1Ny4uZTNlZjgzMiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSnNjaFNlc3Npb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Kc2NoU2Vzc2lvbi5qYXZhCkBAIC04Miw3ICs4Miw3IEBAIHB1YmxpYyBjbGFzcyBKc2NoU2Vzc2lvbiBpbXBsZW1lbnRzIFJlbW90ZVNlc3Npb24gewogCSAqIEBwYXJhbSB1cmkKIAkgKiAgICAgICAgICAgIHRoZSBVUkkgaW5mb3JtYXRpb24gZm9yIHRoZSByZW1vdGUgY29ubmVjdGlvbgogCSAqLwotCXB1YmxpYyBKc2NoU2Vzc2lvbihmaW5hbCBTZXNzaW9uIHNlc3Npb24sIFVSSWlzaCB1cmkpIHsKKwlwdWJsaWMgSnNjaFNlc3Npb24oU2Vzc2lvbiBzZXNzaW9uLCBVUklpc2ggdXJpKSB7CiAJCXNvY2sgPSBzZXNzaW9uOwogCQl0aGlzLnVyaSA9IHVyaTsKIAl9CkBAIC0xNDUsNyArMTQ1LDcgQEAgcHJpdmF0ZSBjbGFzcyBKc2NoUHJvY2VzcyBleHRlbmRzIFByb2Nlc3MgewogCQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJCSAqICAgICAgICAgICAgIG9uIHByb2JsZW1zIG9wZW5pbmcgc3RyZWFtcwogCQkgKi8KLQkJSnNjaFByb2Nlc3MoZmluYWwgU3RyaW5nIGNvbW1hbmROYW1lLCBpbnQgdG1zKQorCQlKc2NoUHJvY2VzcyhTdHJpbmcgY29tbWFuZE5hbWUsIGludCB0bXMpCiAJCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQkJdGltZW91dCA9IHRtczsKIAkJCXRyeSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9OZXRSQy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvTmV0UkMuamF2YQppbmRleCBlM2YyODdiLi5lNjg4ZjYzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9OZXRSQy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L05ldFJDLmphdmEKQEAgLTIxMSw5ICsyMTEsNyBAQCBwcml2YXRlIHZvaWQgcGFyc2UoKSB7CiAJCXRoaXMuaG9zdHMuY2xlYXIoKTsKIAkJdGhpcy5sYXN0TW9kaWZpZWQgPSB0aGlzLm5ldHJjLmxhc3RNb2RpZmllZCgpOwogCi0JCUJ1ZmZlcmVkUmVhZGVyIHIgPSBudWxsOwotCQl0cnkgewotCQkJciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihuZXRyYykpOworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIobmV0cmMpKSkgewogCQkJU3RyaW5nIGxpbmUgPSBudWxsOwogCiAJCQlOZXRSQ0VudHJ5IGVudHJ5ID0gbmV3IE5ldFJDRW50cnkoKTsKQEAgLTMxNSwxMyArMzEzLDYgQEAgcHJpdmF0ZSB2b2lkIHBhcnNlKCkgewogCQkJCWhvc3RzLnB1dChlbnRyeS5tYWNoaW5lLCBlbnRyeSk7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpZiAociAhPSBudWxsKQotCQkJCQlyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0JCQl9CiAJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVuU3NoQ29uZmlnLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9PcGVuU3NoQ29uZmlnLmphdmEKaW5kZXggNDY2MGM0MC4uZjVjY2RjOCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlblNzaENvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZW5Tc2hDb25maWcuamF2YQpAQCAtMTg2LDcgKzE4Niw3IEBAIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJLyoqIFN0YXRlIHJlYWQgZnJvbSB0aGUgY29uZmlnIGZpbGUsIHBsdXMge0BsaW5rIEhvc3R9cyBjcmVhdGVkIGZyb20gaXQuICovCiAJcHJpdmF0ZSBTdGF0ZSBzdGF0ZTsKIAotCU9wZW5Tc2hDb25maWcoZmluYWwgRmlsZSBoLCBmaW5hbCBGaWxlIGNmZykgeworCU9wZW5Tc2hDb25maWcoRmlsZSBoLCBGaWxlIGNmZykgewogCQlob21lID0gaDsKIAkJY29uZmlnRmlsZSA9IGNmZzsKIAkJc3RhdGUgPSBuZXcgU3RhdGUoKTsKQEAgLTIwMSw3ICsyMDEsNyBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCSAqICAgICAgICAgICAgY29uZmlndXJhdGlvbiBmaWxlLgogCSAqIEByZXR1cm4gciBjb25maWd1cmF0aW9uIGZvciB0aGUgcmVxdWVzdGVkIG5hbWUuIE5ldmVyIG51bGwuCiAJICovCi0JcHVibGljIEhvc3QgbG9va3VwKGZpbmFsIFN0cmluZyBob3N0TmFtZSkgeworCXB1YmxpYyBIb3N0IGxvb2t1cChTdHJpbmcgaG9zdE5hbWUpIHsKIAkJZmluYWwgU3RhdGUgY2FjaGUgPSByZWZyZXNoKCk7CiAJCUhvc3QgaCA9IGNhY2hlLmhvc3RzLmdldChob3N0TmFtZSk7CiAJCWlmIChoICE9IG51bGwpIHsKQEAgLTIxMSw3ICsyMTEsNyBAQCBwdWJsaWMgSG9zdCBsb29rdXAoZmluYWwgU3RyaW5nIGhvc3ROYW1lKSB7CiAJCS8vIEluaXRpYWxpemUgd2l0aCBkZWZhdWx0IGVudHJpZXMgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSwgYmVmb3JlIHRoZQogCQkvLyBmaXJzdCBIb3N0IGJsb2NrLgogCQlmdWxsQ29uZmlnLm1lcmdlKGNhY2hlLmVudHJpZXMuZ2V0KEhvc3RFbnRyeS5ERUZBVUxUX05BTUUpKTsKLQkJZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBIb3N0RW50cnk+IGUgOiBjYWNoZS5lbnRyaWVzLmVudHJ5U2V0KCkpIHsKKwkJZm9yIChNYXAuRW50cnk8U3RyaW5nLCBIb3N0RW50cnk+IGUgOiBjYWNoZS5lbnRyaWVzLmVudHJ5U2V0KCkpIHsKIAkJCVN0cmluZyBrZXkgPSBlLmdldEtleSgpOwogCQkJaWYgKGlzSG9zdE1hdGNoKGtleSwgaG9zdE5hbWUpKSB7CiAJCQkJZnVsbENvbmZpZy5tZXJnZShlLmdldFZhbHVlKCkpOwpAQCAtMjM4LDcgKzIzOCw3IEBAIHByaXZhdGUgc3luY2hyb25pemVkIFN0YXRlIHJlZnJlc2goKSB7CiAJCXJldHVybiBzdGF0ZTsKIAl9CiAKLQlwcml2YXRlIE1hcDxTdHJpbmcsIEhvc3RFbnRyeT4gcGFyc2UoZmluYWwgSW5wdXRTdHJlYW0gaW4pCisJcHJpdmF0ZSBNYXA8U3RyaW5nLCBIb3N0RW50cnk+IHBhcnNlKElucHV0U3RyZWFtIGluKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgTWFwPFN0cmluZywgSG9zdEVudHJ5PiBtID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOwogCQlmaW5hbCBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKQEAgLTMzMiwxNCArMzMyLDE0IEBAIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gcGF0dGVybk1hdGNoZXNIb3N0KGZpbmFsIFN0cmluZyBwYXR0ZXJuLAogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlcXVvdGUoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlcXVvdGUoU3RyaW5nIHZhbHVlKSB7CiAJCWlmICh2YWx1ZS5zdGFydHNXaXRoKCJcIiIpICYmIHZhbHVlLmVuZHNXaXRoKCJcIiIpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCSYmIHZhbHVlLmxlbmd0aCgpID4gMSkKIAkJCXJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoKCkgLSAxKTsKIAkJcmV0dXJuIHZhbHVlOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBub3dzKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworCXByaXZhdGUgc3RhdGljIFN0cmluZyBub3dzKFN0cmluZyB2YWx1ZSkgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwogCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCgpOyBpKyspIHsKIAkJCWlmICghQ2hhcmFjdGVyLmlzU3BhY2VDaGFyKHZhbHVlLmNoYXJBdChpKSkpCkBAIC0zNDgsNyArMzQ4LDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vd3MoZmluYWwgU3RyaW5nIHZhbHVlKSB7CiAJCXJldHVybiBiLnRvU3RyaW5nKCk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbiB5ZXNubyhmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKwlwcml2YXRlIHN0YXRpYyBCb29sZWFuIHllc25vKFN0cmluZyB2YWx1ZSkgewogCQlpZiAoU3RyaW5nVXRpbHMuZXF1YWxzSWdub3JlQ2FzZSgieWVzIiwgdmFsdWUpKSAvLyROT04tTkxTLTEkCiAJCQlyZXR1cm4gQm9vbGVhbi5UUlVFOwogCQlyZXR1cm4gQm9vbGVhbi5GQUxTRTsKQEAgLTM2NSw3ICszNjUsNyBAQCBwcml2YXRlIHN0YXRpYyBGaWxlIHRvRmlsZShTdHJpbmcgcGF0aCwgRmlsZSBob21lKSB7CiAJCXJldHVybiBuZXcgRmlsZShob21lLCBwYXRoKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBpbnQgcG9zaXRpdmUoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisJcHJpdmF0ZSBzdGF0aWMgaW50IHBvc2l0aXZlKFN0cmluZyB2YWx1ZSkgewogCQlpZiAodmFsdWUgIT0gbnVsbCkgewogCQkJdHJ5IHsKIAkJCQlyZXR1cm4gSW50ZWdlci5wYXJzZVVuc2lnbmVkSW50KHZhbHVlKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L09wZXJhdGlvblJlc3VsdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlcmF0aW9uUmVzdWx0LmphdmEKaW5kZXggNDIzMTc5OC4uMDhmN2YwZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlcmF0aW9uUmVzdWx0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvT3BlcmF0aW9uUmVzdWx0LmphdmEKQEAgLTEwNyw3ICsxMDcsNyBAQCBwdWJsaWMgQ29sbGVjdGlvbjxSZWY+IGdldEFkdmVydGlzZWRSZWZzKCkgewogCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgcmVmIHRvIG9idGFpbi4KIAkgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgcmVmOyBudWxsIGlmIHRoZSByZW1vdGUgZGlkIG5vdCBhZHZlcnRpc2UgdGhpcyByZWYuCiAJICovCi0JcHVibGljIGZpbmFsIFJlZiBnZXRBZHZlcnRpc2VkUmVmKGZpbmFsIFN0cmluZyBuYW1lKSB7CisJcHVibGljIGZpbmFsIFJlZiBnZXRBZHZlcnRpc2VkUmVmKFN0cmluZyBuYW1lKSB7CiAJCXJldHVybiBhZHZlcnRpc2VkUmVmcy5nZXQobmFtZSk7CiAJfQogCkBAIC0xMjksMTYgKzEyOSwxNiBAQCBwdWJsaWMgQ29sbGVjdGlvbjxUcmFja2luZ1JlZlVwZGF0ZT4gZ2V0VHJhY2tpbmdSZWZVcGRhdGVzKCkgewogCSAqIEByZXR1cm4gc3RhdHVzIG9mIHRoZSBsb2NhbCByZWY7IG51bGwgaWYgdGhpcyBsb2NhbCByZWYgd2FzIG5vdCB0b3VjaGVkCiAJICogICAgICAgICBkdXJpbmcgdGhpcyBvcGVyYXRpb24uCiAJICovCi0JcHVibGljIFRyYWNraW5nUmVmVXBkYXRlIGdldFRyYWNraW5nUmVmVXBkYXRlKGZpbmFsIFN0cmluZyBsb2NhbE5hbWUpIHsKKwlwdWJsaWMgVHJhY2tpbmdSZWZVcGRhdGUgZ2V0VHJhY2tpbmdSZWZVcGRhdGUoU3RyaW5nIGxvY2FsTmFtZSkgewogCQlyZXR1cm4gdXBkYXRlcy5nZXQobG9jYWxOYW1lKTsKIAl9CiAKLQl2b2lkIHNldEFkdmVydGlzZWRSZWZzKGZpbmFsIFVSSWlzaCB1LCBmaW5hbCBNYXA8U3RyaW5nLCBSZWY+IGFyKSB7CisJdm9pZCBzZXRBZHZlcnRpc2VkUmVmcyhVUklpc2ggdSwgTWFwPFN0cmluZywgUmVmPiBhcikgewogCQl1cmkgPSB1OwogCQlhZHZlcnRpc2VkUmVmcyA9IGFyOwogCX0KIAotCXZvaWQgYWRkKGZpbmFsIFRyYWNraW5nUmVmVXBkYXRlIHUpIHsKKwl2b2lkIGFkZChUcmFja2luZ1JlZlVwZGF0ZSB1KSB7CiAJCXVwZGF0ZXMucHV0KHUuZ2V0TG9jYWxOYW1lKCksIHUpOwogCX0KIApAQCAtMTU4LDcgKzE1OCw3IEBAIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZXMoKSB7CiAJCXJldHVybiBtZXNzYWdlQnVmZmVyICE9IG51bGwgPyBtZXNzYWdlQnVmZmVyLnRvU3RyaW5nKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAogCX0KIAotCXZvaWQgYWRkTWVzc2FnZXMoZmluYWwgU3RyaW5nIG1zZykgeworCXZvaWQgYWRkTWVzc2FnZXMoU3RyaW5nIG1zZykgewogCQlpZiAobXNnICE9IG51bGwgJiYgbXNnLmxlbmd0aCgpID4gMCkgewogCQkJaWYgKG1lc3NhZ2VCdWZmZXIgPT0gbnVsbCkKIAkJCQltZXNzYWdlQnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tQYXJzZXIuamF2YQppbmRleCBhZjVhMGI3Li40OWFjYjRkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja1BhcnNlci5qYXZhCkBAIC0yMDAsNyArMjAwLDcgQEAgcHVibGljIHN0YXRpYyBlbnVtIFNvdXJjZSB7CiAJICogQHBhcmFtIHNyYwogCSAqICAgICAgICAgICAgdGhlIHN0cmVhbSB0aGUgcGFyc2VyIHdpbGwgcmVhZC4KIAkgKi8KLQlwcm90ZWN0ZWQgUGFja1BhcnNlcihmaW5hbCBPYmplY3REYXRhYmFzZSBvZGIsIGZpbmFsIElucHV0U3RyZWFtIHNyYykgeworCXByb3RlY3RlZCBQYWNrUGFyc2VyKE9iamVjdERhdGFiYXNlIG9kYiwgSW5wdXRTdHJlYW0gc3JjKSB7CiAJCW9iamVjdERhdGFiYXNlID0gb2RiLm5ld0NhY2hlZERhdGFiYXNlKCk7CiAJCWluID0gc3JjOwogCkBAIC0yMzIsNyArMjMyLDcgQEAgcHVibGljIGJvb2xlYW4gaXNBbGxvd1RoaW4oKSB7CiAJICogQHBhcmFtIGFsbG93CiAJICogICAgICAgICAgICB0cnVlIHRvIGVuYWJsZSBhIHRoaW4gcGFjay4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBbGxvd1RoaW4oZmluYWwgYm9vbGVhbiBhbGxvdykgeworCXB1YmxpYyB2b2lkIHNldEFsbG93VGhpbihib29sZWFuIGFsbG93KSB7CiAJCWFsbG93VGhpbiA9IGFsbG93OwogCX0KIApAQCAtMzc5LDcgKzM3OSw3IEBAIHB1YmxpYyBPYmplY3RJZFN1YmNsYXNzTWFwPE9iamVjdElkPiBnZXRCYXNlT2JqZWN0SWRzKCkgewogCSAqIEBwYXJhbSBvYwogCSAqICAgICAgICAgICAgdGhlIGNoZWNrZXIgaW5zdGFuY2U7IG51bGwgdG8gZGlzYWJsZSBvYmplY3QgY2hlY2tpbmcuCiAJICovCi0JcHVibGljIHZvaWQgc2V0T2JqZWN0Q2hlY2tlcihmaW5hbCBPYmplY3RDaGVja2VyIG9jKSB7CisJcHVibGljIHZvaWQgc2V0T2JqZWN0Q2hlY2tlcihPYmplY3RDaGVja2VyIG9jKSB7CiAJCW9iakNoZWNrID0gb2M7CiAJfQogCkBAIC0zOTksNyArMzk5LDcgQEAgcHVibGljIHZvaWQgc2V0T2JqZWN0Q2hlY2tlcihmaW5hbCBPYmplY3RDaGVja2VyIG9jKSB7CiAJICogQHBhcmFtIG9uCiAJICogICAgICAgICAgICB0cnVlIHRvIGVuYWJsZSB0aGUgZGVmYXVsdCBjaGVja2VyOyBmYWxzZSB0byBkaXNhYmxlIGl0LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdENoZWNraW5nKGZpbmFsIGJvb2xlYW4gb24pIHsKKwlwdWJsaWMgdm9pZCBzZXRPYmplY3RDaGVja2luZyhib29sZWFuIG9uKSB7CiAJCXNldE9iamVjdENoZWNrZXIob24gPyBuZXcgT2JqZWN0Q2hlY2tlcigpIDogbnVsbCk7CiAJfQogCkBAIC02MjksNyArNjI5LDcgQEAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NEZWx0YXMoUHJvZ3Jlc3NNb25pdG9yIHJlc29sdmluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmVzb2x2aW5nLmVuZFRhc2soKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcmVzb2x2ZURlbHRhcyhmaW5hbCBQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpCisJcHJpdmF0ZSB2b2lkIHJlc29sdmVEZWx0YXMoUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IGxhc3QgPSBlbnRyeUNvdW50OwogCQlmb3IgKGludCBpID0gMDsgaSA8IGxhc3Q7IGkrKykgewpAQCAtODE5LDcgKzgxOSw3IEBAIHByb3RlY3RlZCBPYmplY3RUeXBlQW5kU2l6ZSByZWFkT2JqZWN0SGVhZGVyKE9iamVjdFR5cGVBbmRTaXplIGluZm8pCiAJCXJldHVybiBpbmZvOwogCX0KIAotCXByaXZhdGUgVW5yZXNvbHZlZERlbHRhIHJlbW92ZUJhc2VCeUlkKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJcHJpdmF0ZSBVbnJlc29sdmVkRGVsdGEgcmVtb3ZlQmFzZUJ5SWQoQW55T2JqZWN0SWQgaWQpIHsKIAkJZmluYWwgRGVsdGFDaGFpbiBkID0gYmFzZUJ5SWQuZ2V0KGlkKTsKIAkJcmV0dXJuIGQgIT0gbnVsbCA/IGQucmVtb3ZlKCkgOiBudWxsOwogCX0KQEAgLTg2NSw3ICs4NjUsNyBAQCBwcml2YXRlIFVucmVzb2x2ZWREZWx0YSBmaXJzdENoaWxkT2YoUGFja2VkT2JqZWN0SW5mbyBvZSkgewogCQlyZXR1cm4gZmlyc3Q7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlc29sdmVEZWx0YXNXaXRoRXh0ZXJuYWxCYXNlcyhmaW5hbCBQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpCisJcHJpdmF0ZSB2b2lkIHJlc29sdmVEZWx0YXNXaXRoRXh0ZXJuYWxCYXNlcyhQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlncm93RW50cmllcyhiYXNlQnlJZC5zaXplKCkpOwogCkBAIC04NzMsNyArODczLDcgQEAgcHJpdmF0ZSB2b2lkIHJlc29sdmVEZWx0YXNXaXRoRXh0ZXJuYWxCYXNlcyhmaW5hbCBQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpCiAJCQliYXNlT2JqZWN0SWRzID0gbmV3IE9iamVjdElkU3ViY2xhc3NNYXA8PigpOwogCiAJCWZpbmFsIExpc3Q8RGVsdGFDaGFpbj4gbWlzc2luZyA9IG5ldyBBcnJheUxpc3Q8Pig2NCk7Ci0JCWZvciAoZmluYWwgRGVsdGFDaGFpbiBiYXNlSWQgOiBiYXNlQnlJZCkgeworCQlmb3IgKERlbHRhQ2hhaW4gYmFzZUlkIDogYmFzZUJ5SWQpIHsKIAkJCWlmIChiYXNlSWQuaGVhZCA9PSBudWxsKQogCQkJCWNvbnRpbnVlOwogCkBAIC05MDUsNyArOTA1LDcgQEAgcHJpdmF0ZSB2b2lkIHJlc29sdmVEZWx0YXNXaXRoRXh0ZXJuYWxCYXNlcyhmaW5hbCBQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpCiAJCQkJCQlKR2l0VGV4dC5nZXQoKS5kb3dubG9hZENhbmNlbGxlZER1cmluZ0luZGV4aW5nKTsKIAkJfQogCi0JCWZvciAoZmluYWwgRGVsdGFDaGFpbiBiYXNlIDogbWlzc2luZykgeworCQlmb3IgKERlbHRhQ2hhaW4gYmFzZSA6IG1pc3NpbmcpIHsKIAkJCWlmIChiYXNlLmhlYWQgIT0gbnVsbCkKIAkJCQl0aHJvdyBuZXcgTWlzc2luZ09iamVjdEV4Y2VwdGlvbihiYXNlLCAiZGVsdGEgYmFzZSIpOyAvLyROT04tTkxTLTEkCiAJCX0KQEAgLTEwNjUsNyArMTA2NSw3IEBAIHByaXZhdGUgdm9pZCBpbmRleE9uZU9iamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgd2hvbGUoZmluYWwgbG9uZyBwb3MsIGZpbmFsIGludCB0eXBlLCBmaW5hbCBsb25nIHN6KQorCXByaXZhdGUgdm9pZCB3aG9sZShsb25nIHBvcywgaW50IHR5cGUsIGxvbmcgc3opCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlTSEExIG9iamVjdERpZ2VzdCA9IG9iamVjdEhhc2hlci5yZXNldCgpOwogCQlvYmplY3REaWdlc3QudXBkYXRlKENvbnN0YW50cy5lbmNvZGVkVHlwZVN0cmluZyh0eXBlKSk7CkBAIC0xMDc2LDcgKzEwNzYsNiBAQCBwcml2YXRlIHZvaWQgd2hvbGUoZmluYWwgbG9uZyBwb3MsIGZpbmFsIGludCB0eXBlLCBmaW5hbCBsb25nIHN6KQogCQlmaW5hbCBieXRlW10gZGF0YTsKIAkJaWYgKHR5cGUgPT0gQ29uc3RhbnRzLk9CSl9CTE9CKSB7CiAJCQlieXRlW10gcmVhZEJ1ZmZlciA9IGJ1ZmZlcigpOwotCQkJSW5wdXRTdHJlYW0gaW5mID0gaW5mbGF0ZShTb3VyY2UuSU5QVVQsIHN6KTsKIAkJCUJsb2JPYmplY3RDaGVja2VyIGNoZWNrZXIgPSBudWxsOwogCQkJaWYgKG9iakNoZWNrICE9IG51bGwpIHsKIAkJCQljaGVja2VyID0gb2JqQ2hlY2submV3QmxvYk9iamVjdENoZWNrZXIoKTsKQEAgLTEwODUsMTUgKzEwODQsMTYgQEAgcHJpdmF0ZSB2b2lkIHdob2xlKGZpbmFsIGxvbmcgcG9zLCBmaW5hbCBpbnQgdHlwZSwgZmluYWwgbG9uZyBzeikKIAkJCQljaGVja2VyID0gQmxvYk9iamVjdENoZWNrZXIuTlVMTF9DSEVDS0VSOwogCQkJfQogCQkJbG9uZyBjbnQgPSAwOwotCQkJd2hpbGUgKGNudCA8IHN6KSB7Ci0JCQkJaW50IHIgPSBpbmYucmVhZChyZWFkQnVmZmVyKTsKLQkJCQlpZiAociA8PSAwKQotCQkJCQlicmVhazsKLQkJCQlvYmplY3REaWdlc3QudXBkYXRlKHJlYWRCdWZmZXIsIDAsIHIpOwotCQkJCWNoZWNrZXIudXBkYXRlKHJlYWRCdWZmZXIsIDAsIHIpOwotCQkJCWNudCArPSByOworCQkJdHJ5IChJbnB1dFN0cmVhbSBpbmYgPSBpbmZsYXRlKFNvdXJjZS5JTlBVVCwgc3opKSB7CisJCQkJd2hpbGUgKGNudCA8IHN6KSB7CisJCQkJCWludCByID0gaW5mLnJlYWQocmVhZEJ1ZmZlcik7CisJCQkJCWlmIChyIDw9IDApCisJCQkJCQlicmVhazsKKwkJCQkJb2JqZWN0RGlnZXN0LnVwZGF0ZShyZWFkQnVmZmVyLCAwLCByKTsKKwkJCQkJY2hlY2tlci51cGRhdGUocmVhZEJ1ZmZlciwgMCwgcik7CisJCQkJCWNudCArPSByOworCQkJCX0KIAkJCX0KLQkJCWluZi5jbG9zZSgpOwogCQkJb2JqZWN0RGlnZXN0LmRpZ2VzdCh0ZW1wT2JqZWN0SWQpOwogCQkJY2hlY2tlci5lbmRCbG9iKHRlbXBPYmplY3RJZCk7CiAJCQlkYXRhID0gbnVsbDsKQEAgLTExNjIsMzMgKzExNjIsMjkgQEAgcHJpdmF0ZSB2b2lkIGNoZWNrT2JqZWN0Q29sbGlzaW9uKFBhY2tlZE9iamVjdEluZm8gb2JqKQogCQlmaW5hbCBieXRlW10gcmVhZEJ1ZmZlciA9IGJ1ZmZlcigpOwogCQlmaW5hbCBieXRlW10gY3VyQnVmZmVyID0gbmV3IGJ5dGVbcmVhZEJ1ZmZlci5sZW5ndGhdOwogCQlsb25nIHN6ID0gaW5mby5zaXplOwotCQlJbnB1dFN0cmVhbSBwY2sgPSBudWxsOwogCQl0cnkgKE9iamVjdFN0cmVhbSBjdXIgPSByZWFkQ3Vycy5vcGVuKG9iaiwgaW5mby50eXBlKS5vcGVuU3RyZWFtKCkpIHsKIAkJCWlmIChjdXIuZ2V0U2l6ZSgpICE9IHN6KSB7CiAJCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQkJSkdpdFRleHQuZ2V0KCkuY29sbGlzaW9uT24sIG9iai5uYW1lKCkpKTsKIAkJCX0KLQkJCXBjayA9IGluZmxhdGUoU291cmNlLkRBVEFCQVNFLCBzeik7Ci0JCQl3aGlsZSAoMCA8IHN6KSB7Ci0JCQkJaW50IG4gPSAoaW50KSBNYXRoLm1pbihyZWFkQnVmZmVyLmxlbmd0aCwgc3opOwotCQkJCUlPLnJlYWRGdWxseShjdXIsIGN1ckJ1ZmZlciwgMCwgbik7Ci0JCQkJSU8ucmVhZEZ1bGx5KHBjaywgcmVhZEJ1ZmZlciwgMCwgbik7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLQkJCQkJaWYgKGN1ckJ1ZmZlcltpXSAhPSByZWFkQnVmZmVyW2ldKSB7Ci0JCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQKLQkJCQkJCQkJLmdldCgpLmNvbGxpc2lvbk9uLCBvYmoubmFtZSgpKSk7CisJCQl0cnkgKElucHV0U3RyZWFtIHBjayA9IGluZmxhdGUoU291cmNlLkRBVEFCQVNFLCBzeikpIHsKKwkJCQl3aGlsZSAoMCA8IHN6KSB7CisJCQkJCWludCBuID0gKGludCkgTWF0aC5taW4ocmVhZEJ1ZmZlci5sZW5ndGgsIHN6KTsKKwkJCQkJSU8ucmVhZEZ1bGx5KGN1ciwgY3VyQnVmZmVyLCAwLCBuKTsKKwkJCQkJSU8ucmVhZEZ1bGx5KHBjaywgcmVhZEJ1ZmZlciwgMCwgbik7CisJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQkJCQlpZiAoY3VyQnVmZmVyW2ldICE9IHJlYWRCdWZmZXJbaV0pIHsKKwkJCQkJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCisJCQkJCQkJCQlKR2l0VGV4dC5nZXQoKS5jb2xsaXNpb25Pbiwgb2JqLm5hbWUoKSkpOworCQkJCQkJfQogCQkJCQl9CisJCQkJCXN6IC09IG47CiAJCQkJfQotCQkJCXN6IC09IG47CiAJCQl9CiAJCX0gY2F0Y2ggKE1pc3NpbmdPYmplY3RFeGNlcHRpb24gbm90TG9jYWwpIHsKIAkJCS8vIFRoaXMgaXMgT0ssIHdlIGRvbid0IGhhdmUgYSBjb3B5IG9mIHRoZSBvYmplY3QgbG9jYWxseQotCQkJLy8gYnV0IHRoZSBBUEkgdGhyb3dzIHdoZW4gd2UgdHJ5IHRvIHJlYWQgaXQgYXMgdXN1YWxseSBpdHMKKwkJCS8vIGJ1dCB0aGUgQVBJIHRocm93cyB3aGVuIHdlIHRyeSB0byByZWFkIGl0IGFzIHVzdWFsbHkgaXQncwogCQkJLy8gYW4gZXJyb3IgdG8gcmVhZCBzb21ldGhpbmcgdGhhdCBkb2Vzbid0IGV4aXN0LgotCQl9IGZpbmFsbHkgewotCQkJaWYgKHBjayAhPSBudWxsKSB7Ci0JCQkJcGNrLmNsb3NlKCk7Ci0JCQl9CiAJCX0KIAl9CiAKQEAgLTEyMjgsNyArMTIyNCw3IEBAIHByaXZhdGUgT2JqZWN0VHlwZUFuZFNpemUgb3BlbkRhdGFiYXNlKFVucmVzb2x2ZWREZWx0YSBkZWx0YSwKIAl9CiAKIAkvLyBDb25zdW1lIGV4YWN0bHkgb25lIGJ5dGUgZnJvbSB0aGUgYnVmZmVyIGFuZCByZXR1cm4gaXQuCi0JcHJpdmF0ZSBpbnQgcmVhZEZyb20oZmluYWwgU291cmNlIHNyYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIGludCByZWFkRnJvbShTb3VyY2Ugc3JjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoYkF2YWlsID09IDApCiAJCQlmaWxsKHNyYywgMSk7CiAJCWJBdmFpbC0tOwpAQCAtMTIzNiwxMyArMTIzMiwxMyBAQCBwcml2YXRlIGludCByZWFkRnJvbShmaW5hbCBTb3VyY2Ugc3JjKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCX0KIAogCS8vIENvbnN1bWUgY250IGJ5dGVzIGZyb20gdGhlIGJ1ZmZlci4KLQl2b2lkIHVzZShmaW5hbCBpbnQgY250KSB7CisJdm9pZCB1c2UoaW50IGNudCkgewogCQliT2Zmc2V0ICs9IGNudDsKIAkJYkF2YWlsIC09IGNudDsKIAl9CiAKIAkvLyBFbnN1cmUgYXQgbGVhc3QgbmVlZCBieXRlcyBhcmUgYXZhaWxhYmxlIGluIGluIHtAbGluayAjYnVmfS4KLQlpbnQgZmlsbChmaW5hbCBTb3VyY2Ugc3JjLCBmaW5hbCBpbnQgbmVlZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlpbnQgZmlsbChTb3VyY2Ugc3JjLCBpbnQgbmVlZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJd2hpbGUgKGJBdmFpbCA8IG5lZWQpIHsKIAkJCWludCBuZXh0ID0gYk9mZnNldCArIGJBdmFpbDsKIAkJCWludCBmcmVlID0gYnVmLmxlbmd0aCAtIG5leHQ7CkBAIC0xNjQwLDIzICsxNjM2LDIzIEBAIHB1YmxpYyBzdGF0aWMgY2xhc3MgT2JqZWN0VHlwZUFuZFNpemUgewogCQlwdWJsaWMgbG9uZyBzaXplOwogCX0KIAotCXByaXZhdGUgdm9pZCBpbmZsYXRlQW5kU2tpcChmaW5hbCBTb3VyY2Ugc3JjLCBmaW5hbCBsb25nIGluZmxhdGVkU2l6ZSkKKwlwcml2YXRlIHZvaWQgaW5mbGF0ZUFuZFNraXAoU291cmNlIHNyYywgbG9uZyBpbmZsYXRlZFNpemUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmaW5hbCBJbnB1dFN0cmVhbSBpbmYgPSBpbmZsYXRlKHNyYywgaW5mbGF0ZWRTaXplKTsKLQkJSU8uc2tpcEZ1bGx5KGluZiwgaW5mbGF0ZWRTaXplKTsKLQkJaW5mLmNsb3NlKCk7CisJCXRyeSAoSW5wdXRTdHJlYW0gaW5mID0gaW5mbGF0ZShzcmMsIGluZmxhdGVkU2l6ZSkpIHsKKwkJCUlPLnNraXBGdWxseShpbmYsIGluZmxhdGVkU2l6ZSk7CisJCX0KIAl9CiAKLQlwcml2YXRlIGJ5dGVbXSBpbmZsYXRlQW5kUmV0dXJuKGZpbmFsIFNvdXJjZSBzcmMsIGZpbmFsIGxvbmcgaW5mbGF0ZWRTaXplKQorCXByaXZhdGUgYnl0ZVtdIGluZmxhdGVBbmRSZXR1cm4oU291cmNlIHNyYywgbG9uZyBpbmZsYXRlZFNpemUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gZHN0ID0gbmV3IGJ5dGVbKGludCkgaW5mbGF0ZWRTaXplXTsKLQkJZmluYWwgSW5wdXRTdHJlYW0gaW5mID0gaW5mbGF0ZShzcmMsIGluZmxhdGVkU2l6ZSk7Ci0JCUlPLnJlYWRGdWxseShpbmYsIGRzdCwgMCwgZHN0Lmxlbmd0aCk7Ci0JCWluZi5jbG9zZSgpOworCQl0cnkgKElucHV0U3RyZWFtIGluZiA9IGluZmxhdGUoc3JjLCBpbmZsYXRlZFNpemUpKSB7CisJCQlJTy5yZWFkRnVsbHkoaW5mLCBkc3QsIDAsIGRzdC5sZW5ndGgpOworCQl9CiAJCXJldHVybiBkc3Q7CiAJfQogCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbmZsYXRlKGZpbmFsIFNvdXJjZSBzcmMsIGZpbmFsIGxvbmcgaW5mbGF0ZWRTaXplKQorCXByaXZhdGUgSW5wdXRTdHJlYW0gaW5mbGF0ZShTb3VyY2Ugc3JjLCBsb25nIGluZmxhdGVkU2l6ZSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWluZmxhdGVyLm9wZW4oc3JjLCBpbmZsYXRlZFNpemUpOwogCQlyZXR1cm4gaW5mbGF0ZXI7CkBAIC0xNjY1LDcgKzE2NjEsNyBAQCBwcml2YXRlIElucHV0U3RyZWFtIGluZmxhdGUoZmluYWwgU291cmNlIHNyYywgZmluYWwgbG9uZyBpbmZsYXRlZFNpemUpCiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVsdGFDaGFpbiBleHRlbmRzIE9iamVjdElkT3duZXJNYXAuRW50cnkgewogCQlVbnJlc29sdmVkRGVsdGEgaGVhZDsKIAotCQlEZWx0YUNoYWluKGZpbmFsIEFueU9iamVjdElkIGlkKSB7CisJCURlbHRhQ2hhaW4oQW55T2JqZWN0SWQgaWQpIHsKIAkJCXN1cGVyKGlkKTsKIAkJfQogCkBAIC0xNjc2LDcgKzE2NzIsNyBAQCBVbnJlc29sdmVkRGVsdGEgcmVtb3ZlKCkgewogCQkJcmV0dXJuIHI7CiAJCX0KIAotCQl2b2lkIGFkZChmaW5hbCBVbnJlc29sdmVkRGVsdGEgZCkgeworCQl2b2lkIGFkZChVbnJlc29sdmVkRGVsdGEgZCkgewogCQkJZC5uZXh0ID0gaGVhZDsKIAkJCWhlYWQgPSBkOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZWRPYmplY3RJbmZvLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZWRPYmplY3RJbmZvLmphdmEKaW5kZXggODBmYzBiNC4uNTlkMWI3OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2VkT2JqZWN0SW5mby5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tlZE9iamVjdEluZm8uamF2YQpAQCAtNzUsNyArNzUsNyBAQCBwdWJsaWMgY2xhc3MgUGFja2VkT2JqZWN0SW5mbyBleHRlbmRzIE9iamVjdElkT3duZXJNYXAuRW50cnkgewogCSAqIEBwYXJhbSBpZAogCSAqICAgICAgICAgICAgdGhlIGlkZW50aXR5IG9mIHRoZSBvYmplY3QgdGhlIG5ldyBpbnN0YW5jZSB0cmFja3MuCiAJICovCi0JcHVibGljIFBhY2tlZE9iamVjdEluZm8oZmluYWwgQW55T2JqZWN0SWQgaWQpIHsKKwlwdWJsaWMgUGFja2VkT2JqZWN0SW5mbyhBbnlPYmplY3RJZCBpZCkgewogCQlzdXBlcihpZCk7CiAJfQogCkBAIC05NSw3ICs5NSw3IEBAIHB1YmxpYyBsb25nIGdldE9mZnNldCgpIHsKIAkgKiBAcGFyYW0gb2Zmc2V0CiAJICogICAgICAgICAgICBvZmZzZXQgd2hlcmUgd3JpdHRlbiBvYmplY3Qgc3RhcnRzCiAJICovCi0JcHVibGljIHZvaWQgc2V0T2Zmc2V0KGZpbmFsIGxvbmcgb2Zmc2V0KSB7CisJcHVibGljIHZvaWQgc2V0T2Zmc2V0KGxvbmcgb2Zmc2V0KSB7CiAJCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwogCX0KIApAQCAtMTE2LDcgKzExNiw3IEBAIHB1YmxpYyBpbnQgZ2V0Q1JDKCkgewogCSAqICAgICAgICAgICAgaW5mbGF0ZWQgbGVuZ3RoIGFuZCBkZWx0YSBiYXNlIHJlZmVyZW5jZSkgYXMgY29tcHV0ZWQgYnkKIAkgKiAgICAgICAgICAgIHtAbGluayBqYXZhLnV0aWwuemlwLkNSQzMyfS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDUkMoZmluYWwgaW50IGNyYykgeworCXB1YmxpYyB2b2lkIHNldENSQyhpbnQgY3JjKSB7CiAJCXRoaXMuY3JjID0gY3JjOwogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZUluLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW4uamF2YQppbmRleCA4NzA2NGUxLi5jYzU1NmY4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lSW4uamF2YQpAQCAtNzQsNiArNzQsMTMgQEAgcHVibGljIGNsYXNzIFBhY2tldExpbmVJbiB7CiAJLyoqIE1hZ2ljIHJldHVybiBmcm9tIHtAbGluayAjcmVhZFN0cmluZygpfSB3aGVuIGEgZmx1c2ggcGFja2V0IGlzIGZvdW5kLiAqLwogCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVORCA9IG5ldyBTdHJpbmdCdWlsZGVyKDApLnRvU3RyaW5nKCk7IAkvKiBtdXN0IG5vdCBzdHJpbmcgcG9vbCAqLwogCisJLyoqCisJICogTWFnaWMgcmV0dXJuIGZyb20ge0BsaW5rICNyZWFkU3RyaW5nKCl9IHdoZW4gYSBkZWxpbSBwYWNrZXQgaXMgZm91bmQuCisJICoKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU0gPSBuZXcgU3RyaW5nQnVpbGRlcigwKS50b1N0cmluZygpOyAJLyogbXVzdCBub3Qgc3RyaW5nIHBvb2wgKi8KKwogCXN0YXRpYyBlbnVtIEFja05hY2tSZXN1bHQgewogCQkvKiogTkFLICovCiAJCU5BSywKQEAgLTExNSw3ICsxMjIsNyBAQCBwdWJsaWMgUGFja2V0TGluZUluKElucHV0U3RyZWFtIGluLCBsb25nIGxpbWl0KSB7CiAJCXRoaXMubGltaXQgPSBsaW1pdDsKIAl9CiAKLQlBY2tOYWNrUmVzdWx0IHJlYWRBQ0soZmluYWwgTXV0YWJsZU9iamVjdElkIHJldHVybmVkSWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJQWNrTmFja1Jlc3VsdCByZWFkQUNLKE11dGFibGVPYmplY3RJZCByZXR1cm5lZElkKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmcgbGluZSA9IHJlYWRTdHJpbmcoKTsKIAkJaWYgKGxpbmUubGVuZ3RoKCkgPT0gMCkKIAkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuZXhwZWN0ZWRBQ0tOQUtGb3VuZEVPRik7CkBAIC0xNDcsNiArMTU0LDcgQEAgZWxzZSBpZiAoYXJnLmVxdWFscygiIHJlYWR5IikpIC8vJE5PTi1OTFMtMSQKIAkgKiB1c2Uge0BsaW5rICNyZWFkU3RyaW5nUmF3KCl9IGluc3RlYWQuCiAJICoKIAkgKiBAcmV0dXJuIHRoZSBzdHJpbmcuIHtAbGluayAjRU5EfSBpZiB0aGUgc3RyaW5nIHdhcyB0aGUgbWFnaWMgZmx1c2gKKwkgKiAgICAgICAgIHBhY2tldCwge0BsaW5rICNERUxJTX0gaWYgdGhlIHN0cmluZyB3YXMgdGhlIG1hZ2ljIERFTElNCiAJICogICAgICAgICBwYWNrZXQuCiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHN0cmVhbSBjYW5ub3QgYmUgcmVhZC4KQEAgLTE1Nyw2ICsxNjUsMTAgQEAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWxvZy5kZWJ1ZygiZ2l0PCAwMDAwIik7IC8vJE5PTi1OTFMtMSQKIAkJCXJldHVybiBFTkQ7CiAJCX0KKwkJaWYgKGxlbiA9PSAxKSB7CisJCQlsb2cuZGVidWcoImdpdDwgMDAwMSIpOyAvLyROT04tTkxTLTEkCisJCQlyZXR1cm4gREVMSU07CisJCX0KIAogCQlsZW4gLT0gNDsgLy8gbGVuZ3RoIGhlYWRlciAoNCBieXRlcykKIAkJaWYgKGxlbiA9PSAwKSB7CkBAIC0yMzIsNiArMjQ0LDggQEAgaW50IHJlYWRMZW5ndGgoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJCWlmIChsZW4gPT0gMCkgewogCQkJcmV0dXJuIDA7CisJCX0gZWxzZSBpZiAobGVuID09IDEpIHsKKwkJCXJldHVybiAxOwogCQl9IGVsc2UgaWYgKGxlbiA8IDQpIHsKIAkJCXRocm93IGludmFsaWRIZWFkZXIoKTsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZU91dC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUGFja2V0TGluZU91dC5qYXZhCmluZGV4IDQ4YmRkMDEuLmEyNmQxZDcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1BhY2tldExpbmVPdXQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QYWNrZXRMaW5lT3V0LmphdmEKQEAgLTc4LDcgKzc4LDcgQEAgcHVibGljIGNsYXNzIFBhY2tldExpbmVPdXQgewogCSAqIEBwYXJhbSBvdXRwdXRTdHJlYW0KIAkgKiAgICAgICAgICAgIHN0cmVhbS4KIAkgKi8KLQlwdWJsaWMgUGFja2V0TGluZU91dChmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7CisJcHVibGljIFBhY2tldExpbmVPdXQoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgewogCQlvdXQgPSBvdXRwdXRTdHJlYW07CiAJCWxlbmJ1ZmZlciA9IG5ldyBieXRlWzVdOwogCQlmbHVzaE9uRW5kID0gdHJ1ZTsKQEAgLTEwNCw3ICsxMDQsNyBAQCBwdWJsaWMgdm9pZCBzZXRGbHVzaE9uRW5kKGJvb2xlYW4gZmx1c2hPbkVuZCkgewogCSAqICAgICAgICAgICAgIHRoZSBwYWNrZXQgY291bGQgbm90IGJlIHdyaXR0ZW4sIHRoZSBzdHJlYW0gaXMgY29ycnVwdGVkIGFzCiAJICogICAgICAgICAgICAgdGhlIHBhY2tldCBtYXkgaGF2ZSBiZWVuIG9ubHkgcGFydGlhbGx5IHdyaXR0ZW4uCiAJICovCi0JcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoZmluYWwgU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdyaXRlUGFja2V0KENvbnN0YW50cy5lbmNvZGUocykpOwogCX0KIApAQCAtMTQ3LDYgKzE0NywyMCBAQCBwdWJsaWMgdm9pZCB3cml0ZVBhY2tldChieXRlW10gYnVmLCBpbnQgcG9zLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCX0KIAogCS8qKgorCSAqIFdyaXRlIGEgcGFja2V0IGRlbGltIG1hcmtlciAoMDAwMSkuCisJICoKKwkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICB0aGUgbWFya2VyIGNvdWxkIG5vdCBiZSB3cml0dGVuLCB0aGUgc3RyZWFtIGlzIGNvcnJ1cHRlZAorCSAqICAgICAgICAgICAgIGFzIHRoZSBtYXJrZXIgbWF5IGhhdmUgYmVlbiBvbmx5IHBhcnRpYWxseSB3cml0dGVuLgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgdm9pZCB3cml0ZURlbGltKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJZm9ybWF0TGVuZ3RoKDEpOworCQlvdXQud3JpdGUobGVuYnVmZmVyLCAwLCA0KTsKKwkJbG9nLmRlYnVnKCJnaXQ+IDAwMDEiKTsgLy8kTk9OLU5MUy0xJAorCX0KKworCS8qKgogCSAqIFdyaXRlIGEgcGFja2V0IGVuZCBtYXJrZXIsIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBhIGZsdXNoIGNvbW1hbmQuCiAJICogPHA+CiAJICogVGVjaG5pY2FsbHkgdGhpcyBpcyBhIG1hZ2ljYWwgcGFja2V0IHR5cGUgd2hpY2ggY2FuIGJlIGRldGVjdGVkCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Qcm9ncmVzc1NwaW5uZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1Byb2dyZXNzU3Bpbm5lci5qYXZhCmluZGV4IDQxYWY4MDcuLjIzNjQ0MzQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1Byb2dyZXNzU3Bpbm5lci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1Byb2dyZXNzU3Bpbm5lci5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CkBAIC0xNDEsNyArMTQxLDcgQEAgcHVibGljIHZvaWQgZW5kVGFzayhTdHJpbmcgcmVzdWx0KSB7CiAJcHJpdmF0ZSB2b2lkIHdyaXRlKFN0cmluZyBzKSB7CiAJCWlmICh3cml0ZSkgewogCQkJdHJ5IHsKLQkJCQlvdXQud3JpdGUocy5nZXRCeXRlcyhVVEZfOCkpOworCQkJCW91dC53cml0ZShzLmdldEJ5dGVzKENIQVJTRVQpKTsKIAkJCQlvdXQuZmx1c2goKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCQl3cml0ZSA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENlcnRpZmljYXRlSWRlbnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDZXJ0aWZpY2F0ZUlkZW50LmphdmEKaW5kZXggZjlmZGRiZS4uMTc4YzgwZCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENlcnRpZmljYXRlSWRlbnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ2VydGlmaWNhdGVJZGVudC5qYXZhCkBAIC00Myw3ICs0Myw3IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC51dGlsLlJhd1BhcnNlVXRpbHMubGFzdEluZGV4T2ZUcmltOwogCiBpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CkBAIC05NSw3ICs5NSw3IEBAIHB1YmxpYyBjbGFzcyBQdXNoQ2VydGlmaWNhdGVJZGVudCB7CiAJICovCiAJcHVibGljIHN0YXRpYyBQdXNoQ2VydGlmaWNhdGVJZGVudCBwYXJzZShTdHJpbmcgc3RyKSB7CiAJCU11dGFibGVJbnRlZ2VyIHAgPSBuZXcgTXV0YWJsZUludGVnZXIoKTsKLQkJYnl0ZVtdIHJhdyA9IHN0ci5nZXRCeXRlcyhVVEZfOCk7CisJCWJ5dGVbXSByYXcgPSBzdHIuZ2V0Qnl0ZXMoQ0hBUlNFVCk7CiAJCWludCB0ekJlZ2luID0gcmF3Lmxlbmd0aCAtIDE7CiAJCXR6QmVnaW4gPSBsYXN0SW5kZXhPZlRyaW0ocmF3LCAnICcsIHR6QmVnaW4pOwogCQlpZiAodHpCZWdpbiA8IDAgfHwgcmF3W3R6QmVnaW5dICE9ICcgJykgewpAQCAtMTI5LDcgKzEyOSw3IEBAIHB1YmxpYyBzdGF0aWMgUHVzaENlcnRpZmljYXRlSWRlbnQgcGFyc2UoU3RyaW5nIHN0cikgewogCQkJCWlkRW5kID0gcmF3Lmxlbmd0aDsKIAkJCX0KIAkJfQotCQlTdHJpbmcgaWQgPSBuZXcgU3RyaW5nKHJhdywgMCwgaWRFbmQsIFVURl84KTsKKwkJU3RyaW5nIGlkID0gbmV3IFN0cmluZyhyYXcsIDAsIGlkRW5kLCBDSEFSU0VUKTsKIAogCQlyZXR1cm4gbmV3IFB1c2hDZXJ0aWZpY2F0ZUlkZW50KHN0ciwgaWQsIHdoZW4gKiAxMDAwTCwgdHopOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDZXJ0aWZpY2F0ZVN0b3JlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoQ2VydGlmaWNhdGVTdG9yZS5qYXZhCmluZGV4IGFiNThhMzMuLjdmNWEzNDAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hDZXJ0aWZpY2F0ZVN0b3JlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaENlcnRpZmljYXRlU3RvcmUuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpfQkxPQjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLk9CSl9DT01NSVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkZpbGVNb2RlLlRZUEVfRklMRTsKQEAgLTE5Miw3ICsxOTIsNyBAQCBwdWJsaWMgUHVzaENlcnRpZmljYXRlIGdldChTdHJpbmcgcmVmTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAcmV0dXJuIGl0ZXJhYmxlIG92ZXIgY2VydGlmaWNhdGVzOyBtdXN0IGJlIGZ1bGx5IGl0ZXJhdGVkIGluIG9yZGVyIHRvCiAJICogICAgICAgICBjbG9zZSByZXNvdXJjZXMuCiAJICovCi0JcHVibGljIEl0ZXJhYmxlPFB1c2hDZXJ0aWZpY2F0ZT4gZ2V0QWxsKGZpbmFsIFN0cmluZyByZWZOYW1lKSB7CisJcHVibGljIEl0ZXJhYmxlPFB1c2hDZXJ0aWZpY2F0ZT4gZ2V0QWxsKFN0cmluZyByZWZOYW1lKSB7CiAJCXJldHVybiBuZXcgSXRlcmFibGU8UHVzaENlcnRpZmljYXRlPigpIHsKIAkJCUBPdmVycmlkZQogCQkJcHVibGljIEl0ZXJhdG9yPFB1c2hDZXJ0aWZpY2F0ZT4gaXRlcmF0b3IoKSB7CkBAIC0yOTIsNyArMjkyLDcgQEAgc3RhdGljIFB1c2hDZXJ0aWZpY2F0ZSByZWFkKFRyZWVXYWxrIHR3KSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlPYmplY3RMb2FkZXIgbG9hZGVyID0KIAkJCQl0dy5nZXRPYmplY3RSZWFkZXIoKS5vcGVuKHR3LmdldE9iamVjdElkKDApLCBPQkpfQkxPQik7CiAJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBsb2FkZXIub3BlblN0cmVhbSgpOwotCQkJCVJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgVVRGXzgpKSkgeworCQkJCVJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgQ0hBUlNFVCkpKSB7CiAJCQlyZXR1cm4gUHVzaENlcnRpZmljYXRlUGFyc2VyLmZyb21SZWFkZXIocik7CiAJCX0KIAl9CkBAIC00NzMsNyArNDczLDcgQEAgcHJpdmF0ZSBPYmplY3RJZCBzYXZlQ2VydChPYmplY3RJbnNlcnRlciBpbnNlcnRlciwgRGlyQ2FjaGUgZGMsCiAKIAkJRGlyQ2FjaGVFZGl0b3IgZWRpdG9yID0gZGMuZWRpdG9yKCk7CiAJCVN0cmluZyBjZXJ0VGV4dCA9IHBjLmNlcnQudG9UZXh0KCkgKyBwYy5jZXJ0LmdldFNpZ25hdHVyZSgpOwotCQlmaW5hbCBPYmplY3RJZCBjZXJ0SWQgPSBpbnNlcnRlci5pbnNlcnQoT0JKX0JMT0IsIGNlcnRUZXh0LmdldEJ5dGVzKFVURl84KSk7CisJCWZpbmFsIE9iamVjdElkIGNlcnRJZCA9IGluc2VydGVyLmluc2VydChPQkpfQkxPQiwgY2VydFRleHQuZ2V0Qnl0ZXMoQ0hBUlNFVCkpOwogCQlib29sZWFuIGFueSA9IGZhbHNlOwogCQlmb3IgKFJlY2VpdmVDb21tYW5kIGNtZCA6IHBjLmNlcnQuZ2V0Q29tbWFuZHMoKSkgewogCQkJaWYgKGJ5UmVmICE9IG51bGwgJiYgIWNvbW1hbmRzRXF1YWwoY21kLCBieVJlZi5nZXQoY21kLmdldFJlZk5hbWUoKSkpKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzcy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFByb2Nlc3MuamF2YQppbmRleCAzMjAxNzMyLi40NzBhM2MwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUHJvY2Vzcy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hQcm9jZXNzLmphdmEKQEAgLTQ4LDcgKzQ4LDcgQEAKIGltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIApAQCAtMTI0LDEwICsxMjQsMTAgQEAgY2xhc3MgUHVzaFByb2Nlc3MgewogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRoaXMud2Fsa2VyID0gbmV3IFJldldhbGsodHJhbnNwb3J0LmxvY2FsKTsKIAkJdGhpcy50cmFuc3BvcnQgPSB0cmFuc3BvcnQ7Ci0JCXRoaXMudG9QdXNoID0gbmV3IEhhc2hNYXA8PigpOworCQl0aGlzLnRvUHVzaCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKIAkJdGhpcy5vdXQgPSBvdXQ7CiAJCXRoaXMucHVzaE9wdGlvbnMgPSB0cmFuc3BvcnQuZ2V0UHVzaE9wdGlvbnMoKTsKLQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgcnJ1IDogdG9QdXNoKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaCkgewogCQkJaWYgKHRoaXMudG9QdXNoLnB1dChycnUuZ2V0UmVtb3RlTmFtZSgpLCBycnUpICE9IG51bGwpCiAJCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJCUpHaXRUZXh0LmdldCgpLmR1cGxpY2F0ZVJlbW90ZVJlZlVwZGF0ZUlzSWxsZWdhbCwgcnJ1LmdldFJlbW90ZU5hbWUoKSkpOwpAQCAtMTUwLDcgKzE1MCw3IEBAIGNsYXNzIFB1c2hQcm9jZXNzIHsKIAkgKiAgICAgICAgICAgICB3aGVuIHNvbWUgZXJyb3Igb2NjdXJyZWQgZHVyaW5nIG9wZXJhdGlvbiwgbGlrZSBJL08sIHByb3RvY29sCiAJICogICAgICAgICAgICAgZXJyb3IsIG9yIGxvY2FsIGRhdGFiYXNlIGNvbnNpc3RlbmN5IGVycm9yLgogCSAqLwotCVB1c2hSZXN1bHQgZXhlY3V0ZShmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvcikKKwlQdXNoUmVzdWx0IGV4ZWN1dGUoUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCiAJCQl0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgewogCQkJbW9uaXRvci5iZWdpblRhc2soUFJPR1JFU1NfT1BFTklOR19DT05ORUNUSU9OLApAQCAtMTc2LDcgKzE3Niw3IEBAIGVsc2UgaWYgKCFwcmVwcm9jZXNzZWQuaXNFbXB0eSgpKQogCQkJfQogCQkJaWYgKCF0cmFuc3BvcnQuaXNEcnlSdW4oKSkKIAkJCQl1cGRhdGVUcmFja2luZ1JlZnMoKTsKLQkJCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaC52YWx1ZXMoKSkgeworCQkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogdG9QdXNoLnZhbHVlcygpKSB7CiAJCQkJZmluYWwgVHJhY2tpbmdSZWZVcGRhdGUgdHJ1ID0gcnJ1LmdldFRyYWNraW5nUmVmVXBkYXRlKCk7CiAJCQkJaWYgKHRydSAhPSBudWxsKQogCQkJCQlyZXMuYWRkKHRydSk7CkBAIC0xOTAsOCArMTkwLDggQEAgZWxzZSBpZiAoIXByZXByb2Nlc3NlZC5pc0VtcHR5KCkpCiAJcHJpdmF0ZSBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHByZXBhcmVSZW1vdGVVcGRhdGVzKCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlib29sZWFuIGF0b21pYyA9IHRyYW5zcG9ydC5pc1B1c2hBdG9taWMoKTsKLQkJZmluYWwgTWFwPFN0cmluZywgUmVtb3RlUmVmVXBkYXRlPiByZXN1bHQgPSBuZXcgSGFzaE1hcDw+KCk7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaC52YWx1ZXMoKSkgeworCQlmaW5hbCBNYXA8U3RyaW5nLCBSZW1vdGVSZWZVcGRhdGU+IHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKKwkJZm9yIChSZW1vdGVSZWZVcGRhdGUgcnJ1IDogdG9QdXNoLnZhbHVlcygpKSB7CiAJCQlmaW5hbCBSZWYgYWR2ZXJ0aXNlZFJlZiA9IGNvbm5lY3Rpb24uZ2V0UmVmKHJydS5nZXRSZW1vdGVOYW1lKCkpOwogCQkJT2JqZWN0SWQgYWR2ZXJ0aXNlZE9sZCA9IG51bGw7CiAJCQlpZiAoYWR2ZXJ0aXNlZFJlZiAhPSBudWxsKSB7CkBAIC0yNzcsMTMgKzI3NywxMyBAQCBwcml2YXRlIE1hcDxTdHJpbmcsIFJlbW90ZVJlZlVwZGF0ZT4gcmVqZWN0QWxsKCkgewogCX0KIAogCXByaXZhdGUgdm9pZCBtb2RpZnlVcGRhdGVzRm9yRHJ5UnVuKCkgewotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gudmFsdWVzKCkpCisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaC52YWx1ZXMoKSkKIAkJCWlmIChycnUuZ2V0U3RhdHVzKCkgPT0gU3RhdHVzLk5PVF9BVFRFTVBURUQpCiAJCQkJcnJ1LnNldFN0YXR1cyhTdGF0dXMuT0spOwogCX0KIAogCXByaXZhdGUgdm9pZCB1cGRhdGVUcmFja2luZ1JlZnMoKSB7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHJydSA6IHRvUHVzaC52YWx1ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSBycnUgOiB0b1B1c2gudmFsdWVzKCkpIHsKIAkJCWZpbmFsIFN0YXR1cyBzdGF0dXMgPSBycnUuZ2V0U3RhdHVzKCk7CiAJCQlpZiAocnJ1Lmhhc1RyYWNraW5nUmVmVXBkYXRlKCkKIAkJCQkJJiYgKHN0YXR1cyA9PSBTdGF0dXMuVVBfVE9fREFURSB8fCBzdGF0dXMgPT0gU3RhdHVzLk9LKSkgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFJlc3VsdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUHVzaFJlc3VsdC5qYXZhCmluZGV4IDhiYWU1YTUuLjU0NTI3MDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1B1c2hSZXN1bHQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9QdXNoUmVzdWx0LmphdmEKQEAgLTgyLDcgKzgyLDcgQEAgcHVibGljIENvbGxlY3Rpb248UmVtb3RlUmVmVXBkYXRlPiBnZXRSZW1vdGVVcGRhdGVzKCkgewogCSAqICAgICAgICAgICAgcmVtb3RlIHJlZiBuYW1lCiAJICogQHJldHVybiBzdGF0dXMgb2YgcmVtb3RlIHJlZiB1cGRhdGUKIAkgKi8KLQlwdWJsaWMgUmVtb3RlUmVmVXBkYXRlIGdldFJlbW90ZVVwZGF0ZShmaW5hbCBTdHJpbmcgcmVmTmFtZSkgeworCXB1YmxpYyBSZW1vdGVSZWZVcGRhdGUgZ2V0UmVtb3RlVXBkYXRlKFN0cmluZyByZWZOYW1lKSB7CiAJCXJldHVybiByZW1vdGVVcGRhdGVzLmdldChyZWZOYW1lKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVDb21tYW5kLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlQ29tbWFuZC5qYXZhCmluZGV4IGUxNGQxOGYuLmQ2MWFlYjAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVDb21tYW5kLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVjZWl2ZUNvbW1hbmQuamF2YQpAQCAtNzEzLDcgKzcxMyw3IEBAIHB1YmxpYyBCb29sZWFuIGlzRm9yY2VSZWZMb2coKSB7CiAJICogQHBhcmFtIHMKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgc3RhdHVzIGNvZGUgZm9yIHRoaXMgY29tbWFuZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXN1bHQoZmluYWwgUmVzdWx0IHMpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZXN1bHQoUmVzdWx0IHMpIHsKIAkJc2V0UmVzdWx0KHMsIG51bGwpOwogCX0KIApAQCAtNzI1LDcgKzcyNSw3IEBAIHB1YmxpYyB2b2lkIHNldFJlc3VsdChmaW5hbCBSZXN1bHQgcykgewogCSAqIEBwYXJhbSBtCiAJICogICAgICAgICAgICBvcHRpb25hbCBtZXNzYWdlIGV4cGxhaW5pbmcgdGhlIG5ldyBzdGF0dXMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVzdWx0KGZpbmFsIFJlc3VsdCBzLCBmaW5hbCBTdHJpbmcgbSkgeworCXB1YmxpYyB2b2lkIHNldFJlc3VsdChSZXN1bHQgcywgU3RyaW5nIG0pIHsKIAkJc3RhdHVzID0gczsKIAkJbWVzc2FnZSA9IG07CiAJfQpAQCAtNzcwLDcgKzc3MCw3IEBAIHB1YmxpYyB2b2lkIHVwZGF0ZVR5cGUoUmV2V2FsayB3YWxrKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgICAgcmVjZWl2ZS1wYWNrIHNlc3Npb24uCiAJICogQHNpbmNlIDIuMAogCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgQmFzZVJlY2VpdmVQYWNrIHJwKSB7CisJcHVibGljIHZvaWQgZXhlY3V0ZShCYXNlUmVjZWl2ZVBhY2sgcnApIHsKIAkJdHJ5IHsKIAkJCVN0cmluZyBleHBUYXJnZXQgPSBnZXRPbGRTeW1yZWYoKTsKIAkJCWJvb2xlYW4gZGV0YWNoID0gZ2V0TmV3U3ltcmVmKCkgIT0gbnVsbApAQCAtODE4LDExICs4MTgsMTEgQEAgcHVibGljIHZvaWQgZXhlY3V0ZShmaW5hbCBCYXNlUmVjZWl2ZVBhY2sgcnApIHsKIAkJfQogCX0KIAotCXZvaWQgc2V0UmVmKGZpbmFsIFJlZiByKSB7CisJdm9pZCBzZXRSZWYoUmVmIHIpIHsKIAkJcmVmID0gcjsKIAl9CiAKLQl2b2lkIHNldFR5cGUoZmluYWwgVHlwZSB0KSB7CisJdm9pZCBzZXRUeXBlKFR5cGUgdCkgewogCQl0eXBlID0gdDsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFjay5qYXZhCmluZGV4IDdjNWYzMmEuLjM1ZmIwYjE3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWNlaXZlUGFjay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlY2VpdmVQYWNrLmphdmEKQEAgLTg4LDcgKzg4LDcgQEAgcHVibGljIGNsYXNzIFJlY2VpdmVQYWNrIGV4dGVuZHMgQmFzZVJlY2VpdmVQYWNrIHsKIAkgKiBAcGFyYW0gaW50bwogCSAqICAgICAgICAgICAgdGhlIGRlc3RpbmF0aW9uIHJlcG9zaXRvcnkuCiAJICovCi0JcHVibGljIFJlY2VpdmVQYWNrKGZpbmFsIFJlcG9zaXRvcnkgaW50bykgeworCXB1YmxpYyBSZWNlaXZlUGFjayhSZXBvc2l0b3J5IGludG8pIHsKIAkJc3VwZXIoaW50byk7CiAJCXByZVJlY2VpdmUgPSBQcmVSZWNlaXZlSG9vay5OVUxMOwogCQlwb3N0UmVjZWl2ZSA9IFBvc3RSZWNlaXZlSG9vay5OVUxMOwpAQCAtMTU0LDcgKzE1NCw3IEBAIHB1YmxpYyBQcmVSZWNlaXZlSG9vayBnZXRQcmVSZWNlaXZlSG9vaygpIHsKIAkgKiBAcGFyYW0gaAogCSAqICAgICAgICAgICAgdGhlIGhvb2sgaW5zdGFuY2U7IG1heSBiZSBudWxsIHRvIGRpc2FibGUgdGhlIGhvb2suCiAJICovCi0JcHVibGljIHZvaWQgc2V0UHJlUmVjZWl2ZUhvb2soZmluYWwgUHJlUmVjZWl2ZUhvb2sgaCkgeworCXB1YmxpYyB2b2lkIHNldFByZVJlY2VpdmVIb29rKFByZVJlY2VpdmVIb29rIGgpIHsKIAkJcHJlUmVjZWl2ZSA9IGggIT0gbnVsbCA/IGggOiBQcmVSZWNlaXZlSG9vay5OVUxMOwogCX0KIApAQCAtMTc4LDcgKzE3OCw3IEBAIHB1YmxpYyBQb3N0UmVjZWl2ZUhvb2sgZ2V0UG9zdFJlY2VpdmVIb29rKCkgewogCSAqIEBwYXJhbSBoCiAJICogICAgICAgICAgICB0aGUgaG9vayBpbnN0YW5jZTsgbWF5IGJlIG51bGwgdG8gZGlzYWJsZSB0aGUgaG9vay4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQb3N0UmVjZWl2ZUhvb2soZmluYWwgUG9zdFJlY2VpdmVIb29rIGgpIHsKKwlwdWJsaWMgdm9pZCBzZXRQb3N0UmVjZWl2ZUhvb2soUG9zdFJlY2VpdmVIb29rIGgpIHsKIAkJcG9zdFJlY2VpdmUgPSBoICE9IG51bGwgPyBoIDogUG9zdFJlY2VpdmVIb29rLk5VTEw7CiAJfQogCkBAIC0yODgsNyArMjg4LDcgQEAgcHJpdmF0ZSB2b2lkIHNlcnZpY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWlmIChlY2hvQ29tbWFuZEZhaWx1cmVzICYmIG1zZ091dCAhPSBudWxsKSB7CiAJCQkJCXNlbmRTdGF0dXNSZXBvcnQoZmFsc2UsIHVucGFja0Vycm9yLCBuZXcgUmVwb3J0ZXIoKSB7CiAJCQkJCQlAT3ZlcnJpZGUKLQkJCQkJCXZvaWQgc2VuZFN0cmluZyhmaW5hbCBTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQkJCXZvaWQgc2VuZFN0cmluZyhTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQkJCQltc2dPdXQud3JpdGUoQ29uc3RhbnRzLmVuY29kZShzICsgIlxuIikpOyAvLyROT04tTkxTLTEkCiAJCQkJCQl9CiAJCQkJCX0pOwpAQCAtMzAxLDcgKzMwMSw3IEBAIHZvaWQgc2VuZFN0cmluZyhmaW5hbCBTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQl9CiAJCQkJc2VuZFN0YXR1c1JlcG9ydCh0cnVlLCB1bnBhY2tFcnJvciwgbmV3IFJlcG9ydGVyKCkgewogCQkJCQlAT3ZlcnJpZGUKLQkJCQkJdm9pZCBzZW5kU3RyaW5nKGZpbmFsIFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJCQl2b2lkIHNlbmRTdHJpbmcoU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcocyArICJcbiIpOyAvLyROT04tTkxTLTEkCiAJCQkJCX0KIAkJCQl9KTsKQEAgLTMwOSw3ICszMDksNyBAQCB2b2lkIHNlbmRTdHJpbmcoZmluYWwgU3RyaW5nIHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl9IGVsc2UgaWYgKG1zZ091dCAhPSBudWxsKSB7CiAJCQkJc2VuZFN0YXR1c1JlcG9ydChmYWxzZSwgdW5wYWNrRXJyb3IsIG5ldyBSZXBvcnRlcigpIHsKIAkJCQkJQE92ZXJyaWRlCi0JCQkJCXZvaWQgc2VuZFN0cmluZyhmaW5hbCBTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQkJdm9pZCBzZW5kU3RyaW5nKFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCQkJbXNnT3V0LndyaXRlKENvbnN0YW50cy5lbmNvZGUocyArICJcbiIpKTsgLy8kTk9OLU5MUy0xJAogCQkJCQl9CiAJCQkJfSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZBZHZlcnRpc2VyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZBZHZlcnRpc2VyLmphdmEKaW5kZXggNWViMTY2MS4uZGMxODcxYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmQWR2ZXJ0aXNlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZkFkdmVydGlzZXIuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogCiBwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSDsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX1NZTVJFRjsKIApAQCAtNTMsMTEgKzUzLDEyIEBACiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RW5jb2RlcjsKIGltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNvZGVyUmVzdWx0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQW55T2JqZWN0SWQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzOwpAQCAtNjUsNyArNjYsNiBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlZjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5SZWZDb21wYXJhdG9yOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLlJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlJlZk1hcDsKIAogLyoqCiAgKiBTdXBwb3J0IGZvciB0aGUgc3RhcnQgb2Yge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlVwbG9hZFBhY2t9IGFuZApAQCAtNzQsNyArNzQsNyBAQAogcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZkFkdmVydGlzZXIgewogCS8qKiBBZHZlcnRpc2VyIHdoaWNoIGZyYW1lcyBsaW5lcyBpbiBhIHtAbGluayBQYWNrZXRMaW5lT3V0fSBmb3JtYXQuICovCiAJcHVibGljIHN0YXRpYyBjbGFzcyBQYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlciBleHRlbmRzIFJlZkFkdmVydGlzZXIgewotCQlwcml2YXRlIGZpbmFsIENoYXJzZXRFbmNvZGVyIHV0ZjggPSBVVEZfOC5uZXdFbmNvZGVyKCk7CisJCXByaXZhdGUgZmluYWwgQ2hhcnNldEVuY29kZXIgdXRmOCA9IENIQVJTRVQubmV3RW5jb2RlcigpOwogCQlwcml2YXRlIGZpbmFsIFBhY2tldExpbmVPdXQgcGNrT3V0OwogCiAJCXByaXZhdGUgYnl0ZVtdIGJpbkFyciA9IG5ldyBieXRlWzI1Nl07CkBAIC0xNTIsNyArMTUyLDcgQEAgcHJpdmF0ZSB2b2lkIGdyb3coKSB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHJvdGVjdGVkIHZvaWQgd3JpdGVPbmUoZmluYWwgQ2hhclNlcXVlbmNlIGxpbmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCXByb3RlY3RlZCB2b2lkIHdyaXRlT25lKENoYXJTZXF1ZW5jZSBsaW5lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJcGNrT3V0LndyaXRlU3RyaW5nKGxpbmUudG9TdHJpbmcoKSk7CiAJCX0KIApAQCAtMTc2LDYgKzE3NiwxMSBAQCBwcm90ZWN0ZWQgdm9pZCBlbmQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJYm9vbGVhbiBmaXJzdCA9IHRydWU7CiAKKwlwcml2YXRlIGJvb2xlYW4gdXNlUHJvdG9jb2xWMjsKKworCS8qIG9ubHkgdXNlZCBpbiBwcm90b2NvbCB2MiAqLworCXByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBzeW1yZWZzID0gbmV3IEhhc2hNYXA8PigpOworCiAJLyoqCiAJICogSW5pdGlhbGl6ZSB0aGlzIGFkdmVydGlzZXIgd2l0aCBhIHJlcG9zaXRvcnkgZm9yIHBlZWxpbmcgdGFncy4KIAkgKgpAQCAtMTg3LDYgKzE5MiwxNiBAQCBwdWJsaWMgdm9pZCBpbml0KFJlcG9zaXRvcnkgc3JjKSB7CiAJfQogCiAJLyoqCisJICogQHBhcmFtIGIKKwkgKiAgICAgICAgICAgICAgdHJ1ZSBpZiB0aGlzIGFkdmVydGlzZXIgc2hvdWxkIGFkdmVydGlzZSB1c2luZyB0aGUgcHJvdG9jb2wKKwkgKiAgICAgICAgICAgICAgdjIgZm9ybWF0LCBmYWxzZSBvdGhlcndpc2UKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHZvaWQgc2V0VXNlUHJvdG9jb2xWMihib29sZWFuIGIpIHsKKwkJdXNlUHJvdG9jb2xWMiA9IGI7CisJfQorCisJLyoqCiAJICogVG9nZ2xlIHRhZyBwZWVsaW5nLgogCSAqIDxwPgogCSAqIDxwPgpAQCAtMTk5LDcgKzIxNCw3IEBAIHB1YmxpYyB2b2lkIGluaXQoUmVwb3NpdG9yeSBzcmMpIHsKIAkgKiAgICAgICAgICAgIHRydWUgdG8gc2hvdyB0aGUgZGVyZWZlcmVuY2VkIHZhbHVlIG9mIGEgdGFnIGFzIHRoZSBzcGVjaWFsCiAJICogICAgICAgICAgICByZWYgPGNvZGU+JHRhZ157fTwvY29kZT4gOyBmYWxzZSB0byBvbWl0IGl0IGZyb20gdGhlIG91dHB1dC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXJlZlRhZ3MoZmluYWwgYm9vbGVhbiBkZXJlZikgeworCXB1YmxpYyB2b2lkIHNldERlcmVmVGFncyhib29sZWFuIGRlcmVmKSB7CiAJCWRlcmVmVGFncyA9IGRlcmVmOwogCX0KIApAQCAtMjUzLDcgKzI2OCwxMSBAQCBwdWJsaWMgdm9pZCBhZHZlcnRpc2VDYXBhYmlsaXR5KFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKIAkgKiBAc2luY2UgMy42CiAJICovCiAJcHVibGljIHZvaWQgYWRkU3ltcmVmKFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pIHsKLQkJYWR2ZXJ0aXNlQ2FwYWJpbGl0eShPUFRJT05fU1lNUkVGLCBmcm9tICsgJzonICsgdG8pOworCQlpZiAodXNlUHJvdG9jb2xWMikgeworCQkJc3ltcmVmcy5wdXQoZnJvbSwgdG8pOworCQl9IGVsc2UgeworCQkJYWR2ZXJ0aXNlQ2FwYWJpbGl0eShPUFRJT05fU1lNUkVGLCBmcm9tICsgJzonICsgdG8pOworCQl9CiAJfQogCiAJLyoqCkBAIC0yNjcsMTMgKzI4Niw1NSBAQCBwdWJsaWMgdm9pZCBhZGRTeW1yZWYoU3RyaW5nIGZyb20sIFN0cmluZyB0bykgewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gZmFpbGVkIHRvIHdyaXRlIG91dCBhbgogCSAqICAgICAgICAgICAgIGFkdmVydGlzZW1lbnQgcmVjb3JkLgorCSAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI3NlbmQoQ29sbGVjdGlvbil9IGluc3RlYWQuCiAJICovCisJQERlcHJlY2F0ZWQKIAlwdWJsaWMgU2V0PE9iamVjdElkPiBzZW5kKE1hcDxTdHJpbmcsIFJlZj4gcmVmcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZm9yIChSZWYgcmVmIDogZ2V0U29ydGVkUmVmcyhyZWZzKSkgewotCQkJaWYgKHJlZi5nZXRPYmplY3RJZCgpID09IG51bGwpCi0JCQkJY29udGludWU7CisJCXJldHVybiBzZW5kKHJlZnMudmFsdWVzKCkpOworCX0KIAotCQkJYWR2ZXJ0aXNlQW55KHJlZi5nZXRPYmplY3RJZCgpLCByZWYuZ2V0TmFtZSgpKTsKKwkvKioKKwkgKiBGb3JtYXQgYW4gYWR2ZXJ0aXNlbWVudCBmb3IgdGhlIHN1cHBsaWVkIHJlZnMuCisJICoKKwkgKiBAcGFyYW0gcmVmcworCSAqICAgICAgICAgICAgemVybyBvciBtb3JlIHJlZnMgdG8gZm9ybWF0IGZvciB0aGUgY2xpZW50LiBUaGUgY29sbGVjdGlvbiBpcworCSAqICAgICAgICAgICAgc29ydGVkIGJlZm9yZSBkaXNwbGF5IGlmIG5lY2Vzc2FyeSwgYW5kIHRoZXJlZm9yZSBtYXkgYXBwZWFyCisJICogICAgICAgICAgICBpbiBhbnkgb3JkZXIuCisJICogQHJldHVybiBzZXQgb2YgT2JqZWN0SWRzIHRoYXQgd2VyZSBhZHZlcnRpc2VkIHRvIHRoZSBjbGllbnQuCisJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisJICogICAgICAgICAgICAgdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbSBmYWlsZWQgdG8gd3JpdGUgb3V0IGFuCisJICogICAgICAgICAgICAgYWR2ZXJ0aXNlbWVudCByZWNvcmQuCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBTZXQ8T2JqZWN0SWQ+IHNlbmQoQ29sbGVjdGlvbjxSZWY+IHJlZnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWZvciAoUmVmIHJlZiA6IFJlZkNvbXBhcmF0b3Iuc29ydChyZWZzKSkgeworCQkJLy8gVE9ETyhqcm4pIHJldml2ZSB0aGUgU29ydGVkTWFwIG9wdGltaXphdGlvbiBlLmcuIGJ5IGludHJvZHVjaW5nCisJCQkvLyBTb3J0ZWRMaXN0CisJCQlPYmplY3RJZCBvYmplY3RJZCA9IHJlZi5nZXRPYmplY3RJZCgpOworCQkJaWYgKG9iamVjdElkID09IG51bGwpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHVzZVByb3RvY29sVjIpIHsKKwkJCQlTdHJpbmcgc3ltcmVmUGFydCA9IHN5bXJlZnMuY29udGFpbnNLZXkocmVmLmdldE5hbWUoKSkKKwkJCQkJCT8gKCIgc3ltcmVmLXRhcmdldDoiICsgc3ltcmVmcy5nZXQocmVmLmdldE5hbWUoKSkpIC8vJE5PTi1OTFMtMSQKKwkJCQkJCTogIiI7IC8vJE5PTi1OTFMtMSQKKwkJCQlTdHJpbmcgcGVlbFBhcnQgPSAiIjsgLy8kTk9OLU5MUy0xJAorCQkJCWlmIChkZXJlZlRhZ3MpIHsKKwkJCQkJaWYgKCFyZWYuaXNQZWVsZWQoKSAmJiByZXBvc2l0b3J5ICE9IG51bGwpIHsKKwkJCQkJCXJlZiA9IHJlcG9zaXRvcnkuZ2V0UmVmRGF0YWJhc2UoKS5wZWVsKHJlZik7CisJCQkJCX0KKwkJCQkJT2JqZWN0SWQgcGVlbGVkT2JqZWN0SWQgPSByZWYuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKKwkJCQkJaWYgKHBlZWxlZE9iamVjdElkICE9IG51bGwpIHsKKwkJCQkJCXBlZWxQYXJ0ID0gIiBwZWVsZWQ6IiArIHBlZWxlZE9iamVjdElkLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQorCQkJCXdyaXRlT25lKG9iamVjdElkLmdldE5hbWUoKSArICIgIiArIHJlZi5nZXROYW1lKCkgKyBzeW1yZWZQYXJ0IC8vJE5PTi1OTFMtMSQKKwkJCQkJCSsgcGVlbFBhcnQgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJAorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlhZHZlcnRpc2VBbnkob2JqZWN0SWQsIHJlZi5nZXROYW1lKCkpOwogCiAJCQlpZiAoIWRlcmVmVGFncykKIAkJCQljb250aW51ZTsKQEAgLTI4MSw3ICszNDIsNyBAQCBwdWJsaWMgU2V0PE9iamVjdElkPiBzZW5kKE1hcDxTdHJpbmcsIFJlZj4gcmVmcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWlmICghcmVmLmlzUGVlbGVkKCkpIHsKIAkJCQlpZiAocmVwb3NpdG9yeSA9PSBudWxsKQogCQkJCQljb250aW51ZTsKLQkJCQlyZWYgPSByZXBvc2l0b3J5LnBlZWwocmVmKTsKKwkJCQlyZWYgPSByZXBvc2l0b3J5LmdldFJlZkRhdGFiYXNlKCkucGVlbChyZWYpOwogCQkJfQogCiAJCQlpZiAocmVmLmdldFBlZWxlZE9iamVjdElkKCkgIT0gbnVsbCkKQEAgLTI5MCwxMyArMzUxLDYgQEAgcHVibGljIFNldDxPYmplY3RJZD4gc2VuZChNYXA8U3RyaW5nLCBSZWY+IHJlZnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBzZW50OwogCX0KIAotCXByaXZhdGUgSXRlcmFibGU8UmVmPiBnZXRTb3J0ZWRSZWZzKE1hcDxTdHJpbmcsIFJlZj4gYWxsKSB7Ci0JCWlmIChhbGwgaW5zdGFuY2VvZiBSZWZNYXAKLQkJCQl8fCAoYWxsIGluc3RhbmNlb2YgU29ydGVkTWFwICYmICgoU29ydGVkTWFwKSBhbGwpLmNvbXBhcmF0b3IoKSA9PSBudWxsKSkKLQkJCXJldHVybiBhbGwudmFsdWVzKCk7Ci0JCXJldHVybiBSZWZDb21wYXJhdG9yLnNvcnQoYWxsLnZhbHVlcygpKTsKLQl9Ci0KIAkvKioKIAkgKiBBZHZlcnRpc2Ugb25lIG9iamVjdCBpcyBhdmFpbGFibGUgdXNpbmcgdGhlIG1hZ2ljIHtAY29kZSAuaGF2ZX0uCiAJICogPHA+CkBAIC0zMjQsMTMgKzM3OCwxMyBAQCBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewogCQlyZXR1cm4gZmlyc3Q7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGFkdmVydGlzZUFueU9uY2UoQW55T2JqZWN0SWQgb2JqLCBmaW5hbCBTdHJpbmcgcmVmTmFtZSkKKwlwcml2YXRlIHZvaWQgYWR2ZXJ0aXNlQW55T25jZShBbnlPYmplY3RJZCBvYmosIFN0cmluZyByZWZOYW1lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKCFzZW50LmNvbnRhaW5zKG9iaikpCiAJCQlhZHZlcnRpc2VBbnkob2JqLCByZWZOYW1lKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYWR2ZXJ0aXNlQW55KEFueU9iamVjdElkIG9iaiwgZmluYWwgU3RyaW5nIHJlZk5hbWUpCisJcHJpdmF0ZSB2b2lkIGFkdmVydGlzZUFueShBbnlPYmplY3RJZCBvYmosIFN0cmluZyByZWZOYW1lKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJc2VudC5hZGQob2JqLnRvT2JqZWN0SWQoKSk7CiAJCWFkdmVydGlzZUlkKG9iaiwgcmVmTmFtZSk7CkBAIC0zNTEsNyArNDA1LDcgQEAgcHJpdmF0ZSB2b2lkIGFkdmVydGlzZUFueShBbnlPYmplY3RJZCBvYmosIGZpbmFsIFN0cmluZyByZWZOYW1lKQogCSAqICAgICAgICAgICAgIHRoZSB1bmRlcmx5aW5nIG91dHB1dCBzdHJlYW0gZmFpbGVkIHRvIHdyaXRlIG91dCBhbgogCSAqICAgICAgICAgICAgIGFkdmVydGlzZW1lbnQgcmVjb3JkLgogCSAqLwotCXB1YmxpYyB2b2lkIGFkdmVydGlzZUlkKGZpbmFsIEFueU9iamVjdElkIGlkLCBmaW5hbCBTdHJpbmcgcmVmTmFtZSkKKwlwdWJsaWMgdm9pZCBhZHZlcnRpc2VJZChBbnlPYmplY3RJZCBpZCwgU3RyaW5nIHJlZk5hbWUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQl0bXBMaW5lLnNldExlbmd0aCgwKTsKIAkJaWQuY29weVRvKHRtcElkLCB0bXBMaW5lKTsKQEAgLTM2MSw3ICs0MTUsNyBAQCBwdWJsaWMgdm9pZCBhZHZlcnRpc2VJZChmaW5hbCBBbnlPYmplY3RJZCBpZCwgZmluYWwgU3RyaW5nIHJlZk5hbWUpCiAJCQlmaXJzdCA9IGZhbHNlOwogCQkJaWYgKCFjYXBhYmxpdGllcy5pc0VtcHR5KCkpIHsKIAkJCQl0bXBMaW5lLmFwcGVuZCgnXDAnKTsKLQkJCQlmb3IgKGZpbmFsIFN0cmluZyBjYXBOYW1lIDogY2FwYWJsaXRpZXMpIHsKKwkJCQlmb3IgKFN0cmluZyBjYXBOYW1lIDogY2FwYWJsaXRpZXMpIHsKIAkJCQkJdG1wTGluZS5hcHBlbmQoJyAnKTsKIAkJCQkJdG1wTGluZS5hcHBlbmQoY2FwTmFtZSk7CiAJCQkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZGaWx0ZXIuamF2YQppbmRleCBiYmU0Zjg0Li45OTJkZGM2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZGaWx0ZXIuamF2YQpAQCAtNjMsNyArNjMsNyBAQCBwdWJsaWMgaW50ZXJmYWNlIFJlZkZpbHRlciB7CiAJICovCiAJcHVibGljIHN0YXRpYyBmaW5hbCBSZWZGaWx0ZXIgREVGQVVMVCA9IG5ldyBSZWZGaWx0ZXIoKSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgTWFwPFN0cmluZywgUmVmPiBmaWx0ZXIgKGZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gcmVmcykgeworCQlwdWJsaWMgTWFwPFN0cmluZywgUmVmPiBmaWx0ZXIgKE1hcDxTdHJpbmcsIFJlZj4gcmVmcykgewogCQkJcmV0dXJuIHJlZnM7CiAJCX0KIAl9OwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlYy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVmU3BlYy5qYXZhCmluZGV4IGUxYjMwNmUuLmFmZDNhZGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlZlNwZWMuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZWZTcGVjLmphdmEKQEAgLTcyLDcgKzcyLDcgQEAgcHVibGljIGNsYXNzIFJlZlNwZWMgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewogCSAqICAgICAgICAgICAgcmVmIHNwZWMgY29tcG9uZW50IC0gc3RyaW5nIHRvIHRlc3QuIENhbiBiZSBudWxsLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiBwcm92aWRlZCBzdHJpbmcgaXMgYSB3aWxkY2FyZCByZWYgc3BlYyBjb21wb25lbnQuCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzV2lsZGNhcmQoZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaWxkY2FyZChTdHJpbmcgcykgewogCQlyZXR1cm4gcyAhPSBudWxsICYmIHMuY29udGFpbnMoIioiKTsgLy8kTk9OLU5MUy0xJAogCX0KIApAQCAtMjIyLDExICsyMjIsMTEgQEAgcHVibGljIFJlZlNwZWMoU3RyaW5nIHNwZWMsIFdpbGRjYXJkTW9kZSBtb2RlKSB7CiAJICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgdGhlIHNwZWNpZmljYXRpb24gaXMgaW52YWxpZC4KIAkgKi8KLQlwdWJsaWMgUmVmU3BlYyhmaW5hbCBTdHJpbmcgc3BlYykgeworCXB1YmxpYyBSZWZTcGVjKFN0cmluZyBzcGVjKSB7CiAJCXRoaXMoc3BlYywgV2lsZGNhcmRNb2RlLlJFUVVJUkVfTUFUQ0gpOwogCX0KIAotCXByaXZhdGUgUmVmU3BlYyhmaW5hbCBSZWZTcGVjIHApIHsKKwlwcml2YXRlIFJlZlNwZWMoUmVmU3BlYyBwKSB7CiAJCWZvcmNlID0gcC5pc0ZvcmNlVXBkYXRlKCk7CiAJCXdpbGRjYXJkID0gcC5pc1dpbGRjYXJkKCk7CiAJCXNyY05hbWUgPSBwLmdldFNvdXJjZSgpOwpAQCAtMjUwLDcgKzI1MCw3IEBAIHB1YmxpYyBib29sZWFuIGlzRm9yY2VVcGRhdGUoKSB7CiAJICogICAgICAgICAgICBuZXcgdmFsdWUgZm9yIGZvcmNlIHVwZGF0ZSBpbiB0aGUgcmV0dXJuZWQgaW5zdGFuY2UuCiAJICogQHJldHVybiBhIG5ldyBSZWZTcGVjIHdpdGggZm9yY2UgdXBkYXRlIGFzIHNwZWNpZmllZC4KIAkgKi8KLQlwdWJsaWMgUmVmU3BlYyBzZXRGb3JjZVVwZGF0ZShmaW5hbCBib29sZWFuIGZvcmNlVXBkYXRlKSB7CisJcHVibGljIFJlZlNwZWMgc2V0Rm9yY2VVcGRhdGUoYm9vbGVhbiBmb3JjZVVwZGF0ZSkgewogCQlmaW5hbCBSZWZTcGVjIHIgPSBuZXcgUmVmU3BlYyh0aGlzKTsKIAkJci5mb3JjZSA9IGZvcmNlVXBkYXRlOwogCQlyZXR1cm4gcjsKQEAgLTI5Myw3ICsyOTMsNyBAQCBwdWJsaWMgU3RyaW5nIGdldFNvdXJjZSgpIHsKIAkgKiAgICAgICAgICAgICBzdGF0dXMgb2YgdGhlIGV4aXN0aW5nIGRlc3RpbmF0aW9uIGRpc2FncmVlcyB3aXRoIHRoZQogCSAqICAgICAgICAgICAgIHdpbGRjYXJkIHN0YXR1cyBvZiB0aGUgbmV3IHNvdXJjZS4KIAkgKi8KLQlwdWJsaWMgUmVmU3BlYyBzZXRTb3VyY2UoZmluYWwgU3RyaW5nIHNvdXJjZSkgeworCXB1YmxpYyBSZWZTcGVjIHNldFNvdXJjZShTdHJpbmcgc291cmNlKSB7CiAJCWZpbmFsIFJlZlNwZWMgciA9IG5ldyBSZWZTcGVjKHRoaXMpOwogCQlyLnNyY05hbWUgPSBjaGVja1ZhbGlkKHNvdXJjZSk7CiAJCWlmIChpc1dpbGRjYXJkKHIuc3JjTmFtZSkgJiYgci5kc3ROYW1lID09IG51bGwpCkBAIC0zMzIsNyArMzMyLDcgQEAgcHVibGljIFN0cmluZyBnZXREZXN0aW5hdGlvbigpIHsKIAkgKiAgICAgICAgICAgICBvZiB0aGUgZXhpc3Rpbmcgc291cmNlIGRpc2FncmVlcyB3aXRoIHRoZSB3aWxkY2FyZCBzdGF0dXMgb2YKIAkgKiAgICAgICAgICAgICB0aGUgbmV3IGRlc3RpbmF0aW9uLgogCSAqLwotCXB1YmxpYyBSZWZTcGVjIHNldERlc3RpbmF0aW9uKGZpbmFsIFN0cmluZyBkZXN0aW5hdGlvbikgeworCXB1YmxpYyBSZWZTcGVjIHNldERlc3RpbmF0aW9uKFN0cmluZyBkZXN0aW5hdGlvbikgewogCQlmaW5hbCBSZWZTcGVjIHIgPSBuZXcgUmVmU3BlYyh0aGlzKTsKIAkJci5kc3ROYW1lID0gY2hlY2tWYWxpZChkZXN0aW5hdGlvbik7CiAJCWlmIChpc1dpbGRjYXJkKHIuZHN0TmFtZSkgJiYgci5zcmNOYW1lID09IG51bGwpCkBAIC0zNzIsNyArMzcyLDcgQEAgcHVibGljIFJlZlNwZWMgc2V0U291cmNlRGVzdGluYXRpb24oZmluYWwgU3RyaW5nIHNvdXJjZSwKIAkgKiAgICAgICAgICAgIHJlZiBuYW1lIHRoYXQgc2hvdWxkIGJlIHRlc3RlZC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG5hbWVzIG1hdGNoOyBmYWxzZSBvdGhlcndpc2UuCiAJICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2hTb3VyY2UoZmluYWwgU3RyaW5nIHIpIHsKKwlwdWJsaWMgYm9vbGVhbiBtYXRjaFNvdXJjZShTdHJpbmcgcikgewogCQlyZXR1cm4gbWF0Y2gociwgZ2V0U291cmNlKCkpOwogCX0KIApAQCAtMzgzLDcgKzM4Myw3IEBAIHB1YmxpYyBib29sZWFuIG1hdGNoU291cmNlKGZpbmFsIFN0cmluZyByKSB7CiAJICogICAgICAgICAgICByZWYgd2hvc2UgbmFtZSBzaG91bGQgYmUgdGVzdGVkLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZXMgbWF0Y2g7IGZhbHNlIG90aGVyd2lzZS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaFNvdXJjZShmaW5hbCBSZWYgcikgeworCXB1YmxpYyBib29sZWFuIG1hdGNoU291cmNlKFJlZiByKSB7CiAJCXJldHVybiBtYXRjaChyLmdldE5hbWUoKSwgZ2V0U291cmNlKCkpOwogCX0KIApAQCAtMzk0LDcgKzM5NCw3IEBAIHB1YmxpYyBib29sZWFuIG1hdGNoU291cmNlKGZpbmFsIFJlZiByKSB7CiAJICogICAgICAgICAgICByZWYgbmFtZSB0aGF0IHNob3VsZCBiZSB0ZXN0ZWQuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBuYW1lcyBtYXRjaDsgZmFsc2Ugb3RoZXJ3aXNlLgogCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoRGVzdGluYXRpb24oZmluYWwgU3RyaW5nIHIpIHsKKwlwdWJsaWMgYm9vbGVhbiBtYXRjaERlc3RpbmF0aW9uKFN0cmluZyByKSB7CiAJCXJldHVybiBtYXRjaChyLCBnZXREZXN0aW5hdGlvbigpKTsKIAl9CiAKQEAgLTQwNSw3ICs0MDUsNyBAQCBwdWJsaWMgYm9vbGVhbiBtYXRjaERlc3RpbmF0aW9uKGZpbmFsIFN0cmluZyByKSB7CiAJICogICAgICAgICAgICByZWYgd2hvc2UgbmFtZSBzaG91bGQgYmUgdGVzdGVkLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbmFtZXMgbWF0Y2g7IGZhbHNlIG90aGVyd2lzZS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaERlc3RpbmF0aW9uKGZpbmFsIFJlZiByKSB7CisJcHVibGljIGJvb2xlYW4gbWF0Y2hEZXN0aW5hdGlvbihSZWYgcikgewogCQlyZXR1cm4gbWF0Y2goci5nZXROYW1lKCksIGdldERlc3RpbmF0aW9uKCkpOwogCX0KIApAQCAtNDI1LDcgKzQyNSw3IEBAIHB1YmxpYyBib29sZWFuIG1hdGNoRGVzdGluYXRpb24oZmluYWwgUmVmIHIpIHsKIAkgKiAgICAgICAgICAgICB3aGVuIHRoZSBSZWZTcGVjIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIHdpbGRjYXJkIG1vZGUgdGhhdAogCSAqICAgICAgICAgICAgIGRvZXNuJ3QgcmVxdWlyZSBtYXRjaGluZyB3aWxkY2FyZHMuCiAJICovCi0JcHVibGljIFJlZlNwZWMgZXhwYW5kRnJvbVNvdXJjZShmaW5hbCBTdHJpbmcgcikgeworCXB1YmxpYyBSZWZTcGVjIGV4cGFuZEZyb21Tb3VyY2UoU3RyaW5nIHIpIHsKIAkJaWYgKGFsbG93TWlzbWF0Y2hlZFdpbGRjYXJkcyAhPSBXaWxkY2FyZE1vZGUuUkVRVUlSRV9NQVRDSCkgewogCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKIAkJCQkJSkdpdFRleHQuZ2V0KCkuaW52YWxpZEV4cGFuZFdpbGRjYXJkKTsKQEAgLTQzMyw3ICs0MzMsNyBAQCBwdWJsaWMgUmVmU3BlYyBleHBhbmRGcm9tU291cmNlKGZpbmFsIFN0cmluZyByKSB7CiAJCXJldHVybiBpc1dpbGRjYXJkKCkgPyBuZXcgUmVmU3BlYyh0aGlzKS5leHBhbmRGcm9tU291cmNlSW1wKHIpIDogdGhpczsKIAl9CiAKLQlwcml2YXRlIFJlZlNwZWMgZXhwYW5kRnJvbVNvdXJjZUltcChmaW5hbCBTdHJpbmcgbmFtZSkgeworCXByaXZhdGUgUmVmU3BlYyBleHBhbmRGcm9tU291cmNlSW1wKFN0cmluZyBuYW1lKSB7CiAJCWZpbmFsIFN0cmluZyBwc3JjID0gc3JjTmFtZSwgcGRzdCA9IGRzdE5hbWU7CiAJCXdpbGRjYXJkID0gZmFsc2U7CiAJCXNyY05hbWUgPSBuYW1lOwpAQCAtNDU3LDcgKzQ1Nyw3IEBAIHByaXZhdGUgUmVmU3BlYyBleHBhbmRGcm9tU291cmNlSW1wKGZpbmFsIFN0cmluZyBuYW1lKSB7CiAJICogICAgICAgICAgICAgd2hlbiB0aGUgUmVmU3BlYyB3YXMgY29uc3RydWN0ZWQgd2l0aCB3aWxkY2FyZCBtb2RlIHRoYXQKIAkgKiAgICAgICAgICAgICBkb2Vzbid0IHJlcXVpcmUgbWF0Y2hpbmcgd2lsZGNhcmRzLgogCSAqLwotCXB1YmxpYyBSZWZTcGVjIGV4cGFuZEZyb21Tb3VyY2UoZmluYWwgUmVmIHIpIHsKKwlwdWJsaWMgUmVmU3BlYyBleHBhbmRGcm9tU291cmNlKFJlZiByKSB7CiAJCXJldHVybiBleHBhbmRGcm9tU291cmNlKHIuZ2V0TmFtZSgpKTsKIAl9CiAKQEAgLTQ3Nyw3ICs0NzcsNyBAQCBwdWJsaWMgUmVmU3BlYyBleHBhbmRGcm9tU291cmNlKGZpbmFsIFJlZiByKSB7CiAJICogICAgICAgICAgICAgd2hlbiB0aGUgUmVmU3BlYyB3YXMgY29uc3RydWN0ZWQgd2l0aCB3aWxkY2FyZCBtb2RlIHRoYXQKIAkgKiAgICAgICAgICAgICBkb2Vzbid0IHJlcXVpcmUgbWF0Y2hpbmcgd2lsZGNhcmRzLgogCSAqLwotCXB1YmxpYyBSZWZTcGVjIGV4cGFuZEZyb21EZXN0aW5hdGlvbihmaW5hbCBTdHJpbmcgcikgeworCXB1YmxpYyBSZWZTcGVjIGV4cGFuZEZyb21EZXN0aW5hdGlvbihTdHJpbmcgcikgewogCQlpZiAoYWxsb3dNaXNtYXRjaGVkV2lsZGNhcmRzICE9IFdpbGRjYXJkTW9kZS5SRVFVSVJFX01BVENIKSB7CiAJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAogCQkJCQlKR2l0VGV4dC5nZXQoKS5pbnZhbGlkRXhwYW5kV2lsZGNhcmQpOwpAQCAtNDg1LDcgKzQ4NSw3IEBAIHB1YmxpYyBSZWZTcGVjIGV4cGFuZEZyb21EZXN0aW5hdGlvbihmaW5hbCBTdHJpbmcgcikgewogCQlyZXR1cm4gaXNXaWxkY2FyZCgpID8gbmV3IFJlZlNwZWModGhpcykuZXhwYW5kRnJvbURzdEltcChyKSA6IHRoaXM7CiAJfQogCi0JcHJpdmF0ZSBSZWZTcGVjIGV4cGFuZEZyb21Ec3RJbXAoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIFJlZlNwZWMgZXhwYW5kRnJvbURzdEltcChTdHJpbmcgbmFtZSkgewogCQlmaW5hbCBTdHJpbmcgcHNyYyA9IHNyY05hbWUsIHBkc3QgPSBkc3ROYW1lOwogCQl3aWxkY2FyZCA9IGZhbHNlOwogCQlzcmNOYW1lID0gZXhwYW5kV2lsZGNhcmQobmFtZSwgcGRzdCwgcHNyYyk7CkBAIC01MDgsMTEgKzUwOCwxMSBAQCBwcml2YXRlIFJlZlNwZWMgZXhwYW5kRnJvbURzdEltcChmaW5hbCBTdHJpbmcgbmFtZSkgewogCSAqICAgICAgICAgICAgIHdoZW4gdGhlIFJlZlNwZWMgd2FzIGNvbnN0cnVjdGVkIHdpdGggd2lsZGNhcmQgbW9kZSB0aGF0CiAJICogICAgICAgICAgICAgZG9lc24ndCByZXF1aXJlIG1hdGNoaW5nIHdpbGRjYXJkcy4KIAkgKi8KLQlwdWJsaWMgUmVmU3BlYyBleHBhbmRGcm9tRGVzdGluYXRpb24oZmluYWwgUmVmIHIpIHsKKwlwdWJsaWMgUmVmU3BlYyBleHBhbmRGcm9tRGVzdGluYXRpb24oUmVmIHIpIHsKIAkJcmV0dXJuIGV4cGFuZEZyb21EZXN0aW5hdGlvbihyLmdldE5hbWUoKSk7CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIG1hdGNoKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgcykgeworCXByaXZhdGUgYm9vbGVhbiBtYXRjaChTdHJpbmcgbmFtZSwgU3RyaW5nIHMpIHsKIAkJaWYgKHMgPT0gbnVsbCkKIAkJCXJldHVybiBmYWxzZTsKIAkJaWYgKGlzV2lsZGNhcmQocykpIHsKQEAgLTU0MSw3ICs1NDEsNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2hlY2tWYWxpZChTdHJpbmcgc3BlYykgewogCQlyZXR1cm4gc3BlYzsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoZmluYWwgU3RyaW5nIHMpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHMpIHsKIAkJaWYgKHMuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCiAJCQlyZXR1cm4gZmFsc2U7CiAJCWlmIChzLmNvbnRhaW5zKCIvLyIpKSAvLyROT04tTkxTLTEkCkBAIC01NjksNyArNTY5LDcgQEAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCQlpZiAoIShvYmogaW5zdGFuY2VvZiBSZWZTcGVjKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJZmluYWwgUmVmU3BlYyBiID0gKFJlZlNwZWMpIG9iajsKQEAgLTU4NCw3ICs1ODQsNyBAQCBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxKGZpbmFsIFN0cmluZyBhLCBmaW5hbCBTdHJpbmcgYikgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXEoU3RyaW5nIGEsIFN0cmluZyBiKSB7CiAJCWlmIChhID09IGIpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9SZW1vdGVDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZUNvbmZpZy5qYXZhCmluZGV4IDdiODgyZWMuLjBhNjIxZjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZUNvbmZpZy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZUNvbmZpZy5qYXZhCkBAIC0xMTIsNyArMTEyLDcgQEAgcHVibGljIGNsYXNzIFJlbW90ZUNvbmZpZyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAJICogQHRocm93cyBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBvbmUgb2YgdGhlIFVSSXMgd2l0aGluIHRoZSByZW1vdGUncyBjb25maWd1cmF0aW9uIGlzIGludmFsaWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBMaXN0PFJlbW90ZUNvbmZpZz4gZ2V0QWxsUmVtb3RlQ29uZmlncyhmaW5hbCBDb25maWcgcmMpCisJcHVibGljIHN0YXRpYyBMaXN0PFJlbW90ZUNvbmZpZz4gZ2V0QWxsUmVtb3RlQ29uZmlncyhDb25maWcgcmMpCiAJCQl0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKIAkJZmluYWwgTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDw+KHJjCiAJCQkJLmdldFN1YnNlY3Rpb25zKFNFQ1RJT04pKTsKQEAgLTEyMCw3ICsxMjAsNyBAQCBwdWJsaWMgc3RhdGljIExpc3Q8UmVtb3RlQ29uZmlnPiBnZXRBbGxSZW1vdGVDb25maWdzKGZpbmFsIENvbmZpZyByYykKIAogCQlmaW5hbCBMaXN0PFJlbW90ZUNvbmZpZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KG5hbWVzCiAJCQkJLnNpemUoKSk7Ci0JCWZvciAoZmluYWwgU3RyaW5nIG5hbWUgOiBuYW1lcykKKwkJZm9yIChTdHJpbmcgbmFtZSA6IG5hbWVzKQogCQkJcmVzdWx0LmFkZChuZXcgUmVtb3RlQ29uZmlnKHJjLCBuYW1lKSk7CiAJCXJldHVybiByZXN1bHQ7CiAJfQpAQCAtMTYwLDcgKzE2MCw3IEBAIHB1YmxpYyBzdGF0aWMgTGlzdDxSZW1vdGVDb25maWc+IGdldEFsbFJlbW90ZUNvbmZpZ3MoZmluYWwgQ29uZmlnIHJjKQogCSAqIEB0aHJvd3MgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgb25lIG9mIHRoZSBVUklzIHdpdGhpbiB0aGUgcmVtb3RlJ3MgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkLgogCSAqLwotCXB1YmxpYyBSZW1vdGVDb25maWcoZmluYWwgQ29uZmlnIHJjLCBmaW5hbCBTdHJpbmcgcmVtb3RlTmFtZSkKKwlwdWJsaWMgUmVtb3RlQ29uZmlnKENvbmZpZyByYywgU3RyaW5nIHJlbW90ZU5hbWUpCiAJCQl0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKIAkJbmFtZSA9IHJlbW90ZU5hbWU7CiAKQEAgLTE3MCwxMiArMTcwLDEyIEBAIHB1YmxpYyBSZW1vdGVDb25maWcoZmluYWwgQ29uZmlnIHJjLCBmaW5hbCBTdHJpbmcgcmVtb3RlTmFtZSkKIAkJdmxzdCA9IHJjLmdldFN0cmluZ0xpc3QoU0VDVElPTiwgbmFtZSwgS0VZX1VSTCk7CiAJCU1hcDxTdHJpbmcsIFN0cmluZz4gaW5zdGVhZE9mID0gZ2V0UmVwbGFjZW1lbnRzKHJjLCBLRVlfSU5TVEVBRE9GKTsKIAkJdXJpcyA9IG5ldyBBcnJheUxpc3Q8Pih2bHN0Lmxlbmd0aCk7Ci0JCWZvciAoZmluYWwgU3RyaW5nIHMgOiB2bHN0KSB7CisJCWZvciAoU3RyaW5nIHMgOiB2bHN0KSB7CiAJCQl1cmlzLmFkZChuZXcgVVJJaXNoKHJlcGxhY2VVcmkocywgaW5zdGVhZE9mKSkpOwogCQl9CiAJCVN0cmluZ1tdIHBsc3QgPSByYy5nZXRTdHJpbmdMaXN0KFNFQ1RJT04sIG5hbWUsIEtFWV9QVVNIVVJMKTsKIAkJcHVzaFVSSXMgPSBuZXcgQXJyYXlMaXN0PD4ocGxzdC5sZW5ndGgpOwotCQlmb3IgKGZpbmFsIFN0cmluZyBzIDogcGxzdCkgeworCQlmb3IgKFN0cmluZyBzIDogcGxzdCkgewogCQkJcHVzaFVSSXMuYWRkKG5ldyBVUklpc2gocykpOwogCQl9CiAJCWlmIChwdXNoVVJJcy5pc0VtcHR5KCkpIHsKQEAgLTIyMywyNiArMjIzLDI2IEBAIHB1YmxpYyBSZW1vdGVDb25maWcoZmluYWwgQ29uZmlnIHJjLCBmaW5hbCBTdHJpbmcgcmVtb3RlTmFtZSkKIAkgKiBAcGFyYW0gcmMKIAkgKiAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdG8gc3RvcmUgb3Vyc2VsdmVzIGludG8uCiAJICovCi0JcHVibGljIHZvaWQgdXBkYXRlKGZpbmFsIENvbmZpZyByYykgeworCXB1YmxpYyB2b2lkIHVwZGF0ZShDb25maWcgcmMpIHsKIAkJZmluYWwgTGlzdDxTdHJpbmc+IHZsc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogCQl2bHN0LmNsZWFyKCk7Ci0JCWZvciAoZmluYWwgVVJJaXNoIHUgOiBnZXRVUklzKCkpCisJCWZvciAoVVJJaXNoIHUgOiBnZXRVUklzKCkpCiAJCQl2bHN0LmFkZCh1LnRvUHJpdmF0ZVN0cmluZygpKTsKIAkJcmMuc2V0U3RyaW5nTGlzdChTRUNUSU9OLCBnZXROYW1lKCksIEtFWV9VUkwsIHZsc3QpOwogCiAJCXZsc3QuY2xlYXIoKTsKLQkJZm9yIChmaW5hbCBVUklpc2ggdSA6IGdldFB1c2hVUklzKCkpCisJCWZvciAoVVJJaXNoIHUgOiBnZXRQdXNoVVJJcygpKQogCQkJdmxzdC5hZGQodS50b1ByaXZhdGVTdHJpbmcoKSk7CiAJCXJjLnNldFN0cmluZ0xpc3QoU0VDVElPTiwgZ2V0TmFtZSgpLCBLRVlfUFVTSFVSTCwgdmxzdCk7CiAKIAkJdmxzdC5jbGVhcigpOwotCQlmb3IgKGZpbmFsIFJlZlNwZWMgdSA6IGdldEZldGNoUmVmU3BlY3MoKSkKKwkJZm9yIChSZWZTcGVjIHUgOiBnZXRGZXRjaFJlZlNwZWNzKCkpCiAJCQl2bHN0LmFkZCh1LnRvU3RyaW5nKCkpOwogCQlyYy5zZXRTdHJpbmdMaXN0KFNFQ1RJT04sIGdldE5hbWUoKSwgS0VZX0ZFVENILCB2bHN0KTsKIAogCQl2bHN0LmNsZWFyKCk7Ci0JCWZvciAoZmluYWwgUmVmU3BlYyB1IDogZ2V0UHVzaFJlZlNwZWNzKCkpCisJCWZvciAoUmVmU3BlYyB1IDogZ2V0UHVzaFJlZlNwZWNzKCkpCiAJCQl2bHN0LmFkZCh1LnRvU3RyaW5nKCkpOwogCQlyYy5zZXRTdHJpbmdMaXN0KFNFQ1RJT04sIGdldE5hbWUoKSwgS0VZX1BVU0gsIHZsc3QpOwogCkBAIC0yNzcsNyArMjc3LDcgQEAgcHJpdmF0ZSB2b2lkIHNldChmaW5hbCBDb25maWcgcmMsIGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIGludCBjdXJyZW50VmFsdWUsCiAJCQlyYy5zZXRJbnQoU0VDVElPTiwgZ2V0TmFtZSgpLCBrZXksIGN1cnJlbnRWYWx1ZSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHVuc2V0KGZpbmFsIENvbmZpZyByYywgZmluYWwgU3RyaW5nIGtleSkgeworCXByaXZhdGUgdm9pZCB1bnNldChDb25maWcgcmMsIFN0cmluZyBrZXkpIHsKIAkJcmMudW5zZXQoU0VDVElPTiwgZ2V0TmFtZSgpLCBrZXkpOwogCX0KIApAQCAtMzM1LDcgKzMzNSw3IEBAIHB1YmxpYyBMaXN0PFVSSWlzaD4gZ2V0VVJJcygpIHsKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgVVJJIHRvIGFkZCB0byB0aGlzIHJlbW90ZS4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFVSSSB3YXMgYWRkZWQ7IGZhbHNlIGlmIGl0IGFscmVhZHkgZXhpc3RzLgogCSAqLwotCXB1YmxpYyBib29sZWFuIGFkZFVSSShmaW5hbCBVUklpc2ggdG9BZGQpIHsKKwlwdWJsaWMgYm9vbGVhbiBhZGRVUkkoVVJJaXNoIHRvQWRkKSB7CiAJCWlmICh1cmlzLmNvbnRhaW5zKHRvQWRkKSkKIAkJCXJldHVybiBmYWxzZTsKIAkJcmV0dXJuIHVyaXMuYWRkKHRvQWRkKTsKQEAgLTM0OCw3ICszNDgsNyBAQCBwdWJsaWMgYm9vbGVhbiBhZGRVUkkoZmluYWwgVVJJaXNoIHRvQWRkKSB7CiAJICogICAgICAgICAgICB0aGUgVVJJIHRvIHJlbW92ZSBmcm9tIHRoaXMgcmVtb3RlLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgVVJJIHdhcyBhZGRlZDsgZmFsc2UgaWYgaXQgYWxyZWFkeSBleGlzdHMuCiAJICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlVVJJKGZpbmFsIFVSSWlzaCB0b1JlbW92ZSkgeworCXB1YmxpYyBib29sZWFuIHJlbW92ZVVSSShVUklpc2ggdG9SZW1vdmUpIHsKIAkJcmV0dXJuIHVyaXMucmVtb3ZlKHRvUmVtb3ZlKTsKIAl9CiAKQEAgLTM2OCw3ICszNjgsNyBAQCBwdWJsaWMgTGlzdDxVUklpc2g+IGdldFB1c2hVUklzKCkgewogCSAqICAgICAgICAgICAgdGhlIG5ldyBVUkkgdG8gYWRkIHRvIHRoaXMgcmVtb3RlLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgVVJJIHdhcyBhZGRlZDsgZmFsc2UgaWYgaXQgYWxyZWFkeSBleGlzdHMuCiAJICovCi0JcHVibGljIGJvb2xlYW4gYWRkUHVzaFVSSShmaW5hbCBVUklpc2ggdG9BZGQpIHsKKwlwdWJsaWMgYm9vbGVhbiBhZGRQdXNoVVJJKFVSSWlzaCB0b0FkZCkgewogCQlpZiAocHVzaFVSSXMuY29udGFpbnModG9BZGQpKQogCQkJcmV0dXJuIGZhbHNlOwogCQlyZXR1cm4gcHVzaFVSSXMuYWRkKHRvQWRkKTsKQEAgLTM4MSw3ICszODEsNyBAQCBwdWJsaWMgYm9vbGVhbiBhZGRQdXNoVVJJKGZpbmFsIFVSSWlzaCB0b0FkZCkgewogCSAqICAgICAgICAgICAgdGhlIFVSSSB0byByZW1vdmUgZnJvbSB0aGlzIHJlbW90ZS4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFVSSSB3YXMgYWRkZWQ7IGZhbHNlIGlmIGl0IGFscmVhZHkgZXhpc3RzLgogCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZVB1c2hVUkkoZmluYWwgVVJJaXNoIHRvUmVtb3ZlKSB7CisJcHVibGljIGJvb2xlYW4gcmVtb3ZlUHVzaFVSSShVUklpc2ggdG9SZW1vdmUpIHsKIAkJcmV0dXJuIHB1c2hVUklzLnJlbW92ZSh0b1JlbW92ZSk7CiAJfQogCkBAIC00MDEsNyArNDAxLDcgQEAgcHVibGljIExpc3Q8UmVmU3BlYz4gZ2V0RmV0Y2hSZWZTcGVjcygpIHsKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgc3BlY2lmaWNhdGlvbiB0byBhZGQuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpY2F0aW9uIHdhcyBhZGRlZDsgZmFsc2UgaWYgaXQgYWxyZWFkeSBleGlzdHMuCiAJICovCi0JcHVibGljIGJvb2xlYW4gYWRkRmV0Y2hSZWZTcGVjKGZpbmFsIFJlZlNwZWMgcykgeworCXB1YmxpYyBib29sZWFuIGFkZEZldGNoUmVmU3BlYyhSZWZTcGVjIHMpIHsKIAkJaWYgKGZldGNoLmNvbnRhaW5zKHMpKQogCQkJcmV0dXJuIGZhbHNlOwogCQlyZXR1cm4gZmV0Y2guYWRkKHMpOwpAQCAtNDE0LDcgKzQxNCw3IEBAIHB1YmxpYyBib29sZWFuIGFkZEZldGNoUmVmU3BlYyhmaW5hbCBSZWZTcGVjIHMpIHsKIAkgKiAgICAgICAgICAgIGxpc3Qgb2YgZmV0Y2ggc3BlY2lmaWNhdGlvbnMgdG8gc2V0LiBMaXN0IGlzIGNvcGllZCwgaXQgY2FuIGJlCiAJICogICAgICAgICAgICBtb2RpZmllZCBhZnRlciB0aGlzIGNhbGwuCiAJICovCi0JcHVibGljIHZvaWQgc2V0RmV0Y2hSZWZTcGVjcyhmaW5hbCBMaXN0PFJlZlNwZWM+IHNwZWNzKSB7CisJcHVibGljIHZvaWQgc2V0RmV0Y2hSZWZTcGVjcyhMaXN0PFJlZlNwZWM+IHNwZWNzKSB7CiAJCWZldGNoLmNsZWFyKCk7CiAJCWZldGNoLmFkZEFsbChzcGVjcyk7CiAJfQpAQCAtNDI2LDcgKzQyNiw3IEBAIHB1YmxpYyB2b2lkIHNldEZldGNoUmVmU3BlY3MoZmluYWwgTGlzdDxSZWZTcGVjPiBzcGVjcykgewogCSAqICAgICAgICAgICAgbGlzdCBvZiBwdXNoIHNwZWNpZmljYXRpb25zIHRvIHNldC4gTGlzdCBpcyBjb3BpZWQsIGl0IGNhbiBiZQogCSAqICAgICAgICAgICAgbW9kaWZpZWQgYWZ0ZXIgdGhpcyBjYWxsLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1c2hSZWZTcGVjcyhmaW5hbCBMaXN0PFJlZlNwZWM+IHNwZWNzKSB7CisJcHVibGljIHZvaWQgc2V0UHVzaFJlZlNwZWNzKExpc3Q8UmVmU3BlYz4gc3BlY3MpIHsKIAkJcHVzaC5jbGVhcigpOwogCQlwdXNoLmFkZEFsbChzcGVjcyk7CiAJfQpAQCAtNDM4LDcgKzQzOCw3IEBAIHB1YmxpYyB2b2lkIHNldFB1c2hSZWZTcGVjcyhmaW5hbCBMaXN0PFJlZlNwZWM+IHNwZWNzKSB7CiAJICogICAgICAgICAgICB0aGUgc3BlY2lmaWNhdGlvbiB0byByZW1vdmUuCiAJICogQHJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpY2F0aW9uIGV4aXN0ZWQgYW5kIHdhcyByZW1vdmVkLgogCSAqLwotCXB1YmxpYyBib29sZWFuIHJlbW92ZUZldGNoUmVmU3BlYyhmaW5hbCBSZWZTcGVjIHMpIHsKKwlwdWJsaWMgYm9vbGVhbiByZW1vdmVGZXRjaFJlZlNwZWMoUmVmU3BlYyBzKSB7CiAJCXJldHVybiBmZXRjaC5yZW1vdmUocyk7CiAJfQogCkBAIC00NTgsNyArNDU4LDcgQEAgcHVibGljIExpc3Q8UmVmU3BlYz4gZ2V0UHVzaFJlZlNwZWNzKCkgewogCSAqICAgICAgICAgICAgdGhlIG5ldyBzcGVjaWZpY2F0aW9uIHRvIGFkZC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmljYXRpb24gd2FzIGFkZGVkOyBmYWxzZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGRQdXNoUmVmU3BlYyhmaW5hbCBSZWZTcGVjIHMpIHsKKwlwdWJsaWMgYm9vbGVhbiBhZGRQdXNoUmVmU3BlYyhSZWZTcGVjIHMpIHsKIAkJaWYgKHB1c2guY29udGFpbnMocykpCiAJCQlyZXR1cm4gZmFsc2U7CiAJCXJldHVybiBwdXNoLmFkZChzKTsKQEAgLTQ3MSw3ICs0NzEsNyBAQCBwdWJsaWMgYm9vbGVhbiBhZGRQdXNoUmVmU3BlYyhmaW5hbCBSZWZTcGVjIHMpIHsKIAkgKiAgICAgICAgICAgIHRoZSBzcGVjaWZpY2F0aW9uIHRvIHJlbW92ZS4KIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmljYXRpb24gZXhpc3RlZCBhbmQgd2FzIHJlbW92ZWQuCiAJICovCi0JcHVibGljIGJvb2xlYW4gcmVtb3ZlUHVzaFJlZlNwZWMoZmluYWwgUmVmU3BlYyBzKSB7CisJcHVibGljIGJvb2xlYW4gcmVtb3ZlUHVzaFJlZlNwZWMoUmVmU3BlYyBzKSB7CiAJCXJldHVybiBwdXNoLnJlbW92ZShzKTsKIAl9CiAKQEAgLTUyMCw3ICs1MjAsNyBAQCBwdWJsaWMgVGFnT3B0IGdldFRhZ09wdCgpIHsKIAkgKiBAcGFyYW0gb3B0aW9uCiAJICogICAgICAgICAgICBtZXRob2QgdG8gdXNlIHdoZW4gaGFuZGxpbmcgYW5ub3RhdGVkIHRhZ3MuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGFnT3B0KGZpbmFsIFRhZ09wdCBvcHRpb24pIHsKKwlwdWJsaWMgdm9pZCBzZXRUYWdPcHQoVGFnT3B0IG9wdGlvbikgewogCQl0YWdvcHQgPSBvcHRpb24gIT0gbnVsbCA/IG9wdGlvbiA6IFRhZ09wdC5BVVRPX0ZPTExPVzsKIAl9CiAKQEAgLTU0MSw3ICs1NDEsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc01pcnJvcigpIHsKIAkgKiBAcGFyYW0gbQogCSAqICAgICAgICAgICAgdHJ1ZSB0byBhdXRvbWF0aWNhbGx5IGRlbGV0ZSByZW1vdGUgcmVmcyBkdXJpbmcgcHVzaC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaXJyb3IoZmluYWwgYm9vbGVhbiBtKSB7CisJcHVibGljIHZvaWQgc2V0TWlycm9yKGJvb2xlYW4gbSkgewogCQltaXJyb3IgPSBtOwogCX0KIApAQCAtNTYyLDcgKzU2Miw3IEBAIHB1YmxpYyBpbnQgZ2V0VGltZW91dCgpIHsKIAkgKiAgICAgICAgICAgIGJlZm9yZSBhYm9ydGluZyBhbiBJTyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbiB3aXRoIHRoaXMKIAkgKiAgICAgICAgICAgIHJlbW90ZS4gIEEgdGltZW91dCBvZiAwIHdpbGwgYmxvY2sgaW5kZWZpbml0ZWx5LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoZmluYWwgaW50IHNlY29uZHMpIHsKKwlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGludCBzZWNvbmRzKSB7CiAJCXRpbWVvdXQgPSBzZWNvbmRzOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1JlbW90ZVJlZlVwZGF0ZS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlUmVmVXBkYXRlLmphdmEKaW5kZXggM2U5YjE2ZS4uOTMxNjUzZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlUmVmVXBkYXRlLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvUmVtb3RlUmVmVXBkYXRlLmphdmEKQEAgLTQ4MSw3ICs0ODEsNyBAQCB2b2lkIHNldEV4cGVjdGVkT2xkT2JqZWN0SWQoT2JqZWN0SWQgaWQpIHsKIAkJZXhwZWN0ZWRPbGRPYmplY3RJZCA9IGlkOwogCX0KIAotCXZvaWQgc2V0U3RhdHVzKGZpbmFsIFN0YXR1cyBzdGF0dXMpIHsKKwl2b2lkIHNldFN0YXR1cyhTdGF0dXMgc3RhdHVzKSB7CiAJCXRoaXMuc3RhdHVzID0gc3RhdHVzOwogCX0KIApAQCAtNDg5LDcgKzQ4OSw3IEBAIHZvaWQgc2V0RmFzdEZvcndhcmQoYm9vbGVhbiBmYXN0Rm9yd2FyZCkgewogCQl0aGlzLmZhc3RGb3J3YXJkID0gZmFzdEZvcndhcmQ7CiAJfQogCi0Jdm9pZCBzZXRNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisJdm9pZCBzZXRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7CiAJCXRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CiAJfQogCkBAIC01MDEsNyArNTAxLDcgQEAgdm9pZCBzZXRNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgd2hlbiBJL08gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIHVwZGF0ZQogCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVRyYWNraW5nUmVmKGZpbmFsIFJldldhbGsgd2FsaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVUcmFja2luZ1JlZihSZXZXYWxrIHdhbGspIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChpc0RlbGV0ZSgpKQogCQkJdHJhY2tpbmdSZWZVcGRhdGUuc2V0UmVzdWx0KGxvY2FsVXBkYXRlLmRlbGV0ZSh3YWxrKSk7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kSW5wdXRTdHJlYW0uamF2YQppbmRleCAxNTMzOGEzLi4zMTAwY2I0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZElucHV0U3RyZWFtLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRJbnB1dFN0cmVhbS5qYXZhCkBAIC0xMzMsNyArMTMzLDcgQEAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCByZWFkKGZpbmFsIGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaW50IHIgPSAwOwogCQl3aGlsZSAobGVuID4gMCkgewogCQkJbmVlZERhdGFQYWNrZXQoKTsKQEAgLTIwMyw3ICsyMDMsNyBAQCBlbHNlIGlmICgwIDw9IGNyKQogCQlwcm9ncmVzc0J1ZmZlciA9IHBrdDsKIAl9CiAKLQlwcml2YXRlIHZvaWQgZG9Qcm9ncmVzc0xpbmUoZmluYWwgU3RyaW5nIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgZG9Qcm9ncmVzc0xpbmUoU3RyaW5nIG1zZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJTWF0Y2hlciBtYXRjaGVyOwogCiAJCW1hdGNoZXIgPSBQX0JPVU5ERUQubWF0Y2hlcihtc2cpOwpAQCAtMjM5LDcgKzIzOSw3IEBAIHByaXZhdGUgdm9pZCBkb1Byb2dyZXNzTGluZShmaW5hbCBTdHJpbmcgbXNnKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJb3V0LndyaXRlKG1zZy5nZXRCeXRlcygpKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgYmVnaW5UYXNrKGZpbmFsIGludCB0b3RhbFdvcmtVbml0cykgeworCXByaXZhdGUgdm9pZCBiZWdpblRhc2soaW50IHRvdGFsV29ya1VuaXRzKSB7CiAJCW1vbml0b3IuYmVnaW5UYXNrKHJlbW90ZShjdXJyZW50VGFzayksIHRvdGFsV29ya1VuaXRzKTsKIAl9CiAKQEAgLTI1NCw3ICsyNTQsNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcmVtb3RlKFN0cmluZyBtc2cpIHsKIAkJcmV0dXJuIHIudG9TdHJpbmcoKTsKIAl9CiAKLQlwcml2YXRlIFN0cmluZyByZWFkU3RyaW5nKGZpbmFsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBTdHJpbmcgcmVhZFN0cmluZyhpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBieXRlW10gcmF3ID0gbmV3IGJ5dGVbbGVuXTsKIAkJSU8ucmVhZEZ1bGx5KHJhd0luLCByYXcsIDAsIGxlbik7CiAJCXJldHVybiBSYXdQYXJzZVV0aWxzLmRlY29kZShDb25zdGFudHMuQ0hBUlNFVCwgcmF3LCAwLCBsZW4pOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggYWY2NTgyNy4uYjJjYzFiNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRPdXRwdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZE91dHB1dFN0cmVhbS5qYXZhCkBAIC0xMDIsNyArMTAyLDcgQEAgcHVibGljIGNsYXNzIFNpZGVCYW5kT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKIAkgKiAgICAgICAgICAgIHN0cmVhbSB0aGF0IHRoZSBwYWNrZXRzIGFyZSB3cml0dGVuIG9udG8uIFRoaXMgc3RyZWFtIHNob3VsZAogCSAqICAgICAgICAgICAgYmUgYXR0YWNoZWQgdG8gYSBTaWRlQmFuZElucHV0U3RyZWFtIG9uIHRoZSByZW1vdGUgc2lkZS4KIAkgKi8KLQlwdWJsaWMgU2lkZUJhbmRPdXRwdXRTdHJlYW0oZmluYWwgaW50IGNoYW4sIGZpbmFsIGludCBzeiwgZmluYWwgT3V0cHV0U3RyZWFtIG9zKSB7CisJcHVibGljIFNpZGVCYW5kT3V0cHV0U3RyZWFtKGludCBjaGFuLCBpbnQgc3osIE91dHB1dFN0cmVhbSBvcykgewogCQlpZiAoY2hhbiA8PSAwIHx8IGNoYW4gPiAyNTUpCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KAogCQkJCQlKR2l0VGV4dC5nZXQoKS5jaGFubmVsTXVzdEJlSW5SYW5nZTFfMjU1LApAQCAtMTM2LDcgKzEzNiw3IEBAIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdoaWxlICgwIDwgbGVuKSB7CiAJCQlpbnQgY2FwYWNpdHkgPSBidWZmZXIubGVuZ3RoIC0gY250OwogCQkJaWYgKGNudCA9PSBIRFJfU0laRSAmJiBjYXBhY2l0eSA8IGxlbikgewpAQCAtMTYzLDcgKzE2Myw3IEBAIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGNudCA9PSBidWZmZXIubGVuZ3RoKQogCQkJd3JpdGVCdWZmZXIoKTsKIAkJYnVmZmVyW2NudCsrXSA9IChieXRlKSBiOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRQcm9ncmVzc01vbml0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NpZGVCYW5kUHJvZ3Jlc3NNb25pdG9yLmphdmEKaW5kZXggMzY1NTQ1YS4uOGEzZTRlZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU2lkZUJhbmRQcm9ncmVzc01vbml0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9TaWRlQmFuZFByb2dyZXNzTW9uaXRvci5qYXZhCkBAIC01NSw3ICs1NSw3IEBAIGNsYXNzIFNpZGVCYW5kUHJvZ3Jlc3NNb25pdG9yIGV4dGVuZHMgQmF0Y2hpbmdQcm9ncmVzc01vbml0b3IgewogCiAJcHJpdmF0ZSBib29sZWFuIHdyaXRlOwogCi0JU2lkZUJhbmRQcm9ncmVzc01vbml0b3IoZmluYWwgT3V0cHV0U3RyZWFtIG9zKSB7CisJU2lkZUJhbmRQcm9ncmVzc01vbml0b3IoT3V0cHV0U3RyZWFtIG9zKSB7CiAJCW91dCA9IG9zOwogCQl3cml0ZSA9IHRydWU7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoU2Vzc2lvbkZhY3RvcnkuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1NzaFNlc3Npb25GYWN0b3J5LmphdmEKaW5kZXggZTAwMjIzMy4uYWUzNTdkZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvU3NoU2Vzc2lvbkZhY3RvcnkuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9Tc2hTZXNzaW9uRmFjdG9yeS5qYXZhCkBAIC04MCw3ICs4MCw3IEBAIHB1YmxpYyBzdGF0aWMgU3NoU2Vzc2lvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7CiAJICogICAgICAgICAgICBmYWN0b3J5IGZvciBmdXR1cmUgc2Vzc2lvbnMgdG8gYmUgY3JlYXRlZCB0aHJvdWdoLiBJZiBudWxsIHRoZQogCSAqICAgICAgICAgICAgZGVmYXVsdCBmYWN0b3J5IHdpbGwgYmUgcmVzdG9yZWQucwogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJbnN0YW5jZShmaW5hbCBTc2hTZXNzaW9uRmFjdG9yeSBuZXdGYWN0b3J5KSB7CisJcHVibGljIHN0YXRpYyB2b2lkIHNldEluc3RhbmNlKFNzaFNlc3Npb25GYWN0b3J5IG5ld0ZhY3RvcnkpIHsKIAkJaWYgKG5ld0ZhY3RvcnkgIT0gbnVsbCkKIAkJCUlOU1RBTkNFID0gbmV3RmFjdG9yeTsKIAkJZWxzZQpAQCAtMTIxLDcgKzEyMSw3IEBAIHB1YmxpYyBhYnN0cmFjdCBSZW1vdGVTZXNzaW9uIGdldFNlc3Npb24oVVJJaXNoIHVyaSwKIAkgKiAgICAgICAgICAgIHtAbGluayAjZ2V0U2Vzc2lvbihVUklpc2gsIENyZWRlbnRpYWxzUHJvdmlkZXIsIEZTLCBpbnQpfQogCSAqICAgICAgICAgICAgbWV0aG9kLgogCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VTZXNzaW9uKGZpbmFsIFJlbW90ZVNlc3Npb24gc2Vzc2lvbikgeworCXB1YmxpYyB2b2lkIHJlbGVhc2VTZXNzaW9uKFJlbW90ZVNlc3Npb24gc2Vzc2lvbikgewogCQlzZXNzaW9uLmRpc2Nvbm5lY3QoKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UYWdPcHQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RhZ09wdC5qYXZhCmluZGV4IGUxMTM0ZTguLmNkMTc5MTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RhZ09wdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RhZ09wdC5qYXZhCkBAIC04NCw3ICs4NCw3IEBAIHB1YmxpYyBlbnVtIFRhZ09wdCB7CiAKIAlwcml2YXRlIGZpbmFsIFN0cmluZyBvcHRpb247CiAKLQlwcml2YXRlIFRhZ09wdChmaW5hbCBTdHJpbmcgbykgeworCXByaXZhdGUgVGFnT3B0KFN0cmluZyBvKSB7CiAJCW9wdGlvbiA9IG87CiAJfQogCkBAIC0xMDQsMTAgKzEwNCwxMCBAQCBwdWJsaWMgU3RyaW5nIG9wdGlvbigpIHsKIAkgKiAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdGV4dCB2YWx1ZS4KIAkgKiBAcmV0dXJuIHRoZSBvcHRpb24gdGhhdCBtYXRjaGVzIHRoZSBwYXNzZWQgcGFyYW1ldGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVGFnT3B0IGZyb21PcHRpb24oZmluYWwgU3RyaW5nIG8pIHsKKwlwdWJsaWMgc3RhdGljIFRhZ09wdCBmcm9tT3B0aW9uKFN0cmluZyBvKSB7CiAJCWlmIChvID09IG51bGwgfHwgby5sZW5ndGgoKSA9PSAwKQogCQkJcmV0dXJuIEFVVE9fRk9MTE9XOwotCQlmb3IgKGZpbmFsIFRhZ09wdCB0YWdvcHQgOiB2YWx1ZXMoKSkgeworCQlmb3IgKFRhZ09wdCB0YWdvcHQgOiB2YWx1ZXMoKSkgewogCQkJaWYgKHRhZ29wdC5vcHRpb24oKS5lcXVhbHMobykpCiAJCQkJcmV0dXJuIHRhZ29wdDsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNmZXJDb25maWcuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zZmVyQ29uZmlnLmphdmEKaW5kZXggNGM3MDcyNS4uNGFlMWNjYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNmZXJDb25maWcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc2ZlckNvbmZpZy5qYXZhCkBAIC02Miw4ICs2Miw4IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLlN5c3RlbVJlYWRlcjsKIAogLyoqCi0gKiBUaGUgc3RhbmRhcmQgInRyYW5zZmVyIiwgImZldGNoIiwgInJlY2VpdmUiLCBhbmQgInVwbG9hZHBhY2siIGNvbmZpZ3VyYXRpb24KLSAqIHBhcmFtZXRlcnMuCisgKiBUaGUgc3RhbmRhcmQgInRyYW5zZmVyIiwgImZldGNoIiwgInByb3RvY29sIiwgInJlY2VpdmUiLCBhbmQgInVwbG9hZHBhY2siCisgKiBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCiAgKi8KIHB1YmxpYyBjbGFzcyBUcmFuc2ZlckNvbmZpZyB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZTQ0sgPSAiZnNjayI7IC8vJE5PTi1OTFMtMSQKQEAgLTkyLDYgKzkyLDMzIEBAIHB1YmxpYyBlbnVtIEZzY2tNb2RlIHsKIAkJSUdOT1JFOwogCX0KIAorCS8qKgorCSAqIEEgZ2l0IGNvbmZpZ3VyYXRpb24gdmFyaWFibGUgZm9yIHdoaWNoIHZlcnNpb25zIG9mIHRoZSBHaXQgcHJvdG9jb2wgdG8gcHJlZmVyLgorCSAqIFVzZWQgaW4gcHJvdG9jb2wudmVyc2lvbi4KKwkgKi8KKwllbnVtIFByb3RvY29sVmVyc2lvbiB7CisJCVYwKCIwIiksIC8vJE5PTi1OTFMtMSQKKwkJVjIoIjIiKTsgLy8kTk9OLU5MUy0xJAorCisJCWZpbmFsIFN0cmluZyBuYW1lOworCisJCVByb3RvY29sVmVyc2lvbihTdHJpbmcgbmFtZSkgeworCQkJdGhpcy5uYW1lID0gbmFtZTsKKwkJfQorCisJCXN0YXRpYyBATnVsbGFibGUgUHJvdG9jb2xWZXJzaW9uIHBhcnNlKEBOdWxsYWJsZSBTdHJpbmcgbmFtZSkgeworCQkJaWYgKG5hbWUgPT0gbnVsbCkgeworCQkJCXJldHVybiBudWxsOworCQkJfQorCQkJZm9yIChQcm90b2NvbFZlcnNpb24gdiA6IFByb3RvY29sVmVyc2lvbi52YWx1ZXMoKSkgeworCQkJCWlmICh2Lm5hbWUuZXF1YWxzKG5hbWUpKSB7CisJCQkJCXJldHVybiB2OworCQkJCX0KKwkJCX0KKwkJCXJldHVybiBudWxsOworCQl9CisJfQorCiAJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZldGNoRnNjazsKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVjZWl2ZUZzY2s7CiAJcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnNja1NraXBMaXN0OwpAQCAtMTAxLDMyICsxMjgsMzYgQEAgcHVibGljIGVudW0gRnNja01vZGUgewogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBzYWZlRm9yTWFjT1M7CiAJcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFsbG93VGlwU2hhMUluV2FudDsKIAlwcml2YXRlIGZpbmFsIGJvb2xlYW4gYWxsb3dSZWFjaGFibGVTaGExSW5XYW50OworCXByaXZhdGUgZmluYWwgYm9vbGVhbiBhbGxvd0ZpbHRlcjsKKwlmaW5hbCBATnVsbGFibGUgUHJvdG9jb2xWZXJzaW9uIHByb3RvY29sVmVyc2lvbjsKIAlmaW5hbCBTdHJpbmdbXSBoaWRlUmVmczsKIAotCVRyYW5zZmVyQ29uZmlnKGZpbmFsIFJlcG9zaXRvcnkgZGIpIHsKKwlUcmFuc2ZlckNvbmZpZyhSZXBvc2l0b3J5IGRiKSB7CiAJCXRoaXMoZGIuZ2V0Q29uZmlnKCkpOwogCX0KIAotCVRyYW5zZmVyQ29uZmlnKGZpbmFsIENvbmZpZyByYykgewotCQlib29sZWFuIGZzY2sgPSByYy5nZXRCb29sZWFuKCJ0cmFuc2ZlciIsICJmc2Nrb2JqZWN0cyIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZldGNoRnNjayA9IHJjLmdldEJvb2xlYW4oImZldGNoIiwgImZzY2tvYmplY3RzIiwgZnNjayk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlyZWNlaXZlRnNjayA9IHJjLmdldEJvb2xlYW4oInJlY2VpdmUiLCAiZnNja29iamVjdHMiLCBmc2NrKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZzY2tTa2lwTGlzdCA9IHJjLmdldFN0cmluZyhGU0NLLCBudWxsLCAic2tpcExpc3QiKTsgLy8kTk9OLU5MUy0xJAotCQlhbGxvd0ludmFsaWRQZXJzb25JZGVudCA9IHJjLmdldEJvb2xlYW4oRlNDSywgImFsbG93SW52YWxpZFBlcnNvbklkZW50IiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCXNhZmVGb3JXaW5kb3dzID0gcmMuZ2V0Qm9vbGVhbihGU0NLLCAic2FmZUZvcldpbmRvd3MiLCAvLyROT04tTkxTLTEkCisJQFN1cHByZXNzV2FybmluZ3MoIm5scyIpCisJVHJhbnNmZXJDb25maWcoQ29uZmlnIHJjKSB7CisJCWJvb2xlYW4gZnNjayA9IHJjLmdldEJvb2xlYW4oInRyYW5zZmVyIiwgImZzY2tvYmplY3RzIiwgZmFsc2UpOworCQlmZXRjaEZzY2sgPSByYy5nZXRCb29sZWFuKCJmZXRjaCIsICJmc2Nrb2JqZWN0cyIsIGZzY2spOworCQlyZWNlaXZlRnNjayA9IHJjLmdldEJvb2xlYW4oInJlY2VpdmUiLCAiZnNja29iamVjdHMiLCBmc2NrKTsKKwkJZnNja1NraXBMaXN0ID0gcmMuZ2V0U3RyaW5nKEZTQ0ssIG51bGwsICJza2lwTGlzdCIpOworCQlhbGxvd0ludmFsaWRQZXJzb25JZGVudCA9IHJjLmdldEJvb2xlYW4oRlNDSywgImFsbG93SW52YWxpZFBlcnNvbklkZW50IiwKKwkJCQlmYWxzZSk7CisJCXNhZmVGb3JXaW5kb3dzID0gcmMuZ2V0Qm9vbGVhbihGU0NLLCAic2FmZUZvcldpbmRvd3MiLAogCQkJCQkJU3lzdGVtUmVhZGVyLmdldEluc3RhbmNlKCkuaXNXaW5kb3dzKCkpOwotCQlzYWZlRm9yTWFjT1MgPSByYy5nZXRCb29sZWFuKEZTQ0ssICJzYWZlRm9yTWFjT1MiLCAvLyROT04tTkxTLTEkCisJCXNhZmVGb3JNYWNPUyA9IHJjLmdldEJvb2xlYW4oRlNDSywgInNhZmVGb3JNYWNPUyIsCiAJCQkJCQlTeXN0ZW1SZWFkZXIuZ2V0SW5zdGFuY2UoKS5pc01hY09TKCkpOwogCiAJCWlnbm9yZSA9IEVudW1TZXQubm9uZU9mKE9iamVjdENoZWNrZXIuRXJyb3JUeXBlLmNsYXNzKTsKIAkJRW51bVNldDxPYmplY3RDaGVja2VyLkVycm9yVHlwZT4gc2V0ID0gRW51bVNldAogCQkJCS5ub25lT2YoT2JqZWN0Q2hlY2tlci5FcnJvclR5cGUuY2xhc3MpOwogCQlmb3IgKFN0cmluZyBrZXkgOiByYy5nZXROYW1lcyhGU0NLKSkgewotCQkJaWYgKGVxdWFsc0lnbm9yZUNhc2Uoa2V5LCAic2tpcExpc3QiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IGVxdWFsc0lnbm9yZUNhc2Uoa2V5LCAiYWxsb3dMZWFkaW5nWmVyb0ZpbGVNb2RlIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBlcXVhbHNJZ25vcmVDYXNlKGtleSwgImFsbG93SW52YWxpZFBlcnNvbklkZW50IikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBlcXVhbHNJZ25vcmVDYXNlKGtleSwgInNhZmVGb3JXaW5kb3dzIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBlcXVhbHNJZ25vcmVDYXNlKGtleSwgInNhZmVGb3JNYWNPUyIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCWlmIChlcXVhbHNJZ25vcmVDYXNlKGtleSwgInNraXBMaXN0IikKKwkJCQkJfHwgZXF1YWxzSWdub3JlQ2FzZShrZXksICJhbGxvd0xlYWRpbmdaZXJvRmlsZU1vZGUiKQorCQkJCQl8fCBlcXVhbHNJZ25vcmVDYXNlKGtleSwgImFsbG93SW52YWxpZFBlcnNvbklkZW50IikKKwkJCQkJfHwgZXF1YWxzSWdub3JlQ2FzZShrZXksICJzYWZlRm9yV2luZG93cyIpCisJCQkJCXx8IGVxdWFsc0lnbm9yZUNhc2Uoa2V5LCAic2FmZUZvck1hY09TIikpIHsKIAkJCQljb250aW51ZTsKIAkJCX0KIApAQCAtMTQ1LDE1ICsxNzYsMTggQEAgcHVibGljIGVudW0gRnNja01vZGUgewogCQkJfQogCQl9CiAJCWlmICghc2V0LmNvbnRhaW5zKE9iamVjdENoZWNrZXIuRXJyb3JUeXBlLlpFUk9fUEFEREVEX0ZJTEVNT0RFKQotCQkJCSYmIHJjLmdldEJvb2xlYW4oRlNDSywgImFsbG93TGVhZGluZ1plcm9GaWxlTW9kZSIsIGZhbHNlKSkgeyAvLyROT04tTkxTLTEkCisJCQkJJiYgcmMuZ2V0Qm9vbGVhbihGU0NLLCAiYWxsb3dMZWFkaW5nWmVyb0ZpbGVNb2RlIiwgZmFsc2UpKSB7CiAJCQlpZ25vcmUuYWRkKE9iamVjdENoZWNrZXIuRXJyb3JUeXBlLlpFUk9fUEFEREVEX0ZJTEVNT0RFKTsKIAkJfQogCiAJCWFsbG93VGlwU2hhMUluV2FudCA9IHJjLmdldEJvb2xlYW4oCi0JCQkJInVwbG9hZHBhY2siLCAiYWxsb3d0aXBzaGExaW53YW50IiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkidXBsb2FkcGFjayIsICJhbGxvd3RpcHNoYTFpbndhbnQiLCBmYWxzZSk7CiAJCWFsbG93UmVhY2hhYmxlU2hhMUluV2FudCA9IHJjLmdldEJvb2xlYW4oCi0JCQkJInVwbG9hZHBhY2siLCAiYWxsb3dyZWFjaGFibGVzaGExaW53YW50IiwgZmFsc2UpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaGlkZVJlZnMgPSByYy5nZXRTdHJpbmdMaXN0KCJ1cGxvYWRwYWNrIiwgbnVsbCwgImhpZGVyZWZzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCSJ1cGxvYWRwYWNrIiwgImFsbG93cmVhY2hhYmxlc2hhMWlud2FudCIsIGZhbHNlKTsKKwkJYWxsb3dGaWx0ZXIgPSByYy5nZXRCb29sZWFuKAorCQkJCSJ1cGxvYWRwYWNrIiwgImFsbG93ZmlsdGVyIiwgZmFsc2UpOworCQlwcm90b2NvbFZlcnNpb24gPSBQcm90b2NvbFZlcnNpb24ucGFyc2UocmMuZ2V0U3RyaW5nKCJwcm90b2NvbCIsIG51bGwsICJ2ZXJzaW9uIikpOworCQloaWRlUmVmcyA9IHJjLmdldFN0cmluZ0xpc3QoInVwbG9hZHBhY2siLCBudWxsLCAiaGlkZXJlZnMiKTsKIAl9CiAKIAkvKioKQEAgLTIyMCw2ICsyNTQsMTQgQEAgcHVibGljIGJvb2xlYW4gaXNBbGxvd1JlYWNoYWJsZVNoYTFJbldhbnQoKSB7CiAJfQogCiAJLyoqCisJICogQHJldHVybiB0cnVlIGlmIGNsaWVudHMgYXJlIGFsbG93ZWQgdG8gc3BlY2lmeSBhICJmaWx0ZXIiIGxpbmUKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIGJvb2xlYW4gaXNBbGxvd0ZpbHRlcigpIHsKKwkJcmV0dXJuIGFsbG93RmlsdGVyOworCX0KKworCS8qKgogCSAqIEdldCB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuUmVmRmlsdGVyfSByZXNwZWN0aW5nIGNvbmZpZ3VyZWQKIAkgKiBoaWRkZW4gcmVmcy4KIAkgKgpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnQuamF2YQppbmRleCA4ZGI3OTZhLi5kMzQyZWY0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnQuamF2YQpAQCAtNDYsMTEgKzQ2LDEwIEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOworaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHMuQ0hBUlNFVDsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKQEAgLTY0LDcgKzYzLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CkBAIC0xNDQsMTcgKzE0Myw4IEBAIHByaXZhdGUgc3RhdGljIEVudW1lcmF0aW9uPFVSTD4gY2F0YWxvZ3MoQ2xhc3NMb2FkZXIgbGRyKSB7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgdm9pZCBzY2FuKENsYXNzTG9hZGVyIGxkciwgVVJMIHVybCkgewotCQlCdWZmZXJlZFJlYWRlciBicjsKLQkJdHJ5IHsKLQkJCUlucHV0U3RyZWFtIHVybEluID0gdXJsLm9wZW5TdHJlYW0oKTsKLQkJCWJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcih1cmxJbiwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycikgewotCQkJLy8gSWYgd2UgY2Fubm90IHJlYWQgZnJvbSB0aGUgc2VydmljZSBsaXN0LCBnbyB0byB0aGUgbmV4dC4KLQkJCS8vCi0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgeworCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKAorCQkJCW5ldyBJbnB1dFN0cmVhbVJlYWRlcih1cmwub3BlblN0cmVhbSgpLCBDSEFSU0VUKSkpIHsKIAkJCVN0cmluZyBsaW5lOwogCQkJd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgewogCQkJCWxpbmUgPSBsaW5lLnRyaW0oKTsKQEAgLTE2NywxNSArMTU3LDggQEAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzY2FuKENsYXNzTG9hZGVyIGxkciwgVVJMIHVybCkgewogCQkJCQlsaW5lID0gbGluZS5zdWJzdHJpbmcoMCwgY29tbWVudCkudHJpbSgpOwogCQkJCWxvYWQobGRyLCBsaW5lKTsKIAkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7Ci0JCQkvLyBJZiB3ZSBmYWlsZWQgZHVyaW5nIGEgcmVhZCwgaWdub3JlIHRoZSBlcnJvci4KLQkJCS8vCi0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWJyLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gSWdub3JlIHRoZSBjbG9zZSBlcnJvcjsgd2UgYXJlIG9ubHkgcmVhZGluZy4KLQkJCX0KKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlIGVycm9ycwogCQl9CiAJfQogCkBAIC0yODgsNyArMjcxLDcgQEAgcHVibGljIHN0YXRpYyBMaXN0PFRyYW5zcG9ydFByb3RvY29sPiBnZXRUcmFuc3BvcnRQcm90b2NvbHMoKSB7CiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5UcmFuc3BvcnRFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgdHJhbnNwb3J0IGNhbm5vdCBvcGVuIHRoaXMgVVJJLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0IG9wZW4oZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgU3RyaW5nIHJlbW90ZSkKKwlwdWJsaWMgc3RhdGljIFRyYW5zcG9ydCBvcGVuKFJlcG9zaXRvcnkgbG9jYWwsIFN0cmluZyByZW1vdGUpCiAJCQl0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24sCiAJCQlUcmFuc3BvcnRFeGNlcHRpb24gewogCQlyZXR1cm4gb3Blbihsb2NhbCwgcmVtb3RlLCBPcGVyYXRpb24uRkVUQ0gpOwpAQCAtNDEwLDcgKzM5Myw3IEBAIHB1YmxpYyBzdGF0aWMgTGlzdDxUcmFuc3BvcnQ+IG9wZW5BbGwoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwKIAkgKiAgICAgICAgICAgICBpZiBwcm92aWRlZCByZW1vdGUgY29uZmlndXJhdGlvbiBkb2Vzbid0IGhhdmUgYW55IFVSSQogCSAqICAgICAgICAgICAgIGFzc29jaWF0ZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmFuc3BvcnQgb3BlbihmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBSZW1vdGVDb25maWcgY2ZnKQorCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0IG9wZW4oUmVwb3NpdG9yeSBsb2NhbCwgUmVtb3RlQ29uZmlnIGNmZykKIAkJCXRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXJldHVybiBvcGVuKGxvY2FsLCBjZmcsIE9wZXJhdGlvbi5GRVRDSCk7CiAJfQpAQCAtNDk1LDcgKzQ3OCw3IEBAIHB1YmxpYyBzdGF0aWMgTGlzdDxUcmFuc3BvcnQ+IG9wZW5BbGwoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwKIAkJCXRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCWZpbmFsIExpc3Q8VVJJaXNoPiB1cmlzID0gZ2V0VVJJcyhjZmcsIG9wKTsKIAkJZmluYWwgTGlzdDxUcmFuc3BvcnQ+IHRyYW5zcG9ydHMgPSBuZXcgQXJyYXlMaXN0PD4odXJpcy5zaXplKCkpOwotCQlmb3IgKGZpbmFsIFVSSWlzaCB1cmkgOiB1cmlzKSB7CisJCWZvciAoVVJJaXNoIHVyaSA6IHVyaXMpIHsKIAkJCWZpbmFsIFRyYW5zcG9ydCB0biA9IG9wZW4obG9jYWwsIHVyaSwgY2ZnLmdldE5hbWUoKSk7CiAJCQl0bi5hcHBseUNvbmZpZyhjZmcpOwogCQkJdHJhbnNwb3J0cy5hZGQodG4pOwpAQCAtNTE5LDcgKzUwMiw3IEBAIHByaXZhdGUgc3RhdGljIExpc3Q8VVJJaXNoPiBnZXRVUklzKGZpbmFsIFJlbW90ZUNvbmZpZyBjZmcsCiAJCX0KIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGRvZXNOb3RFeGlzdChmaW5hbCBSZW1vdGVDb25maWcgY2ZnKSB7CisJcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkb2VzTm90RXhpc3QoUmVtb3RlQ29uZmlnIGNmZykgewogCQlyZXR1cm4gY2ZnLmdldFVSSXMoKS5pc0VtcHR5KCkgJiYgY2ZnLmdldFB1c2hVUklzKCkuaXNFbXB0eSgpOwogCX0KIApAQCAtNTM2LDcgKzUxOSw3IEBAIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZG9lc05vdEV4aXN0KGZpbmFsIFJlbW90ZUNvbmZpZyBjZmcpIHsKIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLlRyYW5zcG9ydEV4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSB0cmFuc3BvcnQgY2Fubm90IG9wZW4gdGhpcyBVUkkuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmFuc3BvcnQgb3BlbihmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBVUklpc2ggdXJpKQorCXB1YmxpYyBzdGF0aWMgVHJhbnNwb3J0IG9wZW4oUmVwb3NpdG9yeSBsb2NhbCwgVVJJaXNoIHVyaSkKIAkJCXRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24sIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXJldHVybiBvcGVuKGxvY2FsLCB1cmksIG51bGwpOwogCX0KQEAgLTYzOCw3ICs2MjEsNyBAQCBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248UmVtb3RlUmVmVXBkYXRlPiBmaW5kUmVtb3RlUmVmVXBkYXRlc0ZvcigKIAkJZmluYWwgTGlzdDxSZW1vdGVSZWZVcGRhdGU+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKIAkJZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiBwcm9jUmVmcyA9IGV4cGFuZFB1c2hXaWxkY2FyZHNGb3IoZGIsIHNwZWNzKTsKIAotCQlmb3IgKGZpbmFsIFJlZlNwZWMgc3BlYyA6IHByb2NSZWZzKSB7CisJCWZvciAoUmVmU3BlYyBzcGVjIDogcHJvY1JlZnMpIHsKIAkJCVN0cmluZyBzcmNTcGVjID0gc3BlYy5nZXRTb3VyY2UoKTsKIAkJCWZpbmFsIFJlZiBzcmNSZWYgPSBkYi5maW5kUmVmKHNyY1NwZWMpOwogCQkJaWYgKHNyY1JlZiAhPSBudWxsKQpAQCAtNzA1LDEyICs2ODgsMTIgQEAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPFJlbW90ZVJlZlVwZGF0ZT4gZmluZFJlbW90ZVJlZlVwZGF0ZXNGb3IoCiAJcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxSZWZTcGVjPiBleHBhbmRQdXNoV2lsZGNhcmRzRm9yKAogCQkJZmluYWwgUmVwb3NpdG9yeSBkYiwgZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiBzcGVjcykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gbG9jYWxSZWZzID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7Ci0JCWZpbmFsIENvbGxlY3Rpb248UmVmU3BlYz4gcHJvY1JlZnMgPSBuZXcgSGFzaFNldDw+KCk7CisJCWZpbmFsIExpc3Q8UmVmPiBsb2NhbFJlZnMgPSBkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKTsKKwkJZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiBwcm9jUmVmcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKIAotCQlmb3IgKGZpbmFsIFJlZlNwZWMgc3BlYyA6IHNwZWNzKSB7CisJCWZvciAoUmVmU3BlYyBzcGVjIDogc3BlY3MpIHsKIAkJCWlmIChzcGVjLmlzV2lsZGNhcmQoKSkgewotCQkJCWZvciAoZmluYWwgUmVmIGxvY2FsUmVmIDogbG9jYWxSZWZzLnZhbHVlcygpKSB7CisJCQkJZm9yIChSZWYgbG9jYWxSZWYgOiBsb2NhbFJlZnMpIHsKIAkJCQkJaWYgKHNwZWMubWF0Y2hTb3VyY2UobG9jYWxSZWYpKQogCQkJCQkJcHJvY1JlZnMuYWRkKHNwZWMuZXhwYW5kRnJvbVNvdXJjZShsb2NhbFJlZikpOwogCQkJCX0KQEAgLTcyNCw3ICs3MDcsNyBAQCBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFJlZlNwZWM+IGV4cGFuZFB1c2hXaWxkY2FyZHNGb3IoCiAJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbmRUcmFja2luZ1JlZk5hbWUoZmluYWwgU3RyaW5nIHJlbW90ZU5hbWUsCiAJCQlmaW5hbCBDb2xsZWN0aW9uPFJlZlNwZWM+IGZldGNoU3BlY3MpIHsKIAkJLy8gdHJ5IHRvIGZpbmQgbWF0Y2hpbmcgdHJhY2tpbmcgcmVmcwotCQlmb3IgKGZpbmFsIFJlZlNwZWMgZmV0Y2hTcGVjIDogZmV0Y2hTcGVjcykgeworCQlmb3IgKFJlZlNwZWMgZmV0Y2hTcGVjIDogZmV0Y2hTcGVjcykgewogCQkJaWYgKGZldGNoU3BlYy5tYXRjaFNvdXJjZShyZW1vdGVOYW1lKSkgewogCQkJCWlmIChmZXRjaFNwZWMuaXNXaWxkY2FyZCgpKQogCQkJCQlyZXR1cm4gZmV0Y2hTcGVjLmV4cGFuZEZyb21Tb3VyY2UocmVtb3RlTmFtZSkKQEAgLTgwNyw2ICs3OTAsOCBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZmluZFRyYWNraW5nUmVmTmFtZShmaW5hbCBTdHJpbmcgcmVtb3RlTmFtZSwKIAkvKiogU2hvdWxkIHJlZnMgbm8gbG9uZ2VyIG9uIHRoZSBzb3VyY2UgYmUgcHJ1bmVkIGZyb20gdGhlIGRlc3RpbmF0aW9uPyAqLwogCXByaXZhdGUgYm9vbGVhbiByZW1vdmVEZWxldGVkUmVmczsKIAorCXByaXZhdGUgbG9uZyBmaWx0ZXJCbG9iTGltaXQgPSAtMTsKKwogCS8qKiBUaW1lb3V0IGluIHNlY29uZHMgdG8gd2FpdCBiZWZvcmUgYWJvcnRpbmcgYW4gSU8gcmVhZCBvciB3cml0ZS4gKi8KIAlwcml2YXRlIGludCB0aW1lb3V0OwogCkBAIC04MzMsNyArODE4LDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZpbmRUcmFja2luZ1JlZk5hbWUoZmluYWwgU3RyaW5nIHJlbW90ZU5hbWUsCiAJICogICAgICAgICAgICB0aGUgVVJJIHVzZWQgdG8gYWNjZXNzIHRoZSByZW1vdGUgcmVwb3NpdG9yeS4gVGhpcyBtdXN0IGJlIHRoZQogCSAqICAgICAgICAgICAgVVJJIHBhc3NlZCB0byB7QGxpbmsgI29wZW4oUmVwb3NpdG9yeSwgVVJJaXNoKX0uCiAJICovCi0JcHJvdGVjdGVkIFRyYW5zcG9ydChmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBVUklpc2ggdXJpKSB7CisJcHJvdGVjdGVkIFRyYW5zcG9ydChSZXBvc2l0b3J5IGxvY2FsLCBVUklpc2ggdXJpKSB7CiAJCWZpbmFsIFRyYW5zZmVyQ29uZmlnIHRjID0gbG9jYWwuZ2V0Q29uZmlnKCkuZ2V0KFRyYW5zZmVyQ29uZmlnLktFWSk7CiAJCXRoaXMubG9jYWwgPSBsb2NhbDsKIAkJdGhpcy51cmkgPSB1cmk7CkBAIC04NDgsNyArODMzLDcgQEAgcHJvdGVjdGVkIFRyYW5zcG9ydChmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBVUklpc2ggdXJpKSB7CiAJICogQHBhcmFtIHVyaQogCSAqICAgICAgICAgICAgYSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVVJJaXNofSBvYmplY3QuCiAJICovCi0JcHJvdGVjdGVkIFRyYW5zcG9ydChmaW5hbCBVUklpc2ggdXJpKSB7CisJcHJvdGVjdGVkIFRyYW5zcG9ydChVUklpc2ggdXJpKSB7CiAJCXRoaXMudXJpID0gdXJpOwogCQl0aGlzLmxvY2FsID0gbnVsbDsKIAkJdGhpcy5vYmplY3RDaGVja2VyID0gbmV3IE9iamVjdENoZWNrZXIoKTsKQEAgLTg4MSw3ICs4NjYsNyBAQCBwdWJsaWMgU3RyaW5nIGdldE9wdGlvblVwbG9hZFBhY2soKSB7CiAJICogQHBhcmFtIHdoZXJlCiAJICogICAgICAgICAgICBuYW1lIG9mIHRoZSBleGVjdXRhYmxlLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldE9wdGlvblVwbG9hZFBhY2soZmluYWwgU3RyaW5nIHdoZXJlKSB7CisJcHVibGljIHZvaWQgc2V0T3B0aW9uVXBsb2FkUGFjayhTdHJpbmcgd2hlcmUpIHsKIAkJaWYgKHdoZXJlICE9IG51bGwgJiYgd2hlcmUubGVuZ3RoKCkgPiAwKQogCQkJb3B0aW9uVXBsb2FkUGFjayA9IHdoZXJlOwogCQllbHNlCkBAIC05MDMsNyArODg4LDcgQEAgcHVibGljIFRhZ09wdCBnZXRUYWdPcHQoKSB7CiAJICogQHBhcmFtIG9wdGlvbgogCSAqICAgICAgICAgICAgbWV0aG9kIHRvIHVzZSB3aGVuIGhhbmRsaW5nIGFubm90YXRlZCB0YWdzLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhZ09wdChmaW5hbCBUYWdPcHQgb3B0aW9uKSB7CisJcHVibGljIHZvaWQgc2V0VGFnT3B0KFRhZ09wdCBvcHRpb24pIHsKIAkJdGFnb3B0ID0gb3B0aW9uICE9IG51bGwgPyBvcHRpb24gOiBUYWdPcHQuQVVUT19GT0xMT1c7CiAJfQogCkBAIC05MjcsNyArOTEyLDcgQEAgcHVibGljIGJvb2xlYW4gaXNGZXRjaFRoaW4oKSB7CiAJICogICAgICAgICAgICB3aGVuIGl0IHNob3VsZG4ndAogCSAqIEBzZWUgUGFja1RyYW5zcG9ydAogCSAqLwotCXB1YmxpYyB2b2lkIHNldEZldGNoVGhpbihmaW5hbCBib29sZWFuIGZldGNoVGhpbikgeworCXB1YmxpYyB2b2lkIHNldEZldGNoVGhpbihib29sZWFuIGZldGNoVGhpbikgewogCQl0aGlzLmZldGNoVGhpbiA9IGZldGNoVGhpbjsKIAl9CiAKQEAgLTk1MCw3ICs5MzUsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrRmV0Y2hlZE9iamVjdHMoKSB7CiAJICogICAgICAgICAgICByZWNlaXZlZCBvYmplY3RzIGFyZSB2YWxpZC4KIAkgKiBAc2VlICNzZXRPYmplY3RDaGVja2VyKE9iamVjdENoZWNrZXIpCiAJICovCi0JcHVibGljIHZvaWQgc2V0Q2hlY2tGZXRjaGVkT2JqZWN0cyhmaW5hbCBib29sZWFuIGNoZWNrKSB7CisJcHVibGljIHZvaWQgc2V0Q2hlY2tGZXRjaGVkT2JqZWN0cyhib29sZWFuIGNoZWNrKSB7CiAJCWlmIChjaGVjayAmJiBvYmplY3RDaGVja2VyID09IG51bGwpCiAJCQlzZXRPYmplY3RDaGVja2VyKG5ldyBPYmplY3RDaGVja2VyKCkpOwogCQllbHNlIGlmICghY2hlY2sgJiYgb2JqZWN0Q2hlY2tlciAhPSBudWxsKQpAQCAtMTAyNSw3ICsxMDEwLDcgQEAgcHVibGljIGJvb2xlYW4gaXNQdXNoVGhpbigpIHsKIAkgKiAgICAgICAgICAgIGZhbHNlIHdoZW4gaXQgc2hvdWxkbid0CiAJICogQHNlZSBQYWNrVHJhbnNwb3J0CiAJICovCi0JcHVibGljIHZvaWQgc2V0UHVzaFRoaW4oZmluYWwgYm9vbGVhbiBwdXNoVGhpbikgeworCXB1YmxpYyB2b2lkIHNldFB1c2hUaGluKGJvb2xlYW4gcHVzaFRoaW4pIHsKIAkJdGhpcy5wdXNoVGhpbiA9IHB1c2hUaGluOwogCX0KIApAQCAtMTA1MCw3ICsxMDM1LDcgQEAgcHVibGljIGJvb2xlYW4gaXNQdXNoQXRvbWljKCkgewogCSAqIEBzZWUgUGFja1RyYW5zcG9ydAogCSAqIEBzaW5jZSA0LjIKIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdXNoQXRvbWljKGZpbmFsIGJvb2xlYW4gYXRvbWljKSB7CisJcHVibGljIHZvaWQgc2V0UHVzaEF0b21pYyhib29sZWFuIGF0b21pYykgewogCQl0aGlzLnB1c2hBdG9taWMgPSBhdG9taWM7CiAJfQogCkBAIC0xMDc3LDE3ICsxMDYyLDM0IEBAIHB1YmxpYyBib29sZWFuIGlzUmVtb3ZlRGVsZXRlZFJlZnMoKSB7CiAJICoKIAkgKiBAcGFyYW0gcmVtb3ZlIHRydWUgdG8gcmVtb3ZlIHJlZnMgdGhhdCBubyBsb25nZXIgZXhpc3QuCiAJICovCi0JcHVibGljIHZvaWQgc2V0UmVtb3ZlRGVsZXRlZFJlZnMoZmluYWwgYm9vbGVhbiByZW1vdmUpIHsKKwlwdWJsaWMgdm9pZCBzZXRSZW1vdmVEZWxldGVkUmVmcyhib29sZWFuIHJlbW92ZSkgewogCQlyZW1vdmVEZWxldGVkUmVmcyA9IHJlbW92ZTsKIAl9CiAKIAkvKioKKwkgKiBAcmV0dXJuIHRoZSBsYXN0IHZhbHVlIHBhc3NlZCB0byB7QGxpbmsgI3NldEZpbHRlckJsb2JMaW1pdH0sIG9yIC0xIGlmCisJICogICAgICAgICBpdCB3YXMgbmV2ZXIgaW52b2tlZC4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIGxvbmcgZ2V0RmlsdGVyQmxvYkxpbWl0KCkgeworCQlyZXR1cm4gZmlsdGVyQmxvYkxpbWl0OworCX0KKworCS8qKgorCSAqIEBwYXJhbSBieXRlcyBleGNsdWRlIGJsb2JzIG9mIHNpemUgZ3JlYXRlciB0aGFuIHRoaXMKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHZvaWQgc2V0RmlsdGVyQmxvYkxpbWl0KGxvbmcgYnl0ZXMpIHsKKwkJZmlsdGVyQmxvYkxpbWl0ID0gYnl0ZXM7CisJfQorCisJLyoqCiAJICogQXBwbHkgcHJvdmlkZWQgcmVtb3RlIGNvbmZpZ3VyYXRpb24gb24gdGhpcyB0cmFuc3BvcnQuCiAJICoKIAkgKiBAcGFyYW0gY2ZnCiAJICogICAgICAgICAgICBjb25maWd1cmF0aW9uIHRvIGFwcGx5IG9uIHRoaXMgdHJhbnNwb3J0LgogCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5Q29uZmlnKGZpbmFsIFJlbW90ZUNvbmZpZyBjZmcpIHsKKwlwdWJsaWMgdm9pZCBhcHBseUNvbmZpZyhSZW1vdGVDb25maWcgY2ZnKSB7CiAJCXNldE9wdGlvblVwbG9hZFBhY2soY2ZnLmdldFVwbG9hZFBhY2soKSk7CiAJCXNldE9wdGlvblJlY2VpdmVQYWNrKGNmZy5nZXRSZWNlaXZlUGFjaygpKTsKIAkJc2V0VGFnT3B0KGNmZy5nZXRUYWdPcHQoKSk7CkBAIC0xMTE2LDcgKzExMTgsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0RyeVJ1bigpIHsKIAkgKiAgICAgICAgICAgIGFuZCBub3QgcmVhbGx5IHVwZGF0ZSByZW1vdGUgcmVmcywgZmFsc2Ugb3RoZXJ3aXNlIC0gd2hlbiBwdXNoCiAJICogICAgICAgICAgICBzaG91bGQgYWN0IG5vcm1hbGx5LgogCSAqLwotCXB1YmxpYyB2b2lkIHNldERyeVJ1bihmaW5hbCBib29sZWFuIGRyeVJ1bikgeworCXB1YmxpYyB2b2lkIHNldERyeVJ1bihib29sZWFuIGRyeVJ1bikgewogCQl0aGlzLmRyeVJ1biA9IGRyeVJ1bjsKIAl9CiAKQEAgLTExMzcsNyArMTEzOSw3IEBAIHB1YmxpYyBpbnQgZ2V0VGltZW91dCgpIHsKIAkgKiAgICAgICAgICAgIGJlZm9yZSBhYm9ydGluZyBhbiBJTyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbiB3aXRoIHRoaXMKIAkgKiAgICAgICAgICAgIHJlbW90ZS4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGZpbmFsIGludCBzZWNvbmRzKSB7CisJcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgc2Vjb25kcykgewogCQl0aW1lb3V0ID0gc2Vjb25kczsKIAl9CiAKQEAgLTEyMDQsNyArMTIwNiw3IEBAIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UHVzaE9wdGlvbnMoKSB7CiAJICogICAgICAgICAgICBudWxsIGlmIHB1c2ggb3B0aW9ucyBhcmUgdW5zdXBwb3J0ZWQKIAkgKiBAc2luY2UgNC41CiAJICovCi0JcHVibGljIHZvaWQgc2V0UHVzaE9wdGlvbnMoZmluYWwgTGlzdDxTdHJpbmc+IHB1c2hPcHRpb25zKSB7CisJcHVibGljIHZvaWQgc2V0UHVzaE9wdGlvbnMoTGlzdDxTdHJpbmc+IHB1c2hPcHRpb25zKSB7CiAJCXRoaXMucHVzaE9wdGlvbnMgPSBwdXNoT3B0aW9uczsKIAl9CiAKQEAgLTEyNTEsOSArMTI1Myw5IEBAIHB1YmxpYyBGZXRjaFJlc3VsdCBmZXRjaChmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJCS8vIG9iamVjdCB0cmFuc2ZlciBvdmVyaGVhZHMuCiAJCQkvLwogCQkJZmluYWwgQ29sbGVjdGlvbjxSZWZTcGVjPiB0bXAgPSBuZXcgQXJyYXlMaXN0PD4odG9GZXRjaCk7Ci0JCQlmb3IgKGZpbmFsIFJlZlNwZWMgcmVxdWVzdGVkIDogdG9GZXRjaCkgeworCQkJZm9yIChSZWZTcGVjIHJlcXVlc3RlZCA6IHRvRmV0Y2gpIHsKIAkJCQlmaW5hbCBTdHJpbmcgcmVxU3JjID0gcmVxdWVzdGVkLmdldFNvdXJjZSgpOwotCQkJCWZvciAoZmluYWwgUmVmU3BlYyBjb25maWd1cmVkIDogZmV0Y2gpIHsKKwkJCQlmb3IgKFJlZlNwZWMgY29uZmlndXJlZCA6IGZldGNoKSB7CiAJCQkJCWZpbmFsIFN0cmluZyBjZmdTcmMgPSBjb25maWd1cmVkLmdldFNvdXJjZSgpOwogCQkJCQlmaW5hbCBTdHJpbmcgY2ZnRHN0ID0gY29uZmlndXJlZC5nZXREZXN0aW5hdGlvbigpOwogCQkJCQlpZiAoY2ZnU3JjLmVxdWFscyhyZXFTcmMpICYmIGNmZ0RzdCAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRBbWF6b25TMy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0QW1hem9uUzMuamF2YQppbmRleCBjNjE5MWVjZWIuLjYxMThjYjggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEFtYXpvblMzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0QW1hem9uUzMuamF2YQpAQCAtMjY3LDcgKzI2Nyw3IEBAIENvbGxlY3Rpb248V2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlPiBnZXRBbHRlcm5hdGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2Ugb3BlbkFsdGVybmF0ZShmaW5hbCBTdHJpbmcgbG9jYXRpb24pCisJCVdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBvcGVuQWx0ZXJuYXRlKFN0cmluZyBsb2NhdGlvbikKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIG5ldyBEYXRhYmFzZVMzKGJ1Y2tldE5hbWUsIHJlc29sdmVLZXkobG9jYXRpb24pKTsKIAkJfQpAQCAtMjc4LDcgKzI3OCw3IEBAIENvbGxlY3Rpb248U3RyaW5nPiBnZXRQYWNrTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJaGF2ZS5hZGRBbGwoczMubGlzdChidWNrZXQsIHJlc29sdmVLZXkoInBhY2siKSkpOyAvLyROT04tTkxTLTEkCiAKIAkJCWZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBwYWNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IGhhdmUpIHsKKwkJCWZvciAoU3RyaW5nIG4gOiBoYXZlKSB7CiAJCQkJaWYgKCFuLnN0YXJ0c1dpdGgoInBhY2stIikgfHwgIW4uZW5kc1dpdGgoIi5wYWNrIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQljb250aW51ZTsKIApAQCAtMjkwLDcgKzI5MCw3IEBAIENvbGxlY3Rpb248U3RyaW5nPiBnZXRQYWNrTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCUZpbGVTdHJlYW0gb3BlbihmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJRmlsZVN0cmVhbSBvcGVuKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJZmluYWwgVVJMQ29ubmVjdGlvbiBjID0gczMuZ2V0KGJ1Y2tldCwgcmVzb2x2ZUtleShwYXRoKSk7CiAJCQlmaW5hbCBJbnB1dFN0cmVhbSByYXcgPSBjLmdldElucHV0U3RyZWFtKCk7CiAJCQlmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IHMzLmRlY3J5cHQoYyk7CkBAIC0yOTksNyArMjk5LDcgQEAgRmlsZVN0cmVhbSBvcGVuKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgZGVsZXRlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCBkZWxldGVGaWxlKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJczMuZGVsZXRlKGJ1Y2tldCwgcmVzb2x2ZUtleShwYXRoKSk7CiAJCX0KIApAQCAtMzExLDcgKzMxMSw3IEBAIE91dHB1dFN0cmVhbSB3cml0ZUZpbGUoZmluYWwgU3RyaW5nIHBhdGgsCiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCB3cml0ZUZpbGUoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl2b2lkIHdyaXRlRmlsZShTdHJpbmcgcGF0aCwgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlzMy5wdXQoYnVja2V0LCByZXNvbHZlS2V5KHBhdGgpLCBkYXRhKTsKIAkJfQogCkBAIC0zMjMsNyArMzIzLDcgQEAgTWFwPFN0cmluZywgUmVmPiByZWFkQWR2ZXJ0aXNlZFJlZnMoKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJCXJldHVybiBhdmFpbDsKIAkJfQogCi0JCXByaXZhdGUgdm9pZCByZWFkTG9vc2VSZWZzKGZpbmFsIFRyZWVNYXA8U3RyaW5nLCBSZWY+IGF2YWlsKQorCQlwcml2YXRlIHZvaWQgcmVhZExvb3NlUmVmcyhUcmVlTWFwPFN0cmluZywgUmVmPiBhdmFpbCkKIAkJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJCXRyeSB7CiAJCQkJZm9yIChmaW5hbCBTdHJpbmcgbiA6IHMzLmxpc3QoYnVja2V0LCByZXNvbHZlS2V5KFJPT1RfRElSCkBAIC0zMzQsMTYgKzMzNCwxMyBAQCBwcml2YXRlIHZvaWQgcmVhZExvb3NlUmVmcyhmaW5hbCBUcmVlTWFwPFN0cmluZywgUmVmPiBhdmFpbCkKIAkJCX0KIAkJfQogCi0JCXByaXZhdGUgUmVmIHJlYWRSZWYoZmluYWwgVHJlZU1hcDxTdHJpbmcsIFJlZj4gYXZhaWwsIGZpbmFsIFN0cmluZyBybikKKwkJcHJpdmF0ZSBSZWYgcmVhZFJlZihUcmVlTWFwPFN0cmluZywgUmVmPiBhdmFpbCwgU3RyaW5nIHJuKQogCQkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQkJZmluYWwgU3RyaW5nIHM7CiAJCQlTdHJpbmcgcmVmID0gUk9PVF9ESVIgKyBybjsKIAkJCXRyeSB7Ci0JCQkJZmluYWwgQnVmZmVyZWRSZWFkZXIgYnIgPSBvcGVuUmVhZGVyKHJlZik7Ci0JCQkJdHJ5IHsKKwkJCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gb3BlblJlYWRlcihyZWYpKSB7CiAJCQkJCXMgPSBici5yZWFkTGluZSgpOwotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWJyLmNsb3NlKCk7CiAJCQkJfQogCQkJfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIG5vUmVmKSB7CiAJCQkJcmV0dXJuIG51bGw7CkBAIC0zNzcsNyArMzc0LDcgQEAgcHJpdmF0ZSBSZWYgcmVhZFJlZihmaW5hbCBUcmVlTWFwPFN0cmluZywgUmVmPiBhdmFpbCwgZmluYWwgU3RyaW5nIHJuKQogCQkJdGhyb3cgbmV3IFRyYW5zcG9ydEV4Y2VwdGlvbihnZXRVUkkoKSwgTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudHJhbnNwb3J0RXhjZXB0aW9uQmFkUmVmLCBybiwgcykpOwogCQl9CiAKLQkJcHJpdmF0ZSBTdG9yYWdlIGxvb3NlKGZpbmFsIFJlZiByKSB7CisJCXByaXZhdGUgU3RvcmFnZSBsb29zZShSZWYgcikgewogCQkJaWYgKHIgIT0gbnVsbCAmJiByLmdldFN0b3JhZ2UoKSA9PSBTdG9yYWdlLlBBQ0tFRCkKIAkJCQlyZXR1cm4gU3RvcmFnZS5MT09TRV9QQUNLRUQ7CiAJCQlyZXR1cm4gU3RvcmFnZS5MT09TRTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEdpdEFub24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEdpdEFub24uamF2YQppbmRleCA4MTYxODdlLi4xMTMyNTAzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRBbm9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0R2l0QW5vbi5qYXZhCkBAIC0xMTMsMTEgKzExMywxMSBAQCBwdWJsaWMgVHJhbnNwb3J0IG9wZW4oVVJJaXNoIHVyaSkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aQogCQl9CiAJfTsKIAotCVRyYW5zcG9ydEdpdEFub24oZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgVVJJaXNoIHVyaSkgeworCVRyYW5zcG9ydEdpdEFub24oUmVwb3NpdG9yeSBsb2NhbCwgVVJJaXNoIHVyaSkgewogCQlzdXBlcihsb2NhbCwgdXJpKTsKIAl9CiAKLQlUcmFuc3BvcnRHaXRBbm9uKGZpbmFsIFVSSWlzaCB1cmkpIHsKKwlUcmFuc3BvcnRHaXRBbm9uKFVSSWlzaCB1cmkpIHsKIAkJc3VwZXIodXJpKTsKIAl9CiAKQEAgLTE0Miw2ICsxNDIsNyBAQCBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKIAlTb2NrZXQgb3BlbkNvbm5lY3Rpb24oKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IHRtcyA9IGdldFRpbWVvdXQoKSA+IDAgPyBnZXRUaW1lb3V0KCkgKiAxMDAwIDogMDsKIAkJZmluYWwgaW50IHBvcnQgPSB1cmkuZ2V0UG9ydCgpID4gMCA/IHVyaS5nZXRQb3J0KCkgOiBHSVRfUE9SVDsKKwkJQFN1cHByZXNzV2FybmluZ3MoInJlc291cmNlIikgLy8gQ2xvc2VkIGJ5IHRoZSBjYWxsZXIKIAkJZmluYWwgU29ja2V0IHMgPSBuZXcgU29ja2V0KCk7CiAJCXRyeSB7CiAJCQlmaW5hbCBJbmV0QWRkcmVzcyBob3N0ID0gSW5ldEFkZHJlc3MuZ2V0QnlOYW1lKHVyaS5nZXRIb3N0KCkpOwpAQCAtMTYyLDcgKzE2Myw3IEBAIFNvY2tldCBvcGVuQ29ubmVjdGlvbigpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlyZXR1cm4gczsKIAl9CiAKLQl2b2lkIHNlcnZpY2UoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFBhY2tldExpbmVPdXQgcGNrT3V0KQorCXZvaWQgc2VydmljZShTdHJpbmcgbmFtZSwgUGFja2V0TGluZU91dCBwY2tPdXQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIGNtZCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWNtZC5hcHBlbmQobmFtZSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRHaXRTc2guamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEdpdFNzaC5qYXZhCmluZGV4IGJjODVlNmYuLmQ1OWZlMzMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEdpdFNzaC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEdpdFNzaC5qYXZhCkBAIC0xNDEsMTIgKzE0MSwxMiBAQCBwdWJsaWMgVHJhbnNwb3J0IG9wZW4oVVJJaXNoIHVyaSkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiwgVHJhbnNwb3J0RXhjZXB0aQogCQl9CiAJfTsKIAotCVRyYW5zcG9ydEdpdFNzaChmaW5hbCBSZXBvc2l0b3J5IGxvY2FsLCBmaW5hbCBVUklpc2ggdXJpKSB7CisJVHJhbnNwb3J0R2l0U3NoKFJlcG9zaXRvcnkgbG9jYWwsIFVSSWlzaCB1cmkpIHsKIAkJc3VwZXIobG9jYWwsIHVyaSk7CiAJCWluaXRTc2hTZXNzaW9uRmFjdG9yeSgpOwogCX0KIAotCVRyYW5zcG9ydEdpdFNzaChmaW5hbCBVUklpc2ggdXJpKSB7CisJVHJhbnNwb3J0R2l0U3NoKFVSSWlzaCB1cmkpIHsKIAkJc3VwZXIodXJpKTsKIAkJaW5pdFNzaFNlc3Npb25GYWN0b3J5KCk7CiAJfQpAQCAtMTc2LDcgKzE3Niw3IEBAIHB1YmxpYyBQdXNoQ29ubmVjdGlvbiBvcGVuUHVzaCgpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlyZXR1cm4gbmV3IFNzaFB1c2hDb25uZWN0aW9uKCk7CiAJfQogCi0JU3RyaW5nIGNvbW1hbmRGb3IoZmluYWwgU3RyaW5nIGV4ZSkgeworCVN0cmluZyBjb21tYW5kRm9yKFN0cmluZyBleGUpIHsKIAkJU3RyaW5nIHBhdGggPSB1cmkuZ2V0UGF0aCgpOwogCQlpZiAodXJpLmdldFNjaGVtZSgpICE9IG51bGwgJiYgdXJpLmdldFBhdGgoKS5zdGFydHNXaXRoKCIvfiIpKSAvLyROT04tTkxTLTEkCiAJCQlwYXRoID0gKHVyaS5nZXRQYXRoKCkuc3Vic3RyaW5nKDEpKTsKQEAgLTMxMSw2ICszMTEsOSBAQCBjbGFzcyBTc2hGZXRjaENvbm5lY3Rpb24gZXh0ZW5kcyBCYXNlUGFja0ZldGNoQ29ubmVjdGlvbiB7CiAJCXB1YmxpYyB2b2lkIGNsb3NlKCkgewogCQkJZW5kT3V0KCk7CiAKKwkJCWlmIChwcm9jZXNzICE9IG51bGwpIHsKKwkJCQlwcm9jZXNzLmRlc3Ryb3koKTsKKwkJCX0KIAkJCWlmIChlcnJvclRocmVhZCAhPSBudWxsKSB7CiAJCQkJdHJ5IHsKIAkJCQkJZXJyb3JUaHJlYWQuaGFsdCgpOwpAQCAtMzIyLDggKzMyNSw2IEBAIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogCQkJfQogCiAJCQlzdXBlci5jbG9zZSgpOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkKLQkJCQlwcm9jZXNzLmRlc3Ryb3koKTsKIAkJfQogCX0KIApAQCAtMzc3LDYgKzM3OCw5IEBAIGNsYXNzIFNzaFB1c2hDb25uZWN0aW9uIGV4dGVuZHMgQmFzZVBhY2tQdXNoQ29ubmVjdGlvbiB7CiAJCXB1YmxpYyB2b2lkIGNsb3NlKCkgewogCQkJZW5kT3V0KCk7CiAKKwkJCWlmIChwcm9jZXNzICE9IG51bGwpIHsKKwkJCQlwcm9jZXNzLmRlc3Ryb3koKTsKKwkJCX0KIAkJCWlmIChlcnJvclRocmVhZCAhPSBudWxsKSB7CiAJCQkJdHJ5IHsKIAkJCQkJZXJyb3JUaHJlYWQuaGFsdCgpOwpAQCAtMzg4LDggKzM5Miw2IEBAIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogCQkJfQogCiAJCQlzdXBlci5jbG9zZSgpOwotCQkJaWYgKHByb2Nlc3MgIT0gbnVsbCkKLQkJCQlwcm9jZXNzLmRlc3Ryb3koKTsKIAkJfQogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEh0dHAuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydEh0dHAuamF2YQppbmRleCBhMTgyNjIzLi5jMDhmNDAwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRIdHRwLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0SHR0cC5qYXZhCkBAIC0yNzMsNyArMjczLDcgQEAgcHVibGljIFRyYW5zcG9ydCBvcGVuKFVSSWlzaCB1cmksIFJlcG9zaXRvcnkgbG9jYWwsIFN0cmluZyByZW1vdGVOYW1lKQogCiAJcHJpdmF0ZSBib29sZWFuIHNzbEZhaWx1cmUgPSBmYWxzZTsKIAotCVRyYW5zcG9ydEh0dHAoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgVVJJaXNoIHVyaSkKKwlUcmFuc3BvcnRIdHRwKFJlcG9zaXRvcnkgbG9jYWwsIFVSSWlzaCB1cmkpCiAJCQl0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKIAkJc3VwZXIobG9jYWwsIHVyaSk7CiAJCXNldFVSSSh1cmkpOwpAQCAtMjk4LDcgKzI5OCw3IEBAIHByaXZhdGUgVVJMIHRvVVJMKFVSSWlzaCB1cmlzaCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiB7CiAJICogQHRocm93cyBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Ob3RTdXBwb3J0ZWRFeGNlcHRpb24KIAkgKiBAc2luY2UgNC45CiAJICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VVJJKGZpbmFsIFVSSWlzaCB1cmkpIHRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworCXByb3RlY3RlZCB2b2lkIHNldFVSSShVUklpc2ggdXJpKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWN1cnJlbnRVcmkgPSB1cmk7CiAJCQliYXNlVXJsID0gdG9VUkwodXJpKTsKQEAgLTMxNCw3ICszMTQsNyBAQCBwcm90ZWN0ZWQgdm9pZCBzZXRVUkkoZmluYWwgVVJJaXNoIHVyaSkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CiAJICogQHBhcmFtIHVyaQogCSAqIEB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uCiAJICovCi0JVHJhbnNwb3J0SHR0cChmaW5hbCBVUklpc2ggdXJpKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKwlUcmFuc3BvcnRIdHRwKFVSSWlzaCB1cmkpIHRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogCQlzdXBlcih1cmkpOwogCQlzZXRVUkkodXJpKTsKIAkJaHR0cCA9IG5ldyBIdHRwQ29uZmlnKHVyaSk7CkBAIC0zMzIsMTAgKzMzMiwyNiBAQCBwcm90ZWN0ZWQgdm9pZCBzZXRVUkkoZmluYWwgVVJJaXNoIHVyaSkgdGhyb3dzIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CiAJICogQHBhcmFtIG9uCiAJICogICAgICAgICAgICBpZiB7QGNvZGUgdHJ1ZX0gKGRlZmF1bHQpLCBzbWFydCBIVFRQIGlzIGVuYWJsZWQuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VXNlU21hcnRIdHRwKGZpbmFsIGJvb2xlYW4gb24pIHsKKwlwdWJsaWMgdm9pZCBzZXRVc2VTbWFydEh0dHAoYm9vbGVhbiBvbikgewogCQl1c2VTbWFydEh0dHAgPSBvbjsKIAl9CiAKKwlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKSAvLyBDbG9zZWQgYnkgY2FsbGVyCisJcHJpdmF0ZSBGZXRjaENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbihIdHRwQ29ubmVjdGlvbiBjLCBJbnB1dFN0cmVhbSBpbiwKKwkJCVN0cmluZyBzZXJ2aWNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlCYXNlQ29ubmVjdGlvbiBmOworCQlpZiAoaXNTbWFydEh0dHAoYywgc2VydmljZSkpIHsKKwkJCXJlYWRTbWFydEhlYWRlcnMoaW4sIHNlcnZpY2UpOworCQkJZiA9IG5ldyBTbWFydEh0dHBGZXRjaENvbm5lY3Rpb24oaW4pOworCQl9IGVsc2UgeworCQkJLy8gQXNzdW1lIHRoaXMgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCBzbWFydCBIVFRQIGZldGNoCisJCQkvLyBhbmQgZmFsbCBiYWNrIG9uIGR1bWIgb2JqZWN0IHdhbGtpbmcuCisJCQlmID0gbmV3RHVtYkNvbm5lY3Rpb24oaW4pOworCQl9CisJCWYuc2V0UGVlclVzZXJBZ2VudChjLmdldEhlYWRlckZpZWxkKEh0dHBTdXBwb3J0LkhEUl9TRVJWRVIpKTsKKwkJcmV0dXJuIChGZXRjaENvbm5lY3Rpb24pIGY7CisJfQorCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgRmV0Y2hDb25uZWN0aW9uIG9wZW5GZXRjaCgpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24sCkBAIC0zNDMsMjEgKzM1OSw4IEBAIHB1YmxpYyBGZXRjaENvbm5lY3Rpb24gb3BlbkZldGNoKCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiwKIAkJZmluYWwgU3RyaW5nIHNlcnZpY2UgPSBTVkNfVVBMT0FEX1BBQ0s7CiAJCXRyeSB7CiAJCQlmaW5hbCBIdHRwQ29ubmVjdGlvbiBjID0gY29ubmVjdChzZXJ2aWNlKTsKLQkJCWZpbmFsIElucHV0U3RyZWFtIGluID0gb3BlbklucHV0U3RyZWFtKGMpOwotCQkJdHJ5IHsKLQkJCQlCYXNlQ29ubmVjdGlvbiBmOwotCQkJCWlmIChpc1NtYXJ0SHR0cChjLCBzZXJ2aWNlKSkgewotCQkJCQlyZWFkU21hcnRIZWFkZXJzKGluLCBzZXJ2aWNlKTsKLQkJCQkJZiA9IG5ldyBTbWFydEh0dHBGZXRjaENvbm5lY3Rpb24oaW4pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIEFzc3VtZSB0aGlzIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgc21hcnQgSFRUUCBmZXRjaAotCQkJCQkvLyBhbmQgZmFsbCBiYWNrIG9uIGR1bWIgb2JqZWN0IHdhbGtpbmcuCi0JCQkJCWYgPSBuZXdEdW1iQ29ubmVjdGlvbihpbik7Ci0JCQkJfQotCQkJCWYuc2V0UGVlclVzZXJBZ2VudChjLmdldEhlYWRlckZpZWxkKEh0dHBTdXBwb3J0LkhEUl9TRVJWRVIpKTsKLQkJCQlyZXR1cm4gKEZldGNoQ29ubmVjdGlvbikgZjsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW4uY2xvc2UoKTsKKwkJCXRyeSAoSW5wdXRTdHJlYW0gaW4gPSBvcGVuSW5wdXRTdHJlYW0oYykpIHsKKwkJCQlyZXR1cm4gZ2V0Q29ubmVjdGlvbihjLCBpbiwgc2VydmljZSk7CiAJCQl9CiAJCX0gY2F0Y2ggKE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlcnIpIHsKIAkJCXRocm93IGVycjsKQEAgLTQ4MCw3ICs0ODMsNyBAQCBwdWJsaWMgdm9pZCBzZXRBZGRpdGlvbmFsSGVhZGVycyhNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMpIHsKIAkJdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKIAl9CiAKLQlwcml2YXRlIEh0dHBDb25uZWN0aW9uIGNvbm5lY3QoZmluYWwgU3RyaW5nIHNlcnZpY2UpCisJcHJpdmF0ZSBIdHRwQ29ubmVjdGlvbiBjb25uZWN0KFN0cmluZyBzZXJ2aWNlKQogCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiwgTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKIAkJVVJMIHUgPSBnZXRTZXJ2aWNlVVJMKHNlcnZpY2UpOwogCQlpbnQgYXV0aEF0dGVtcHRzID0gMTsKQEAgLTc3Miw3ICs3NzUsNyBAQCBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFJlZGlyZWN0KFVSTCBjdXJyZW50LCBTdHJpbmcgbmV4dCwgU3RyaW5nIGNoZWNrRm9yKSB7CiAJCXJldHVybiB0cnVlOwogCX0KIAotCXByaXZhdGUgVVJMIGdldFNlcnZpY2VVUkwoZmluYWwgU3RyaW5nIHNlcnZpY2UpCisJcHJpdmF0ZSBVUkwgZ2V0U2VydmljZVVSTChTdHJpbmcgc2VydmljZSkKIAkJCXRocm93cyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewogCQl0cnkgewogCQkJZmluYWwgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKQEAgLTc5NiwyMSArNzk5LDYgQEAgcHJpdmF0ZSBVUkwgZ2V0U2VydmljZVVSTChmaW5hbCBTdHJpbmcgc2VydmljZSkKIAl9CiAKIAkvKioKLQkgKiBPcGVuIGFuIEhUVFAgY29ubmVjdGlvbiwgc2V0dGluZyB0aGUgYWNjZXB0LWVuY29kaW5nIHJlcXVlc3QgaGVhZGVyIHRvIGd6aXAuCi0JICoKLQkgKiBAcGFyYW0gbWV0aG9kIEhUVFAgcmVxdWVzdCBtZXRob2QKLQkgKiBAcGFyYW0gdSB1cmwgb2YgdGhlIEhUVFAgY29ubmVjdGlvbgotCSAqIEByZXR1cm4gdGhlIEhUVFAgY29ubmVjdGlvbgotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBzaW5jZSAzLjMKLQkgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNodHRwT3BlbihTdHJpbmcsIFVSTCwgQWNjZXB0RW5jb2RpbmcpfSBpbnN0ZWFkLgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHJvdGVjdGVkIEh0dHBDb25uZWN0aW9uIGh0dHBPcGVuKFN0cmluZyBtZXRob2QsIFVSTCB1KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gaHR0cE9wZW4obWV0aG9kLCB1LCBBY2NlcHRFbmNvZGluZy5HWklQKTsKLQl9Ci0KLQkvKioKIAkgKiBPcGVuIGFuIEhUVFAgY29ubmVjdGlvbi4KIAkgKgogCSAqIEBwYXJhbSBtZXRob2QgSFRUUCByZXF1ZXN0IG1ldGhvZApAQCAtODczLDE4ICs4NjEsMTggQEAgSU9FeGNlcHRpb24gd3JvbmdDb250ZW50VHlwZShTdHJpbmcgZXhwVHlwZSwgU3RyaW5nIGFjdFR5cGUpIHsKIAkJcmV0dXJuIG5ldyBUcmFuc3BvcnRFeGNlcHRpb24odXJpLCB3aHkpOwogCX0KIAotCXByaXZhdGUgYm9vbGVhbiBpc1NtYXJ0SHR0cChmaW5hbCBIdHRwQ29ubmVjdGlvbiBjLCBmaW5hbCBTdHJpbmcgc2VydmljZSkgeworCXByaXZhdGUgYm9vbGVhbiBpc1NtYXJ0SHR0cChIdHRwQ29ubmVjdGlvbiBjLCBTdHJpbmcgc2VydmljZSkgewogCQlmaW5hbCBTdHJpbmcgZXhwVHlwZSA9ICJhcHBsaWNhdGlvbi94LSIgKyBzZXJ2aWNlICsgIi1hZHZlcnRpc2VtZW50IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCWZpbmFsIFN0cmluZyBhY3RUeXBlID0gYy5nZXRDb250ZW50VHlwZSgpOwogCQlyZXR1cm4gZXhwVHlwZS5lcXVhbHMoYWN0VHlwZSk7CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIGlzR3ppcENvbnRlbnQoZmluYWwgSHR0cENvbm5lY3Rpb24gYykgeworCXByaXZhdGUgYm9vbGVhbiBpc0d6aXBDb250ZW50KEh0dHBDb25uZWN0aW9uIGMpIHsKIAkJcmV0dXJuIEVOQ09ESU5HX0daSVAuZXF1YWxzKGMuZ2V0SGVhZGVyRmllbGQoSERSX0NPTlRFTlRfRU5DT0RJTkcpKQogCQkJCXx8IEVOQ09ESU5HX1hfR1pJUC5lcXVhbHMoYy5nZXRIZWFkZXJGaWVsZChIRFJfQ09OVEVOVF9FTkNPRElORykpOwogCX0KIAotCXByaXZhdGUgdm9pZCByZWFkU21hcnRIZWFkZXJzKGZpbmFsIElucHV0U3RyZWFtIGluLCBmaW5hbCBTdHJpbmcgc2VydmljZSkKKwlwcml2YXRlIHZvaWQgcmVhZFNtYXJ0SGVhZGVycyhJbnB1dFN0cmVhbSBpbiwgU3RyaW5nIHNlcnZpY2UpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkvLyBBIHNtYXJ0IHJlcGx5IHdpbGwgaGF2ZSBhICcjJyBhZnRlciB0aGUgZmlyc3QgNCBieXRlcywgYnV0CiAJCS8vIGEgZHVtYiByZXBseSBjYW5ub3QgY29udGFpbiBhICcjJyB1bnRpbCBhZnRlciBieXRlIDQxLiBEbyBhCkBAIC05MTUsNyArOTAzLDcgQEAgcHJpdmF0ZSB2b2lkIHJlYWRTbWFydEhlYWRlcnMoZmluYWwgSW5wdXRTdHJlYW0gaW4sIGZpbmFsIFN0cmluZyBzZXJ2aWNlKQogCWNsYXNzIEh0dHBPYmplY3REQiBleHRlbmRzIFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSB7CiAJCXByaXZhdGUgZmluYWwgVVJMIGh0dHBPYmplY3RzVXJsOwogCi0JCUh0dHBPYmplY3REQihmaW5hbCBVUkwgYikgeworCQlIdHRwT2JqZWN0REIoVVJMIGIpIHsKIAkJCWh0dHBPYmplY3RzVXJsID0gYjsKIAkJfQogCkBAIC05NDIsNyArOTMwLDcgQEAgQ29sbGVjdGlvbjxXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2U+IGdldEFsdGVybmF0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCVdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBvcGVuQWx0ZXJuYXRlKGZpbmFsIFN0cmluZyBsb2NhdGlvbikKKwkJV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIG9wZW5BbHRlcm5hdGUoU3RyaW5nIGxvY2F0aW9uKQogCQkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gbmV3IEh0dHBPYmplY3REQihuZXcgVVJMKGh0dHBPYmplY3RzVXJsLCBsb2NhdGlvbikpOwogCQl9CkBAIC05NzQsNyArOTYyLDcgQEAgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFBhY2tOYW1lcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJRmlsZVN0cmVhbSBvcGVuKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlGaWxlU3RyZWFtIG9wZW4oU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gb3BlbihwYXRoLCBBY2NlcHRFbmNvZGluZy5VTlNQRUNJRklFRCk7CiAJCX0KIApAQCAtMTA0MiwxNSArMTAzMCwxNSBAQCBNYXA8U3RyaW5nLCBSZWY+IHJlYWRBZHZlcnRpc2VkSW1wbChmaW5hbCBCdWZmZXJlZFJlYWRlciBicikKIAkJCXJldHVybiBhdmFpbDsKIAkJfQogCi0JCXByaXZhdGUgUGFja1Byb3RvY29sRXhjZXB0aW9uIG91dE9mT3JkZXJBZHZlcnRpc2VtZW50KGZpbmFsIFN0cmluZyBuKSB7CisJCXByaXZhdGUgUGFja1Byb3RvY29sRXhjZXB0aW9uIG91dE9mT3JkZXJBZHZlcnRpc2VtZW50KFN0cmluZyBuKSB7CiAJCQlyZXR1cm4gbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5hZHZlcnRpc2VtZW50T2ZDYW1lQmVmb3JlLCBuLCBuKSk7CiAJCX0KIAotCQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBpbnZhbGlkQWR2ZXJ0aXNlbWVudChmaW5hbCBTdHJpbmcgbikgeworCQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBpbnZhbGlkQWR2ZXJ0aXNlbWVudChTdHJpbmcgbikgewogCQkJcmV0dXJuIG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZEFkdmVydGlzZW1lbnRPZiwgbikpOwogCQl9CiAKLQkJcHJpdmF0ZSBQYWNrUHJvdG9jb2xFeGNlcHRpb24gZHVwbGljYXRlQWR2ZXJ0aXNlbWVudChmaW5hbCBTdHJpbmcgbikgeworCQlwcml2YXRlIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiBkdXBsaWNhdGVBZHZlcnRpc2VtZW50KFN0cmluZyBuKSB7CiAJCQlyZXR1cm4gbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdChKR2l0VGV4dC5nZXQoKS5kdXBsaWNhdGVBZHZlcnRpc2VtZW50c09mLCBuKSk7CiAJCX0KIApAQCAtMTA2Myw3ICsxMDUxLDcgQEAgdm9pZCBjbG9zZSgpIHsKIAljbGFzcyBTbWFydEh0dHBGZXRjaENvbm5lY3Rpb24gZXh0ZW5kcyBCYXNlUGFja0ZldGNoQ29ubmVjdGlvbiB7CiAJCXByaXZhdGUgTXVsdGlSZXF1ZXN0U2VydmljZSBzdmM7CiAKLQkJU21hcnRIdHRwRmV0Y2hDb25uZWN0aW9uKGZpbmFsIElucHV0U3RyZWFtIGFkdmVydGlzZW1lbnQpCisJCVNtYXJ0SHR0cEZldGNoQ29ubmVjdGlvbihJbnB1dFN0cmVhbSBhZHZlcnRpc2VtZW50KQogCQkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQkJc3VwZXIoVHJhbnNwb3J0SHR0cC50aGlzKTsKIAkJCXN0YXRlbGVzc1JQQyA9IHRydWU7CkBAIC0xMDkzLDcgKzEwODEsNyBAQCBwcm90ZWN0ZWQgdm9pZCBvblJlY2VpdmVQYWNrKCkgewogCX0KIAogCWNsYXNzIFNtYXJ0SHR0cFB1c2hDb25uZWN0aW9uIGV4dGVuZHMgQmFzZVBhY2tQdXNoQ29ubmVjdGlvbiB7Ci0JCVNtYXJ0SHR0cFB1c2hDb25uZWN0aW9uKGZpbmFsIElucHV0U3RyZWFtIGFkdmVydGlzZW1lbnQpCisJCVNtYXJ0SHR0cFB1c2hDb25uZWN0aW9uKElucHV0U3RyZWFtIGFkdmVydGlzZW1lbnQpCiAJCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCQlzdXBlcihUcmFuc3BvcnRIdHRwLnRoaXMpOwogCQkJc3RhdGVsZXNzUlBDID0gdHJ1ZTsKQEAgLTEzOTYsNyArMTM4NCw3IEBAIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gb3ZlcmZsb3coKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCWNsYXNzIE11bHRpUmVxdWVzdFNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKIAkJYm9vbGVhbiBmaW5hbFJlcXVlc3Q7CiAKLQkJTXVsdGlSZXF1ZXN0U2VydmljZShmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUpIHsKKwkJTXVsdGlSZXF1ZXN0U2VydmljZShTdHJpbmcgc2VydmljZU5hbWUpIHsKIAkJCXN1cGVyKHNlcnZpY2VOYW1lKTsKIAkJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRMb2NhbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0TG9jYWwuamF2YQppbmRleCA0ZjE4ODBiLi5mYmIyYzQ0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRMb2NhbC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydExvY2FsLmphdmEKQEAgLTE2MiwxMSArMTYyLDExIEBAIHB1YmxpYyBUcmFuc3BvcnQgb3BlbihVUklpc2ggdXJpKSB0aHJvd3MgTm90U3VwcG9ydGVkRXhjZXB0aW9uLAogCQlyZW1vdGVHaXREaXIgPSBnaXREaXI7CiAJfQogCi0JVXBsb2FkUGFjayBjcmVhdGVVcGxvYWRQYWNrKGZpbmFsIFJlcG9zaXRvcnkgZHN0KSB7CisJVXBsb2FkUGFjayBjcmVhdGVVcGxvYWRQYWNrKFJlcG9zaXRvcnkgZHN0KSB7CiAJCXJldHVybiBuZXcgVXBsb2FkUGFjayhkc3QpOwogCX0KIAotCVJlY2VpdmVQYWNrIGNyZWF0ZVJlY2VpdmVQYWNrKGZpbmFsIFJlcG9zaXRvcnkgZHN0KSB7CisJUmVjZWl2ZVBhY2sgY3JlYXRlUmVjZWl2ZVBhY2soUmVwb3NpdG9yeSBkc3QpIHsKIAkJcmV0dXJuIG5ldyBSZWNlaXZlUGFjayhkc3QpOwogCX0KIApAQCAtMjI5LDcgKzIyOSw3IEBAIHB1YmxpYyB2b2lkIGNsb3NlKCkgewogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgaWYgYW55LgogCSAqLwotCXByb3RlY3RlZCBQcm9jZXNzIHNwYXduKGZpbmFsIFN0cmluZyBjbWQpCisJcHJvdGVjdGVkIFByb2Nlc3Mgc3Bhd24oU3RyaW5nIGNtZCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgewogCQkJU3RyaW5nW10gYXJncyA9IHsgIi4iIH07IC8vJE5PTi1OTFMtMSQKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydFNmdHAuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1RyYW5zcG9ydFNmdHAuamF2YQppbmRleCAzOWY5ODk3Li5mMTI5YmEzIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9UcmFuc3BvcnRTZnRwLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVHJhbnNwb3J0U2Z0cC5qYXZhCkBAIC0xMzYsNyArMTM2LDcgQEAgcHVibGljIFRyYW5zcG9ydCBvcGVuKFVSSWlzaCB1cmksIFJlcG9zaXRvcnkgbG9jYWwsIFN0cmluZyByZW1vdGVOYW1lKQogCQl9CiAJfTsKIAotCVRyYW5zcG9ydFNmdHAoZmluYWwgUmVwb3NpdG9yeSBsb2NhbCwgZmluYWwgVVJJaXNoIHVyaSkgeworCVRyYW5zcG9ydFNmdHAoUmVwb3NpdG9yeSBsb2NhbCwgVVJJaXNoIHVyaSkgewogCQlzdXBlcihsb2NhbCwgdXJpKTsKIAl9CiAKQEAgLTE5Nyw3ICsxOTcsNyBAQCBjbGFzcyBTZnRwT2JqZWN0REIgZXh0ZW5kcyBXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgewogCQkJfQogCQl9CiAKLQkJU2Z0cE9iamVjdERCKGZpbmFsIFNmdHBPYmplY3REQiBwYXJlbnQsIGZpbmFsIFN0cmluZyBwKQorCQlTZnRwT2JqZWN0REIoU2Z0cE9iamVjdERCIHBhcmVudCwgU3RyaW5nIHApCiAJCQkJdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCQl0cnkgewogCQkJCWZ0cCA9IG5ld1NmdHAoKTsKQEAgLTIyOSw3ICsyMjksNyBAQCBDb2xsZWN0aW9uPFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZT4gZ2V0QWx0ZXJuYXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIG9wZW5BbHRlcm5hdGUoZmluYWwgU3RyaW5nIGxvY2F0aW9uKQorCQlXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2Ugb3BlbkFsdGVybmF0ZShTdHJpbmcgbG9jYXRpb24pCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBuZXcgU2Z0cE9iamVjdERCKHRoaXMsIGxvY2F0aW9uKTsKIAkJfQpAQCAtMjQ2LDkgKzI0Niw5IEBAIENvbGxlY3Rpb248U3RyaW5nPiBnZXRQYWNrTmFtZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCWZpbGVzID0gbmV3IEhhc2hNYXA8PigpOwogCQkJCW10aW1lcyA9IG5ldyBIYXNoTWFwPD4oKTsKIAotCQkJCWZvciAoZmluYWwgQ2hhbm5lbFNmdHAuTHNFbnRyeSBlbnQgOiBsaXN0KQorCQkJCWZvciAoQ2hhbm5lbFNmdHAuTHNFbnRyeSBlbnQgOiBsaXN0KQogCQkJCQlmaWxlcy5wdXQoZW50LmdldEZpbGVuYW1lKCksIGVudCk7Ci0JCQkJZm9yIChmaW5hbCBDaGFubmVsU2Z0cC5Mc0VudHJ5IGVudCA6IGxpc3QpIHsKKwkJCQlmb3IgKENoYW5uZWxTZnRwLkxzRW50cnkgZW50IDogbGlzdCkgewogCQkJCQlmaW5hbCBTdHJpbmcgbiA9IGVudC5nZXRGaWxlbmFtZSgpOwogCQkJCQlpZiAoIW4uc3RhcnRzV2l0aCgicGFjay0iKSB8fCAhbi5lbmRzV2l0aCgiLnBhY2siKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCQljb250aW51ZTsKQEAgLTI2Myw3ICsyNjMsNyBAQCBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UGFja05hbWVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCQkJCUNvbGxlY3Rpb25zLnNvcnQocGFja3MsIG5ldyBDb21wYXJhdG9yPFN0cmluZz4oKSB7CiAJCQkJCUBPdmVycmlkZQotCQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgU3RyaW5nIG8xLCBmaW5hbCBTdHJpbmcgbzIpIHsKKwkJCQkJcHVibGljIGludCBjb21wYXJlKFN0cmluZyBvMSwgU3RyaW5nIG8yKSB7CiAJCQkJCQlyZXR1cm4gbXRpbWVzLmdldChvMikuaW50VmFsdWUoKQogCQkJCQkJCQktIG10aW1lcy5nZXQobzEpLmludFZhbHVlKCk7CiAJCQkJCX0KQEAgLTI3OCw3ICsyNzgsNyBAQCBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgU3RyaW5nIG8xLCBmaW5hbCBTdHJpbmcgbzIpIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlGaWxlU3RyZWFtIG9wZW4oZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCUZpbGVTdHJlYW0gb3BlbihTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXRyeSB7CiAJCQkJZmluYWwgU2Z0cEFUVFJTIGEgPSBmdHAubHN0YXQocGF0aCk7CiAJCQkJcmV0dXJuIG5ldyBGaWxlU3RyZWFtKGZ0cC5nZXQocGF0aCksIGEuZ2V0U2l6ZSgpKTsKQEAgLTI5Miw3ICsyOTIsNyBAQCBGaWxlU3RyZWFtIG9wZW4oZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCBkZWxldGVGaWxlKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl2b2lkIGRlbGV0ZUZpbGUoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl0cnkgewogCQkJCWZ0cC5ybShwYXRoKTsKIAkJCX0gY2F0Y2ggKFNmdHBFeGNlcHRpb24gamUpIHsKQEAgLTM0NSw3ICszNDUsNyBAQCBPdXRwdXRTdHJlYW0gd3JpdGVGaWxlKGZpbmFsIFN0cmluZyBwYXRoLAogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXZvaWQgd3JpdGVGaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCB3cml0ZUZpbGUoU3RyaW5nIHBhdGgsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJZmluYWwgU3RyaW5nIGxvY2sgPSBwYXRoICsgTE9DS19TVUZGSVg7CiAJCQl0cnkgewogCQkJCXN1cGVyLndyaXRlRmlsZShsb2NrLCBkYXRhKTsKQEAgLTQxMyw3ICs0MTMsNyBAQCBwcml2YXRlIHZvaWQgcmVhZExvb3NlUmVmcyhmaW5hbCBUcmVlTWFwPFN0cmluZywgUmVmPiBhdmFpbCwKIAkJCQkJCWplLmdldE1lc3NhZ2UoKSksIGplKTsKIAkJCX0KIAotCQkJZm9yIChmaW5hbCBDaGFubmVsU2Z0cC5Mc0VudHJ5IGVudCA6IGxpc3QpIHsKKwkJCWZvciAoQ2hhbm5lbFNmdHAuTHNFbnRyeSBlbnQgOiBsaXN0KSB7CiAJCQkJZmluYWwgU3RyaW5nIG4gPSBlbnQuZ2V0RmlsZW5hbWUoKTsKIAkJCQlpZiAoIi4iLmVxdWFscyhuKSB8fCAiLi4iLmVxdWFscyhuKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCWNvbnRpbnVlOwpAQCAtNDY2LDcgKzQ2Niw3IEBAIHByaXZhdGUgUmVmIHJlYWRSZWYoZmluYWwgVHJlZU1hcDxTdHJpbmcsIFJlZj4gYXZhaWwsCiAJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmJhZFJlZiwgbmFtZSwgbGluZSkpOwogCQl9CiAKLQkJcHJpdmF0ZSBTdG9yYWdlIGxvb3NlKGZpbmFsIFJlZiByKSB7CisJCXByaXZhdGUgU3RvcmFnZSBsb29zZShSZWYgcikgewogCQkJaWYgKHIgIT0gbnVsbCAmJiByLmdldFN0b3JhZ2UoKSA9PSBTdG9yYWdlLlBBQ0tFRCkKIAkJCQlyZXR1cm4gU3RvcmFnZS5MT09TRV9QQUNLRUQ7CiAJCQlyZXR1cm4gU3RvcmFnZS5MT09TRTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VSSWlzaC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVVJJaXNoLmphdmEKaW5kZXggYTA0OGZlMy4uMDI2ZmQ4MSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVVJJaXNoLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVVJJaXNoLmphdmEKQEAgLTM4Nyw3ICszODcsNyBAQCBlbHNlIGlmIChzICE9IG51bGwgJiYgcC5sZW5ndGgoKSA+PSAyICYmIHAuY2hhckF0KDApID09ICcvJwogCSAqIEBwYXJhbSB1CiAJICogICAgICAgICAgICB0aGUgc291cmNlIFVSTCB0byBjb252ZXJ0IGZyb20uCiAJICovCi0JcHVibGljIFVSSWlzaChmaW5hbCBVUkwgdSkgeworCXB1YmxpYyBVUklpc2goVVJMIHUpIHsKIAkJc2NoZW1lID0gdS5nZXRQcm90b2NvbCgpOwogCQlwYXRoID0gdS5nZXRQYXRoKCk7CiAJCXBhdGggPSBjbGVhbkxlYWRpbmdTbGFzaGVzKHBhdGgsIHNjaGVtZSk7CkBAIC00MTYsNyArNDE2LDcgQEAgcHVibGljIFVSSWlzaCgpIHsKIAkJLy8gQ29uZmlndXJlIG5vdGhpbmcuCiAJfQogCi0JcHJpdmF0ZSBVUklpc2goZmluYWwgVVJJaXNoIHUpIHsKKwlwcml2YXRlIFVSSWlzaChVUklpc2ggdSkgewogCQl0aGlzLnNjaGVtZSA9IHUuc2NoZW1lOwogCQl0aGlzLnJhd1BhdGggPSB1LnJhd1BhdGg7CiAJCXRoaXMucGF0aCA9IHUucGF0aDsKQEAgLTQ1MSw3ICs0NTEsNyBAQCBwdWJsaWMgU3RyaW5nIGdldEhvc3QoKSB7CiAJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciBob3N0LgogCSAqIEByZXR1cm4gYSBuZXcgVVJJIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWUuCiAJICovCi0JcHVibGljIFVSSWlzaCBzZXRIb3N0KGZpbmFsIFN0cmluZyBuKSB7CisJcHVibGljIFVSSWlzaCBzZXRIb3N0KFN0cmluZyBuKSB7CiAJCWZpbmFsIFVSSWlzaCByID0gbmV3IFVSSWlzaCh0aGlzKTsKIAkJci5ob3N0ID0gbjsKIAkJcmV0dXJuIHI7CkBAIC00NzMsNyArNDczLDcgQEAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKSB7CiAJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciBzY2hlbWUuCiAJICogQHJldHVybiBhIG5ldyBVUkkgd2l0aCB0aGUgdXBkYXRlZCB2YWx1ZS4KIAkgKi8KLQlwdWJsaWMgVVJJaXNoIHNldFNjaGVtZShmaW5hbCBTdHJpbmcgbikgeworCXB1YmxpYyBVUklpc2ggc2V0U2NoZW1lKFN0cmluZyBuKSB7CiAJCWZpbmFsIFVSSWlzaCByID0gbmV3IFVSSWlzaCh0aGlzKTsKIAkJci5zY2hlbWUgPSBuOwogCQlyZXR1cm4gcjsKQEAgLTUwNCw3ICs1MDQsNyBAQCBwdWJsaWMgU3RyaW5nIGdldFJhd1BhdGgoKSB7CiAJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciBwYXRoLgogCSAqIEByZXR1cm4gYSBuZXcgVVJJIHdpdGggdGhlIHVwZGF0ZWQgdmFsdWUuCiAJICovCi0JcHVibGljIFVSSWlzaCBzZXRQYXRoKGZpbmFsIFN0cmluZyBuKSB7CisJcHVibGljIFVSSWlzaCBzZXRQYXRoKFN0cmluZyBuKSB7CiAJCWZpbmFsIFVSSWlzaCByID0gbmV3IFVSSWlzaCh0aGlzKTsKIAkJci5wYXRoID0gbjsKIAkJci5yYXdQYXRoID0gbjsKQEAgLTUxOSw3ICs1MTksNyBAQCBwdWJsaWMgVVJJaXNoIHNldFBhdGgoZmluYWwgU3RyaW5nIG4pIHsKIAkgKiBAcmV0dXJuIGEgbmV3IFVSSSB3aXRoIHRoZSB1cGRhdGVkIHZhbHVlLgogCSAqIEB0aHJvd3MgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uCiAJICovCi0JcHVibGljIFVSSWlzaCBzZXRSYXdQYXRoKGZpbmFsIFN0cmluZyBuKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKwlwdWJsaWMgVVJJaXNoIHNldFJhd1BhdGgoU3RyaW5nIG4pIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24gewogCQlmaW5hbCBVUklpc2ggciA9IG5ldyBVUklpc2godGhpcyk7CiAJCXIucGF0aCA9IHVuZXNjYXBlKG4pOwogCQlyLnJhd1BhdGggPSBuOwpAQCAtNTQyLDcgKzU0Miw3IEBAIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcigpIHsKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHVzZXIuCiAJICogQHJldHVybiBhIG5ldyBVUkkgd2l0aCB0aGUgdXBkYXRlZCB2YWx1ZS4KIAkgKi8KLQlwdWJsaWMgVVJJaXNoIHNldFVzZXIoZmluYWwgU3RyaW5nIG4pIHsKKwlwdWJsaWMgVVJJaXNoIHNldFVzZXIoU3RyaW5nIG4pIHsKIAkJZmluYWwgVVJJaXNoIHIgPSBuZXcgVVJJaXNoKHRoaXMpOwogCQlyLnVzZXIgPSBuOwogCQlyZXR1cm4gcjsKQEAgLTU2NCw3ICs1NjQsNyBAQCBwdWJsaWMgU3RyaW5nIGdldFBhc3MoKSB7CiAJICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciBwYXNzd29yZC4KIAkgKiBAcmV0dXJuIGEgbmV3IFVSSSB3aXRoIHRoZSB1cGRhdGVkIHZhbHVlLgogCSAqLwotCXB1YmxpYyBVUklpc2ggc2V0UGFzcyhmaW5hbCBTdHJpbmcgbikgeworCXB1YmxpYyBVUklpc2ggc2V0UGFzcyhTdHJpbmcgbikgewogCQlmaW5hbCBVUklpc2ggciA9IG5ldyBVUklpc2godGhpcyk7CiAJCXIucGFzcyA9IG47CiAJCXJldHVybiByOwpAQCAtNTg2LDcgKzU4Niw3IEBAIHB1YmxpYyBpbnQgZ2V0UG9ydCgpIHsKIAkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgZm9yIHBvcnQuCiAJICogQHJldHVybiBhIG5ldyBVUkkgd2l0aCB0aGUgdXBkYXRlZCB2YWx1ZS4KIAkgKi8KLQlwdWJsaWMgVVJJaXNoIHNldFBvcnQoZmluYWwgaW50IG4pIHsKKwlwdWJsaWMgVVJJaXNoIHNldFBvcnQoaW50IG4pIHsKIAkJZmluYWwgVVJJaXNoIHIgPSBuZXcgVVJJaXNoKHRoaXMpOwogCQlyLnBvcnQgPSBuID4gMCA/IG4gOiAtMTsKIAkJcmV0dXJuIHI7CkBAIC02MTMsNyArNjEzLDcgQEAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKwlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewogCQlpZiAoIShvYmogaW5zdGFuY2VvZiBVUklpc2gpKQogCQkJcmV0dXJuIGZhbHNlOwogCQlmaW5hbCBVUklpc2ggYiA9IChVUklpc2gpIG9iajsKQEAgLTYzMiw3ICs2MzIsNyBAQCBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgewogCQlyZXR1cm4gdHJ1ZTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxKGZpbmFsIFN0cmluZyBhLCBmaW5hbCBTdHJpbmcgYikgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gZXEoU3RyaW5nIGEsIFN0cmluZyBiKSB7CiAJCWlmIChhID09IGIpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJaWYgKFN0cmluZ1V0aWxzLmlzRW1wdHlPck51bGwoYSkgJiYgU3RyaW5nVXRpbHMuaXNFbXB0eU9yTnVsbChiKSkKQEAgLTY1Nyw3ICs2NTcsNyBAQCBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogCQlyZXR1cm4gZm9ybWF0KGZhbHNlLCBmYWxzZSk7CiAJfQogCi0JcHJpdmF0ZSBTdHJpbmcgZm9ybWF0KGZpbmFsIGJvb2xlYW4gaW5jbHVkZVBhc3N3b3JkLCBib29sZWFuIGVzY2FwZU5vbkFzY2lpKSB7CisJcHJpdmF0ZSBTdHJpbmcgZm9ybWF0KGJvb2xlYW4gaW5jbHVkZVBhc3N3b3JkLCBib29sZWFuIGVzY2FwZU5vbkFzY2lpKSB7CiAJCWZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWlmIChnZXRTY2hlbWUoKSAhPSBudWxsKSB7CiAJCQlyLmFwcGVuZChnZXRTY2hlbWUoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrLmphdmEKaW5kZXggOGY3NWJiYS4uNmEzZDlhMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvVXBsb2FkUGFjay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2suamF2YQpAQCAtNDMsMTAgKzQzLDE2IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb24uaWRlbnRpdHk7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9ycy50b01hcDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLlJfVEFHUzsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuQ09NTUFORF9GRVRDSDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuQ09NTUFORF9MU19SRUZTOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5PUFRJT05fQUdFTlQ7CiBpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk9QVElPTl9BTExPV19SRUFDSEFCTEVfU0hBMV9JTl9XQU5UOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5PUFRJT05fQUxMT1dfVElQX1NIQTFfSU5fV0FOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX0RFRVBFTl9SRUxBVElWRTsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX0ZJTFRFUjsKIGltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuR2l0UHJvdG9jb2xDb25zdGFudHMuT1BUSU9OX0lOQ0xVREVfVEFHOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5PUFRJT05fTVVMVElfQUNLOwogaW1wb3J0IHN0YXRpYyBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5HaXRQcm90b2NvbENvbnN0YW50cy5PUFRJT05fTVVMVElfQUNLX0RFVEFJTEVEOwpAQCAtNjcsMTAgKzczLDEzIEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db3JydXB0T2JqZWN0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuTWlzc2luZ09iamVjdEV4Y2VwdGlvbjsKQEAgLTEwMSw2ICsxMTAsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuc3RvcmFnZS5wYWNrLlBhY2tTdGF0aXN0aWNzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LkdpdFByb3RvY29sQ29uc3RhbnRzLk11bHRpQWNrOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlZkFkdmVydGlzZXIuUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVHJhbnNmZXJDb25maWcuUHJvdG9jb2xWZXJzaW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5JbnRlcnJ1cHRUaW1lcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uTnVsbE91dHB1dFN0cmVhbTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uVGltZW91dElucHV0U3RyZWFtOwpAQCAtMjM2LDYgKzI0NiwxMiBAQCBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0T3B0aW9ucygpIHsKIAkvKiogVGltZXIgdG8gbWFuYWdlIHtAbGluayAjdGltZW91dH0uICovCiAJcHJpdmF0ZSBJbnRlcnJ1cHRUaW1lciB0aW1lcjsKIAorCS8qKgorCSAqIFdoZXRoZXIgdGhlIGNsaWVudCByZXF1ZXN0ZWQgdG8gdXNlIHByb3RvY29sIFYyIHRocm91Z2ggYSBzaWRlCisJICogY2hhbm5lbCAoc3VjaCBhcyB0aGUgR2l0LVByb3RvY29sIEhUVFAgaGVhZGVyKS4KKwkgKi8KKwlwcml2YXRlIGJvb2xlYW4gY2xpZW50UmVxdWVzdGVkVjI7CisKIAlwcml2YXRlIElucHV0U3RyZWFtIHJhd0luOwogCiAJcHJpdmF0ZSBSZXNwb25zZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIHJhd091dDsKQEAgLTI0NiwxMiArMjYyLDE4IEBAIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRPcHRpb25zKCkgewogCiAJcHJpdmF0ZSBPdXRwdXRTdHJlYW0gbXNnT3V0ID0gTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRTsKIAotCS8qKiBUaGUgcmVmcyB3ZSBhZHZlcnRpc2VkIGFzIGV4aXN0aW5nIGF0IHRoZSBzdGFydCBvZiB0aGUgY29ubmVjdGlvbi4gKi8KKwkvKioKKwkgKiBSZWZzIGVsaWdpYmxlIGZvciBhZHZlcnRpc2luZyB0byB0aGUgY2xpZW50LCBzZXQgdXNpbmcKKwkgKiB7QGxpbmsgI3NldEFkdmVydGlzZWRSZWZzfS4KKwkgKi8KIAlwcml2YXRlIE1hcDxTdHJpbmcsIFJlZj4gcmVmczsKIAogCS8qKiBIb29rIHVzZWQgd2hpbGUgYWR2ZXJ0aXNpbmcgdGhlIHJlZnMgdG8gdGhlIGNsaWVudC4gKi8KIAlwcml2YXRlIEFkdmVydGlzZVJlZnNIb29rIGFkdmVydGlzZVJlZnNIb29rID0gQWR2ZXJ0aXNlUmVmc0hvb2suREVGQVVMVDsKIAorCS8qKiBXaGV0aGVyIHRoZSB7QGxpbmsgI2FkdmVydGlzZVJlZnNIb29rfSBoYXMgYmVlbiBpbnZva2VkLiAqLworCXByaXZhdGUgYm9vbGVhbiBhZHZlcnRpc2VSZWZzSG9va0NhbGxlZDsKKwogCS8qKiBGaWx0ZXIgdXNlZCB3aGlsZSBhZHZlcnRpc2luZyB0aGUgcmVmcyB0byB0aGUgY2xpZW50LiAqLwogCXByaXZhdGUgUmVmRmlsdGVyIHJlZkZpbHRlciA9IFJlZkZpbHRlci5ERUZBVUxUOwogCkBAIC0yNzcsMTIgKzI5OSwyMiBAQCBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0T3B0aW9ucygpIHsKIAkvKiogU2hhbGxvdyBjb21taXRzIHRoZSBjbGllbnQgYWxyZWFkeSBoYXMuICovCiAJcHJpdmF0ZSBmaW5hbCBTZXQ8T2JqZWN0SWQ+IGNsaWVudFNoYWxsb3dDb21taXRzID0gbmV3IEhhc2hTZXQ8PigpOwogCi0JLyoqIFNoYWxsb3cgY29tbWl0cyBvbiB0aGUgY2xpZW50IHdoaWNoIGFyZSBub3cgYmVjb21pbmcgdW5zaGFsbG93ICovCi0JcHJpdmF0ZSBmaW5hbCBMaXN0PE9iamVjdElkPiB1bnNoYWxsb3dDb21taXRzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KIAkvKiogRGVzaXJlZCBkZXB0aCBmcm9tIHRoZSBjbGllbnQgb24gYSBzaGFsbG93IHJlcXVlc3QuICovCiAJcHJpdmF0ZSBpbnQgZGVwdGg7CiAKKwkvKioKKwkgKiBDb21taXQgdGltZSBvZiB0aGUgbmV3ZXN0IG9iamVjdHMgdGhlIGNsaWVudCBoYXMgYXNrZWQgdXMgdXNpbmcKKwkgKiAtLXNoYWxsb3ctc2luY2Ugbm90IHRvIHNlbmQuIENhbm5vdCBiZSBub256ZXJvIGlmIGRlcHRoIGlzIG5vbnplcm8uCisJICovCisJcHJpdmF0ZSBpbnQgc2hhbGxvd1NpbmNlOworCisJLyoqCisJICogKFBvc3NpYmx5IHNob3J0KSByZWYgbmFtZXMsIGFuY2VzdG9ycyBvZiB3aGljaCB0aGUgY2xpZW50IGhhcyBhc2tlZCB1cworCSAqIG5vdCB0byBzZW5kIHVzaW5nIC0tc2hhbGxvdy1leGNsdWRlLiBDYW5ub3QgYmUgbm9uLW51bGwgaWYgZGVwdGggaXMKKwkgKiBub256ZXJvLgorCSAqLworCXByaXZhdGUgQE51bGxhYmxlIExpc3Q8U3RyaW5nPiBzaGFsbG93RXhjbHVkZVJlZnM7CisKIAkvKiogQ29tbWl0IHRpbWUgb2YgdGhlIG9sZGVzdCBjb21tb24gY29tbWl0LCBpbiBzZWNvbmRzLiAqLwogCXByaXZhdGUgaW50IG9sZGVzdFRpbWU7CiAKQEAgLTMxNiw4ICszNDgsNyBAQCBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0T3B0aW9ucygpIHsKIAogCXByaXZhdGUgUGFja1N0YXRpc3RpY3Mgc3RhdGlzdGljczsKIAotCUBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0JcHJpdmF0ZSBVcGxvYWRQYWNrTG9nZ2VyIGxvZ2dlciA9IFVwbG9hZFBhY2tMb2dnZXIuTlVMTDsKKwlwcml2YXRlIGxvbmcgZmlsdGVyQmxvYkxpbWl0ID0gLTE7CiAKIAkvKioKIAkgKiBDcmVhdGUgYSBuZXcgcGFjayB1cGxvYWQgZm9yIGFuIG9wZW4gcmVwb3NpdG9yeS4KQEAgLTMyNSw3ICszNTYsNyBAQCBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0T3B0aW9ucygpIHsKIAkgKiBAcGFyYW0gY29weUZyb20KIAkgKiAgICAgICAgICAgIHRoZSBzb3VyY2UgcmVwb3NpdG9yeS4KIAkgKi8KLQlwdWJsaWMgVXBsb2FkUGFjayhmaW5hbCBSZXBvc2l0b3J5IGNvcHlGcm9tKSB7CisJcHVibGljIFVwbG9hZFBhY2soUmVwb3NpdG9yeSBjb3B5RnJvbSkgewogCQlkYiA9IGNvcHlGcm9tOwogCQl3YWxrID0gbmV3IFJldldhbGsoZGIpOwogCQl3YWxrLnNldFJldGFpbkJvZHkoZmFsc2UpOwpAQCAtNDE0LDcgKzQ0NSw3IEBAIHB1YmxpYyBpbnQgZ2V0VGltZW91dCgpIHsKIAkgKiAgICAgICAgICAgIGJlZm9yZSBhYm9ydGluZyBhbiBJTyByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbiB3aXRoIHRoZQogCSAqICAgICAgICAgICAgY29ubmVjdGVkIGNsaWVudC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUaW1lb3V0KGZpbmFsIGludCBzZWNvbmRzKSB7CisJcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgc2Vjb25kcykgewogCQl0aW1lb3V0ID0gc2Vjb25kczsKIAl9CiAKQEAgLTQ0MSw3ICs0NzIsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0JpRGlyZWN0aW9uYWxQaXBlKCkgewogCSAqICAgICAgICAgICAgY29tbWFuZHMgYmVmb3JlIHdyaXRpbmcgb3V0cHV0IGFuZCBkb2VzIG5vdCBwZXJmb3JtIHRoZQogCSAqICAgICAgICAgICAgaW5pdGlhbCBhZHZlcnRpc2luZy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCaURpcmVjdGlvbmFsUGlwZShmaW5hbCBib29sZWFuIHR3b1dheSkgeworCXB1YmxpYyB2b2lkIHNldEJpRGlyZWN0aW9uYWxQaXBlKGJvb2xlYW4gdHdvV2F5KSB7CiAJCWJpRGlyZWN0aW9uYWxQaXBlID0gdHdvV2F5OwogCX0KIApAQCAtNTQ0LDcgKzU3NSw3IEBAIHB1YmxpYyBSZWZGaWx0ZXIgZ2V0UmVmRmlsdGVyKCkgewogCSAqIEBwYXJhbSBhZHZlcnRpc2VSZWZzSG9vawogCSAqICAgICAgICAgICAgdGhlIGhvb2s7IG1heSBiZSBudWxsIHRvIHNob3cgYWxsIHJlZnMuCiAJICovCi0JcHVibGljIHZvaWQgc2V0QWR2ZXJ0aXNlUmVmc0hvb2soZmluYWwgQWR2ZXJ0aXNlUmVmc0hvb2sgYWR2ZXJ0aXNlUmVmc0hvb2spIHsKKwlwdWJsaWMgdm9pZCBzZXRBZHZlcnRpc2VSZWZzSG9vayhBZHZlcnRpc2VSZWZzSG9vayBhZHZlcnRpc2VSZWZzSG9vaykgewogCQlpZiAoYWR2ZXJ0aXNlUmVmc0hvb2sgIT0gbnVsbCkKIAkJCXRoaXMuYWR2ZXJ0aXNlUmVmc0hvb2sgPSBhZHZlcnRpc2VSZWZzSG9vazsKIAkJZWxzZQpAQCAtNTYzLDcgKzU5NCw3IEBAIHB1YmxpYyB2b2lkIHNldEFkdmVydGlzZVJlZnNIb29rKGZpbmFsIEFkdmVydGlzZVJlZnNIb29rIGFkdmVydGlzZVJlZnNIb29rKSB7CiAJICogQHBhcmFtIHJlZkZpbHRlcgogCSAqICAgICAgICAgICAgdGhlIGZpbHRlcjsgbWF5IGJlIG51bGwgdG8gc2hvdyBhbGwgcmVmcy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWZGaWx0ZXIoZmluYWwgUmVmRmlsdGVyIHJlZkZpbHRlcikgeworCXB1YmxpYyB2b2lkIHNldFJlZkZpbHRlcihSZWZGaWx0ZXIgcmVmRmlsdGVyKSB7CiAJCXRoaXMucmVmRmlsdGVyID0gcmVmRmlsdGVyICE9IG51bGwgPyByZWZGaWx0ZXIgOiBSZWZGaWx0ZXIuREVGQVVMVDsKIAl9CiAKQEAgLTYzOCwyOSArNjY5LDYgQEAgcHVibGljIHZvaWQgc2V0VHJhbnNmZXJDb25maWcoVHJhbnNmZXJDb25maWcgdGMpIHsKIAl9CiAKIAkvKioKLQkgKiBHZXQgdGhlIGNvbmZpZ3VyZWQgbG9nZ2VyLgotCSAqCi0JICogQHJldHVybiB0aGUgY29uZmlndXJlZCBsb2dnZXIuCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0UHJlVXBsb2FkSG9vaygpfS4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBVcGxvYWRQYWNrTG9nZ2VyIGdldExvZ2dlcigpIHsKLQkJcmV0dXJuIGxvZ2dlcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGxvZ2dlci4KLQkgKgotCSAqIEBwYXJhbSBsb2dnZXIKLQkgKiAgICAgICAgICAgIHRoZSBsb2dnZXIgaW5zdGFuY2UuIElmIG51bGwsIG5vIGxvZ2dpbmcgb2NjdXJzLgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI3NldFByZVVwbG9hZEhvb2soUHJlVXBsb2FkSG9vayl9LgotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHZvaWQgc2V0TG9nZ2VyKFVwbG9hZFBhY2tMb2dnZXIgbG9nZ2VyKSB7Ci0JCXRoaXMubG9nZ2VyID0gbG9nZ2VyOwotCX0KLQotCS8qKgogCSAqIENoZWNrIHdoZXRoZXIgdGhlIGNsaWVudCBleHBlY3RzIGEgc2lkZS1iYW5kIHN0cmVhbS4KIAkgKgogCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY2xpZW50IGhhcyBhZHZlcnRpc2VkIGEgc2lkZS1iYW5kIGNhcGFiaWxpdHksIGZhbHNlCkBAIC02NzksOCArNjg3LDM0IEBAIHB1YmxpYyBib29sZWFuIGlzU2lkZUJhbmQoKSB0aHJvd3MgUmVxdWVzdE5vdFlldFJlYWRFeGNlcHRpb24gewogCX0KIAogCS8qKgorCSAqIFNldCB0aGUgRXh0cmEgUGFyYW1ldGVycyBwcm92aWRlZCBieSB0aGUgY2xpZW50LgorCSAqCisJICogPHA+VGhlc2UgYXJlIHBhcmFtZXRlcnMgcGFzc2VkIGJ5IHRoZSBjbGllbnQgdGhyb3VnaCBhIHNpZGUgY2hhbm5lbAorCSAqIHN1Y2ggYXMgdGhlIEdpdC1Qcm90b2NvbCBIVFRQIGhlYWRlciwgdG8gYWxsb3cgYSBjbGllbnQgdG8gcmVxdWVzdAorCSAqIGEgbmV3ZXIgcmVzcG9uc2UgZm9ybWF0IHdoaWxlIHJlbWFpbmluZyBjb21wYXRpYmxlIHdpdGggb2xkZXIgc2VydmVycworCSAqIHRoYXQgZG8gbm90IHVuZGVyc3RhbmQgZGlmZmVyZW50IHJlcXVlc3QgZm9ybWF0cy4KKwkgKgorCSAqIEBwYXJhbSBwYXJhbXMKKwkgKiAgICAgICAgICAgIHBhcmFtZXRlcnMgc3VwcGxpZWQgYnkgdGhlIGNsaWVudCwgc3BsaXQgYXQgY29sb25zIG9yIE5VTAorCSAqICAgICAgICAgICAgYnl0ZXMuCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldEV4dHJhUGFyYW1ldGVycyhDb2xsZWN0aW9uPFN0cmluZz4gcGFyYW1zKSB7CisJCXRoaXMuY2xpZW50UmVxdWVzdGVkVjIgPSBwYXJhbXMuY29udGFpbnMoInZlcnNpb249MiIpOyAvLyROT04tTkxTLTEkCisJfQorCisJcHJpdmF0ZSBib29sZWFuIHVzZVByb3RvY29sVjIoKSB7CisJCXJldHVybiBQcm90b2NvbFZlcnNpb24uVjIuZXF1YWxzKHRyYW5zZmVyQ29uZmlnLnByb3RvY29sVmVyc2lvbikKKwkJCQkmJiBjbGllbnRSZXF1ZXN0ZWRWMjsKKwl9CisKKwkvKioKIAkgKiBFeGVjdXRlIHRoZSB1cGxvYWQgdGFzayBvbiB0aGUgc29ja2V0LgogCSAqCisJICogPHA+SWYgdGhlIGNsaWVudCBwYXNzZWQgZXh0cmEgcGFyYW1ldGVycyAoZS5nLiwgInZlcnNpb249MiIpIHRocm91Z2ggYQorCSAqIHNpZGUgY2hhbm5lbCwgdGhlIGNhbGxlciBtdXN0IGNhbGwgc2V0RXh0cmFQYXJhbWV0ZXJzIGZpcnN0IHRvIHN1cHBseQorCSAqIHRoZW0uCisJICoKIAkgKiBAcGFyYW0gaW5wdXQKIAkgKiAgICAgICAgICAgIHJhdyBpbnB1dCB0byByZWFkIGNsaWVudCBjb21tYW5kcyBmcm9tLiBDYWxsZXIgbXVzdCBlbnN1cmUgdGhlCiAJICogICAgICAgICAgICBpbnB1dCBpcyBidWZmZXJlZCwgb3RoZXJ3aXNlIHJlYWQgcGVyZm9ybWFuY2UgbWF5IHN1ZmZlci4KQEAgLTcyMSw3ICs3NTUsMTEgQEAgcHVibGljIHZvaWQgdXBsb2FkKGZpbmFsIElucHV0U3RyZWFtIGlucHV0LCBPdXRwdXRTdHJlYW0gb3V0cHV0LAogCiAJCQlwY2tJbiA9IG5ldyBQYWNrZXRMaW5lSW4ocmF3SW4pOwogCQkJcGNrT3V0ID0gbmV3IFBhY2tldExpbmVPdXQocmF3T3V0KTsKLQkJCXNlcnZpY2UoKTsKKwkJCWlmICh1c2VQcm90b2NvbFYyKCkpIHsKKwkJCQlzZXJ2aWNlVjIoKTsKKwkJCX0gZWxzZSB7CisJCQkJc2VydmljZSgpOworCQkJfQogCQl9IGZpbmFsbHkgewogCQkJbXNnT3V0ID0gTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRTsKIAkJCXdhbGsuY2xvc2UoKTsKQEAgLTc0MSwyMSArNzc5LDYgQEAgcHVibGljIHZvaWQgdXBsb2FkKGZpbmFsIElucHV0U3RyZWFtIGlucHV0LCBPdXRwdXRTdHJlYW0gb3V0cHV0LAogCSAqIEByZXR1cm4gc3RhdGlzdGljcyBhYm91dCBwYWNrIG91dHB1dCwgaWYgYSBwYWNrIHdhcyBzZW50LiBOdWxsIGlmIG5vIHBhY2sKIAkgKiAgICAgICAgIHdhcyBzZW50LCBzdWNoIGFzIGR1cmluZyB0aGUgbmVnb3RpYXRpb24gcGhhc2Ugb2YgYSBzbWFydCBIVFRQCiAJICogICAgICAgICBjb25uZWN0aW9uLCBvciBpZiB0aGUgY2xpZW50IHdhcyBhbHJlYWR5IHVwLXRvLWRhdGUuCi0JICogQHNpbmNlIDMuMAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2dldFN0YXRpc3RpY3MoKX0uCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgUGFja1dyaXRlci5TdGF0aXN0aWNzIGdldFBhY2tTdGF0aXN0aWNzKCkgewotCQlyZXR1cm4gc3RhdGlzdGljcyA9PSBudWxsID8gbnVsbAotCQkJCTogbmV3IFBhY2tXcml0ZXIuU3RhdGlzdGljcyhzdGF0aXN0aWNzKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFBhY2tXcml0ZXIncyBzdGF0aXN0aWNzIGlmIGEgcGFjayB3YXMgc2VudCB0byB0aGUgY2xpZW50LgotCSAqCi0JICogQHJldHVybiBzdGF0aXN0aWNzIGFib3V0IHBhY2sgb3V0cHV0LCBpZiBhIHBhY2sgd2FzIHNlbnQuIE51bGwgaWYgbm8gcGFjawotCSAqICAgICAgICAgd2FzIHNlbnQsIHN1Y2ggYXMgZHVyaW5nIHRoZSBuZWdvdGlhdGlvbiBwaGFzZSBvZiBhIHNtYXJ0IEhUVFAKLQkgKiAgICAgICAgIGNvbm5lY3Rpb24sIG9yIGlmIHRoZSBjbGllbnQgd2FzIGFscmVhZHkgdXAtdG8tZGF0ZS4KIAkgKiBAc2luY2UgNC4xCiAJICovCiAJcHVibGljIFBhY2tTdGF0aXN0aWNzIGdldFN0YXRpc3RpY3MoKSB7CkBAIC03NjcsMTggKzc5MCw1NiBAQCBwcml2YXRlIE1hcDxTdHJpbmcsIFJlZj4gZ2V0QWR2ZXJ0aXNlZE9yRGVmYXVsdFJlZnMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIHJlZnM7CiAJCX0KIAotCQlhZHZlcnRpc2VSZWZzSG9vay5hZHZlcnRpc2VSZWZzKHRoaXMpOworCQlpZiAoIWFkdmVydGlzZVJlZnNIb29rQ2FsbGVkKSB7CisJCQlhZHZlcnRpc2VSZWZzSG9vay5hZHZlcnRpc2VSZWZzKHRoaXMpOworCQkJYWR2ZXJ0aXNlUmVmc0hvb2tDYWxsZWQgPSB0cnVlOworCQl9CiAJCWlmIChyZWZzID09IG51bGwpIHsKLQkJCXNldEFkdmVydGlzZWRSZWZzKGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpKTsKKwkJCS8vIEZhbGwgYmFjayB0byBhbGwgcmVmcy4KKwkJCXNldEFkdmVydGlzZWRSZWZzKAorCQkJCQlkYi5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKS5zdHJlYW0oKQorCQkJCQkJLmNvbGxlY3QodG9NYXAoUmVmOjpnZXROYW1lLCBpZGVudGl0eSgpKSkpOwogCQl9CiAJCXJldHVybiByZWZzOwogCX0KIAorCXByaXZhdGUgTWFwPFN0cmluZywgUmVmPiBnZXRGaWx0ZXJlZFJlZnMoQ29sbGVjdGlvbjxTdHJpbmc+IHJlZlByZWZpeGVzKQorCQkJCQl0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAocmVmUHJlZml4ZXMuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gZ2V0QWR2ZXJ0aXNlZE9yRGVmYXVsdFJlZnMoKTsKKwkJfQorCQlpZiAocmVmcyA9PSBudWxsICYmICFhZHZlcnRpc2VSZWZzSG9va0NhbGxlZCkgeworCQkJYWR2ZXJ0aXNlUmVmc0hvb2suYWR2ZXJ0aXNlUmVmcyh0aGlzKTsKKwkJCWFkdmVydGlzZVJlZnNIb29rQ2FsbGVkID0gdHJ1ZTsKKwkJfQorCQlpZiAocmVmcyA9PSBudWxsKSB7CisJCQkvLyBGYXN0IHBhdGg6IHRoZSBhZHZlcnRpc2VkIHJlZnMgaG9vayBkaWQgbm90IHNldCBhZHZlcnRpc2VkIHJlZnMuCisJCQlNYXA8U3RyaW5nLCBSZWY+IHJzID0gbmV3IEhhc2hNYXA8PigpOworCQkJZm9yIChTdHJpbmcgcCA6IHJlZlByZWZpeGVzKSB7CisJCQkJZm9yIChSZWYgciA6IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmc0J5UHJlZml4KHApKSB7CisJCQkJCXJzLnB1dChyLmdldE5hbWUoKSwgcik7CisJCQkJfQorCQkJfQorCQkJaWYgKHJlZkZpbHRlciAhPSBSZWZGaWx0ZXIuREVGQVVMVCkgeworCQkJCXJldHVybiByZWZGaWx0ZXIuZmlsdGVyKHJzKTsKKwkJCX0KKwkJCXJldHVybiB0cmFuc2ZlckNvbmZpZy5nZXRSZWZGaWx0ZXIoKS5maWx0ZXIocnMpOworCQl9CisKKwkJLy8gU2xvdyBwYXRoOiBmaWx0ZXIgdGhlIHJlZnMgcHJvdmlkZWQgYnkgdGhlIGFkdmVydGlzZWQgcmVmcyBob29rLgorCQkvLyByZWZGaWx0ZXIgaGFzIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHJlZnMuCisJCXJldHVybiByZWZzLnZhbHVlcygpLnN0cmVhbSgpCisJCQkJLmZpbHRlcihyZWYgLT4gcmVmUHJlZml4ZXMuc3RyZWFtKCkKKwkJCQkJCS5hbnlNYXRjaChyZWYuZ2V0TmFtZSgpOjpzdGFydHNXaXRoKSkKKwkJCQkuY29sbGVjdCh0b01hcChSZWY6OmdldE5hbWUsIGlkZW50aXR5KCkpKTsKKwl9CisKIAlwcml2YXRlIHZvaWQgc2VydmljZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWJvb2xlYW4gc2VuZFBhY2sgPSBmYWxzZTsKIAkJLy8gSWYgaXQncyBhIG5vbi1iaWRpIHJlcXVlc3QsIHdlIG5lZWQgdG8gcmVhZCB0aGUgZW50aXJlIHJlcXVlc3QgYmVmb3JlCiAJCS8vIHdyaXRpbmcgYSByZXNwb25zZS4gQnVmZmVyIHRoZSByZXNwb25zZSB1bnRpbCB0aGVuLgogCQlQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvciBhY2N1bXVsYXRvciA9IG5ldyBQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvcigpOworCQlMaXN0PE9iamVjdElkPiB1bnNoYWxsb3dDb21taXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAJCXRyeSB7CiAJCQlpZiAoYmlEaXJlY3Rpb25hbFBpcGUpCiAJCQkJc2VuZEFkdmVydGlzZWRSZWZzKG5ldyBQYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlcihwY2tPdXQpKTsKQEAgLTgwOCw3ICs4NjksNyBAQCBlbHNlIGlmIChyZXF1ZXN0VmFsaWRhdG9yIGluc3RhbmNlb2YgQW55UmVxdWVzdFZhbGlkYXRvcikKIAkJCWlmICghY2xpZW50U2hhbGxvd0NvbW1pdHMuaXNFbXB0eSgpKQogCQkJCXZlcmlmeUNsaWVudFNoYWxsb3coKTsKIAkJCWlmIChkZXB0aCAhPSAwKQotCQkJCXByb2Nlc3NTaGFsbG93KCk7CisJCQkJcHJvY2Vzc1NoYWxsb3cobnVsbCwgdW5zaGFsbG93Q29tbWl0cywgdHJ1ZSk7CiAJCQlpZiAoIWNsaWVudFNoYWxsb3dDb21taXRzLmlzRW1wdHkoKSkKIAkJCQl3YWxrLmFzc3VtZVNoYWxsb3coY2xpZW50U2hhbGxvd0NvbW1pdHMpOwogCQkJc2VuZFBhY2sgPSBuZWdvdGlhdGUoYWNjdW11bGF0b3IpOwpAQCAtODYwLDggKzkyMSwyNzggQEAgZWxzZSBpZiAocmVxdWVzdFZhbGlkYXRvciBpbnN0YW5jZW9mIEFueVJlcXVlc3RWYWxpZGF0b3IpCiAJCQlyYXdPdXQuc3RvcEJ1ZmZlcmluZygpOwogCQl9CiAKLQkJaWYgKHNlbmRQYWNrKQotCQkJc2VuZFBhY2soYWNjdW11bGF0b3IpOworCQlpZiAoc2VuZFBhY2spIHsKKwkJCXNlbmRQYWNrKGFjY3VtdWxhdG9yLCByZWZzID09IG51bGwgPyBudWxsIDogcmVmcy52YWx1ZXMoKSwgdW5zaGFsbG93Q29tbWl0cyk7CisJCX0KKwl9CisKKwlwcml2YXRlIHZvaWQgbHNSZWZzVjIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlQYWNrZXRMaW5lT3V0UmVmQWR2ZXJ0aXNlciBhZHYgPSBuZXcgUGFja2V0TGluZU91dFJlZkFkdmVydGlzZXIocGNrT3V0KTsKKwkJU3RyaW5nIGxpbmU7CisJCUFycmF5TGlzdDxTdHJpbmc+IHJlZlByZWZpeGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWJvb2xlYW4gbmVlZFRvRmluZFN5bXJlZnMgPSBmYWxzZTsKKworCQlhZHYuc2V0VXNlUHJvdG9jb2xWMih0cnVlKTsKKworCQlsaW5lID0gcGNrSW4ucmVhZFN0cmluZygpOworCisJCS8vIEN1cnJlbnRseSwgd2UgZG8gbm90IHN1cHBvcnQgYW55IGNhcGFiaWxpdGllcywgc28gdGhlIG5leHQKKwkJLy8gbGluZSBpcyBERUxJTSBpZiB0aGVyZSBhcmUgYXJndW1lbnRzIG9yIEVORCBpZiBub3QuCisJCWlmIChsaW5lID09IFBhY2tldExpbmVJbi5ERUxJTSkgeworCQkJd2hpbGUgKChsaW5lID0gcGNrSW4ucmVhZFN0cmluZygpKSAhPSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQkJaWYgKGxpbmUuZXF1YWxzKCJwZWVsIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCQlhZHYuc2V0RGVyZWZUYWdzKHRydWUpOworCQkJCX0gZWxzZSBpZiAobGluZS5lcXVhbHMoInN5bXJlZnMiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCW5lZWRUb0ZpbmRTeW1yZWZzID0gdHJ1ZTsKKwkJCQl9IGVsc2UgaWYgKGxpbmUuc3RhcnRzV2l0aCgicmVmLXByZWZpeCAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJCXJlZlByZWZpeGVzLmFkZChsaW5lLnN1YnN0cmluZygicmVmLXByZWZpeCAiLmxlbmd0aCgpKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9IGVsc2UgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQKKwkJCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuZXhwZWN0ZWRQYWNrZXRMaW5lLCBsaW5lKSk7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgaWYgKGxpbmUgIT0gUGFja2V0TGluZUluLkVORCkgeworCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CisJCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5leHBlY3RlZFBhY2tldExpbmUsIGxpbmUpKTsKKwkJfQorCQlyYXdPdXQuc3RvcEJ1ZmZlcmluZygpOworCisJCU1hcDxTdHJpbmcsIFJlZj4gcmVmc1RvU2VuZCA9IGdldEZpbHRlcmVkUmVmcyhyZWZQcmVmaXhlcyk7CisKKwkJaWYgKG5lZWRUb0ZpbmRTeW1yZWZzKSB7CisJCQlmaW5kU3ltcmVmcyhhZHYsIHJlZnNUb1NlbmQpOworCQl9CisKKwkJYWR2LnNlbmQocmVmc1RvU2VuZCk7CisJCWFkdi5lbmQoKTsKKwl9CisKKwlwcml2YXRlIHZvaWQgZmV0Y2hWMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCW9wdGlvbnMgPSBuZXcgSGFzaFNldDw+KCk7CisKKwkJLy8gUGFja3MgYXJlIGFsd2F5cyBzZW50IG11bHRpcGxleGVkIGFuZCB1c2luZyBmdWxsIDY0SworCQkvLyBsZW5ndGhzLgorCQlvcHRpb25zLmFkZChPUFRJT05fU0lERV9CQU5EXzY0Syk7CisKKwkJLy8gRGVwZW5kaW5nIG9uIHRoZSByZXF1ZXN0VmFsaWRhdG9yLCAjcHJvY2Vzc0hhdmVMaW5lcyBtYXkKKwkJLy8gcmVxdWlyZSB0aGF0IGFkdmVydGlzZWQgYmUgc2V0LiBTZXQgaXQgb25seSBpbiB0aGUgcmVxdWlyZWQKKwkJLy8gY2lyY3Vtc3RhbmNlcyAodG8gYXZvaWQgYSBmdWxsIHJlZiBsb29rdXAgaW4gdGhlIGNhc2UgdGhhdAorCQkvLyB3ZSBkb24ndCBuZWVkIGl0KS4KKwkJaWYgKHJlcXVlc3RWYWxpZGF0b3IgaW5zdGFuY2VvZiBUaXBSZXF1ZXN0VmFsaWRhdG9yIHx8CisJCQkJcmVxdWVzdFZhbGlkYXRvciBpbnN0YW5jZW9mIFJlYWNoYWJsZUNvbW1pdFRpcFJlcXVlc3RWYWxpZGF0b3IgfHwKKwkJCQlyZXF1ZXN0VmFsaWRhdG9yIGluc3RhbmNlb2YgQW55UmVxdWVzdFZhbGlkYXRvcikgeworCQkJYWR2ZXJ0aXNlZCA9IENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisJCX0gZWxzZSB7CisJCQlhZHZlcnRpc2VkID0gcmVmSWRTZXQoZ2V0QWR2ZXJ0aXNlZE9yRGVmYXVsdFJlZnMoKS52YWx1ZXMoKSk7CisJCX0KKworCQlTdHJpbmcgbGluZTsKKwkJTGlzdDxPYmplY3RJZD4gcGVlckhhcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlib29sZWFuIGRvbmVSZWNlaXZlZCA9IGZhbHNlOworCisJCS8vIEN1cnJlbnRseSwgd2UgZG8gbm90IHN1cHBvcnQgYW55IGNhcGFiaWxpdGllcywgc28gdGhlIG5leHQKKwkJLy8gbGluZSBpcyBERUxJTS4KKwkJaWYgKChsaW5lID0gcGNrSW4ucmVhZFN0cmluZygpKSAhPSBQYWNrZXRMaW5lSW4uREVMSU0pIHsKKwkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkuZm9ybWF0KEpHaXRUZXh0LmdldCgpLnVuZXhwZWN0ZWRQYWNrZXRMaW5lLCBsaW5lKSk7CisJCX0KKworCQlib29sZWFuIGluY2x1ZGVUYWcgPSBmYWxzZTsKKwkJYm9vbGVhbiBmaWx0ZXJSZWNlaXZlZCA9IGZhbHNlOworCQl3aGlsZSAoKGxpbmUgPSBwY2tJbi5yZWFkU3RyaW5nKCkpICE9IFBhY2tldExpbmVJbi5FTkQpIHsKKwkJCWlmIChsaW5lLnN0YXJ0c1dpdGgoIndhbnQgIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCXdhbnRJZHMuYWRkKE9iamVjdElkLmZyb21TdHJpbmcobGluZS5zdWJzdHJpbmcoNSkpKTsKKwkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJoYXZlICIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQlwZWVySGFzLmFkZChPYmplY3RJZC5mcm9tU3RyaW5nKGxpbmUuc3Vic3RyaW5nKDUpKSk7CisJCQl9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKCJkb25lIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCWRvbmVSZWNlaXZlZCA9IHRydWU7CisJCQl9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKE9QVElPTl9USElOX1BBQ0spKSB7CisJCQkJb3B0aW9ucy5hZGQoT1BUSU9OX1RISU5fUEFDSyk7CisJCQl9IGVsc2UgaWYgKGxpbmUuZXF1YWxzKE9QVElPTl9OT19QUk9HUkVTUykpIHsKKwkJCQlvcHRpb25zLmFkZChPUFRJT05fTk9fUFJPR1JFU1MpOworCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscyhPUFRJT05fSU5DTFVERV9UQUcpKSB7CisJCQkJb3B0aW9ucy5hZGQoT1BUSU9OX0lOQ0xVREVfVEFHKTsKKwkJCQlpbmNsdWRlVGFnID0gdHJ1ZTsKKwkJCX0gZWxzZSBpZiAobGluZS5lcXVhbHMoT1BUSU9OX09GU19ERUxUQSkpIHsKKwkJCQlvcHRpb25zLmFkZChPUFRJT05fT0ZTX0RFTFRBKTsKKwkJCX0gZWxzZSBpZiAobGluZS5zdGFydHNXaXRoKCJzaGFsbG93ICIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCQljbGllbnRTaGFsbG93Q29tbWl0cy5hZGQoT2JqZWN0SWQuZnJvbVN0cmluZyhsaW5lLnN1YnN0cmluZyg4KSkpOworCQkJfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoImRlZXBlbiAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJZGVwdGggPSBJbnRlZ2VyLnBhcnNlSW50KGxpbmUuc3Vic3RyaW5nKDcpKTsKKwkJCQlpZiAoZGVwdGggPD0gMCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmludmFsaWREZXB0aCwKKwkJCQkJCQkJCUludGVnZXIudmFsdWVPZihkZXB0aCkpKTsKKwkJCQl9CisJCQkJaWYgKHNoYWxsb3dTaW5jZSAhPSAwKSB7CisJCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkuZGVlcGVuU2luY2VXaXRoRGVlcGVuKTsKKwkJCQl9CisJCQkJaWYgKHNoYWxsb3dFeGNsdWRlUmVmcyAhPSBudWxsKSB7CisJCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkuZGVlcGVuTm90V2l0aERlZXBlbik7CisJCQkJfQorCQkJfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoImRlZXBlbi1ub3QgIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCUxpc3Q8U3RyaW5nPiBleGNsdWRlID0gc2hhbGxvd0V4Y2x1ZGVSZWZzOworCQkJCWlmIChleGNsdWRlID09IG51bGwpIHsKKwkJCQkJZXhjbHVkZSA9IHNoYWxsb3dFeGNsdWRlUmVmcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCQkJCX0KKwkJCQlleGNsdWRlLmFkZChsaW5lLnN1YnN0cmluZygxMSkpOworCQkJCWlmIChkZXB0aCAhPSAwKSB7CisJCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oCisJCQkJCQkJSkdpdFRleHQuZ2V0KCkuZGVlcGVuTm90V2l0aERlZXBlbik7CisJCQkJfQorCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscyhPUFRJT05fREVFUEVOX1JFTEFUSVZFKSkgeworCQkJCW9wdGlvbnMuYWRkKE9QVElPTl9ERUVQRU5fUkVMQVRJVkUpOworCQkJfSBlbHNlIGlmIChsaW5lLnN0YXJ0c1dpdGgoImRlZXBlbi1zaW5jZSAiKSkgeyAvLyROT04tTkxTLTEkCisJCQkJc2hhbGxvd1NpbmNlID0gSW50ZWdlci5wYXJzZUludChsaW5lLnN1YnN0cmluZygxMykpOworCQkJCWlmIChzaGFsbG93U2luY2UgPD0gMCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJCU1lc3NhZ2VGb3JtYXQuZm9ybWF0KAorCQkJCQkJCQkJSkdpdFRleHQuZ2V0KCkuaW52YWxpZFRpbWVzdGFtcCwgbGluZSkpOworCQkJCX0KKwkJCQlpZiAoZGVwdGggIT0gIDApIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbigKKwkJCQkJCQlKR2l0VGV4dC5nZXQoKS5kZWVwZW5TaW5jZVdpdGhEZWVwZW4pOworCQkJCX0KKwkJCX0gZWxzZSBpZiAodHJhbnNmZXJDb25maWcuaXNBbGxvd0ZpbHRlcigpCisJCQkJCSYmIGxpbmUuc3RhcnRzV2l0aChPUFRJT05fRklMVEVSICsgJyAnKSkgeworCQkJCWlmIChmaWx0ZXJSZWNlaXZlZCkgeworCQkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLnRvb01hbnlGaWx0ZXJzKTsKKwkJCQl9CisJCQkJZmlsdGVyUmVjZWl2ZWQgPSB0cnVlOworCQkJCXBhcnNlRmlsdGVyKGxpbmUuc3Vic3RyaW5nKE9QVElPTl9GSUxURVIubGVuZ3RoKCkgKyAxKSk7CisJCQl9IGVsc2UgeworCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS51bmV4cGVjdGVkUGFja2V0TGluZSwgbGluZSkpOworCQkJfQorCQl9CisJCXJhd091dC5zdG9wQnVmZmVyaW5nKCk7CisKKwkJYm9vbGVhbiBzZWN0aW9uU2VudCA9IGZhbHNlOworCQlATnVsbGFibGUgTGlzdDxPYmplY3RJZD4gc2hhbGxvd0NvbW1pdHMgPSBudWxsOworCQlMaXN0PE9iamVjdElkPiB1bnNoYWxsb3dDb21taXRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKwkJaWYgKCFjbGllbnRTaGFsbG93Q29tbWl0cy5pc0VtcHR5KCkpIHsKKwkJCXZlcmlmeUNsaWVudFNoYWxsb3coKTsKKwkJfQorCQlpZiAoZGVwdGggIT0gMCB8fCBzaGFsbG93U2luY2UgIT0gMCB8fCBzaGFsbG93RXhjbHVkZVJlZnMgIT0gbnVsbCkgeworCQkJc2hhbGxvd0NvbW1pdHMgPSBuZXcgQXJyYXlMaXN0PE9iamVjdElkPigpOworCQkJcHJvY2Vzc1NoYWxsb3coc2hhbGxvd0NvbW1pdHMsIHVuc2hhbGxvd0NvbW1pdHMsIGZhbHNlKTsKKwkJfQorCQlpZiAoIWNsaWVudFNoYWxsb3dDb21taXRzLmlzRW1wdHkoKSkKKwkJCXdhbGsuYXNzdW1lU2hhbGxvdyhjbGllbnRTaGFsbG93Q29tbWl0cyk7CisKKwkJaWYgKGRvbmVSZWNlaXZlZCkgeworCQkJcHJvY2Vzc0hhdmVMaW5lcyhwZWVySGFzLCBPYmplY3RJZC56ZXJvSWQoKSwgbmV3IFBhY2tldExpbmVPdXQoTnVsbE91dHB1dFN0cmVhbS5JTlNUQU5DRSkpOworCQl9IGVsc2UgeworCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJhY2tub3dsZWRnbWVudHNcbiIpOyAvLyROT04tTkxTLTEkCisJCQlmb3IgKE9iamVjdElkIGlkIDogcGVlckhhcykgeworCQkJCWlmICh3YWxrLmdldE9iamVjdFJlYWRlcigpLmhhcyhpZCkpIHsKKwkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIGlkLmdldE5hbWUoKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQl9CisJCQl9CisJCQlwcm9jZXNzSGF2ZUxpbmVzKHBlZXJIYXMsIE9iamVjdElkLnplcm9JZCgpLCBuZXcgUGFja2V0TGluZU91dChOdWxsT3V0cHV0U3RyZWFtLklOU1RBTkNFKSk7CisJCQlpZiAob2tUb0dpdmVVcCgpKSB7CisJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJyZWFkeVxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0gZWxzZSBpZiAoY29tbW9uQmFzZS5pc0VtcHR5KCkpIHsKKwkJCQlwY2tPdXQud3JpdGVTdHJpbmcoIk5BS1xuIik7IC8vJE5PTi1OTFMtMSQKKwkJCX0KKwkJCXNlY3Rpb25TZW50ID0gdHJ1ZTsKKwkJfQorCisJCWlmIChkb25lUmVjZWl2ZWQgfHwgb2tUb0dpdmVVcCgpKSB7CisJCQlpZiAoc2hhbGxvd0NvbW1pdHMgIT0gbnVsbCkgeworCQkJCWlmIChzZWN0aW9uU2VudCkKKwkJCQkJcGNrT3V0LndyaXRlRGVsaW0oKTsKKwkJCQlwY2tPdXQud3JpdGVTdHJpbmcoInNoYWxsb3ctaW5mb1xuIik7IC8vJE5PTi1OTFMtMSQKKwkJCQlmb3IgKE9iamVjdElkIG8gOiBzaGFsbG93Q29tbWl0cykgeworCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoInNoYWxsb3cgIiArIG8uZ2V0TmFtZSgpICsgJ1xuJyk7IC8vJE5PTi1OTFMtMSQKKwkJCQl9CisJCQkJZm9yIChPYmplY3RJZCBvIDogdW5zaGFsbG93Q29tbWl0cykgeworCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoInVuc2hhbGxvdyAiICsgby5nZXROYW1lKCkgKyAnXG4nKTsgLy8kTk9OLU5MUy0xJAorCQkJCX0KKwkJCQlzZWN0aW9uU2VudCA9IHRydWU7CisJCQl9CisKKwkJCWlmIChzZWN0aW9uU2VudCkKKwkJCQlwY2tPdXQud3JpdGVEZWxpbSgpOworCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJwYWNrZmlsZVxuIik7IC8vJE5PTi1OTFMtMSQKKwkJCXNlbmRQYWNrKG5ldyBQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvcigpLAorCQkJCQlpbmNsdWRlVGFnCisJCQkJCQk/IGRiLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmc0J5UHJlZml4KFJfVEFHUykKKwkJCQkJCTogbnVsbCwKKwkJCQkJdW5zaGFsbG93Q29tbWl0cyk7CisJCX0KKwkJcGNrT3V0LmVuZCgpOworCX0KKworCS8qCisJICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3QgY29tbWFuZCBhbmQgd2Ugc2hvdWxkIHRlYXIgZG93biB0aGUKKwkgKiBjb25uZWN0aW9uLgorCSAqLworCXByaXZhdGUgYm9vbGVhbiBzZXJ2ZU9uZUNvbW1hbmRWMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCVN0cmluZyBjb21tYW5kOworCQl0cnkgeworCQkJY29tbWFuZCA9IHBja0luLnJlYWRTdHJpbmcoKTsKKwkJfSBjYXRjaCAoRU9GRXhjZXB0aW9uIGVvZikgeworCQkJLyogRU9GIHdoZW4gYXdhaXRpbmcgY29tbWFuZCBpcyBmaW5lICovCisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlpZiAoY29tbWFuZCA9PSBQYWNrZXRMaW5lSW4uRU5EKSB7CisJCQkvLyBBIGJsYW5rIHJlcXVlc3QgaXMgdmFsaWQgYWNjb3JkaW5nCisJCQkvLyB0byB0aGUgcHJvdG9jb2w7IGRvIG5vdGhpbmcgaW4gdGhpcworCQkJLy8gY2FzZS4KKwkJCXJldHVybiB0cnVlOworCQl9CisJCWlmIChjb21tYW5kLmVxdWFscygiY29tbWFuZD0iICsgQ09NTUFORF9MU19SRUZTKSkgeyAvLyROT04tTkxTLTEkCisJCQlsc1JlZnNWMigpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCWlmIChjb21tYW5kLmVxdWFscygiY29tbWFuZD0iICsgQ09NTUFORF9GRVRDSCkpIHsgLy8kTk9OLU5MUy0xJAorCQkJZmV0Y2hWMigpOworCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdAorCQkJCS5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5rbm93blRyYW5zcG9ydENvbW1hbmQsIGNvbW1hbmQpKTsKKwl9CisKKwlwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXRWMkNhcGFiaWxpdHlBZHZlcnRpc2VtZW50KCkgeworCQlBcnJheUxpc3Q8U3RyaW5nPiBjYXBzID0gbmV3IEFycmF5TGlzdDw+KCk7CisJCWNhcHMuYWRkKCJ2ZXJzaW9uIDIiKTsgLy8kTk9OLU5MUy0xJAorCQljYXBzLmFkZChDT01NQU5EX0xTX1JFRlMpOworCQljYXBzLmFkZCgKKwkJCQlDT01NQU5EX0ZFVENIICsgJz0nICsKKwkJCQkodHJhbnNmZXJDb25maWcuaXNBbGxvd0ZpbHRlcigpID8gT1BUSU9OX0ZJTFRFUiArICcgJyA6ICIiKSArIC8vJE5PTi1OTFMtMSQKKwkJCQlPUFRJT05fU0hBTExPVyk7CisJCXJldHVybiBjYXBzOworCX0KKworCXByaXZhdGUgdm9pZCBzZXJ2aWNlVjIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlpZiAoYmlEaXJlY3Rpb25hbFBpcGUpIHsKKwkJCS8vIEp1c3QgbGlrZSBpbiBzZXJ2aWNlKCksIHRoZSBjYXBhYmlsaXR5IGFkdmVydGlzZW1lbnQKKwkJCS8vIGlzIHNlbnQgb25seSBpZiB0aGlzIGlzIGEgYmlkaXJlY3Rpb25hbCBwaXBlLiAoSWYKKwkJCS8vIG5vdCwgdGhlIGNsaWVudCBpcyBleHBlY3RlZCB0byBjYWxsCisJCQkvLyBzZW5kQWR2ZXJ0aXNlZFJlZnMoKSBvbiBpdHMgb3duLikKKwkJCWZvciAoU3RyaW5nIHMgOiBnZXRWMkNhcGFiaWxpdHlBZHZlcnRpc2VtZW50KCkpIHsKKwkJCQlwY2tPdXQud3JpdGVTdHJpbmcocyArICJcbiIpOyAvLyROT04tTkxTLTEkCisJCQl9CisJCQlwY2tPdXQuZW5kKCk7CisKKwkJCXdoaWxlICghc2VydmVPbmVDb21tYW5kVjIoKSkgeworCQkJCS8vIFJlcGVhdCB1bnRpbCBhbiBlbXB0eSBjb21tYW5kIG9yIEVPRi4KKwkJCX0KKwkJCXJldHVybjsKKwkJfQorCisJCXRyeSB7CisJCQlzZXJ2ZU9uZUNvbW1hbmRWMigpOworCQl9IGZpbmFsbHkgeworCQkJd2hpbGUgKDAgPCByYXdJbi5za2lwKDIwNDgpIHx8IDAgPD0gcmF3SW4ucmVhZCgpKSB7CisJCQkJLy8gRGlzY2FyZCB1bnRpbCBFT0YuCisJCQl9CisJCQlyYXdPdXQuc3RvcEJ1ZmZlcmluZygpOworCQl9CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgU2V0PE9iamVjdElkPiByZWZJZFNldChDb2xsZWN0aW9uPFJlZj4gcmVmcykgewpAQCAtODc5LDcgKzEyMTAsMjMgQEAgcHJpdmF0ZSBzdGF0aWMgU2V0PE9iamVjdElkPiByZWZJZFNldChDb2xsZWN0aW9uPFJlZj4gcmVmcykgewogCQlyZXR1cm4gaWRzOwogCX0KIAotCXByaXZhdGUgdm9pZCBwcm9jZXNzU2hhbGxvdygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJLyoKKwkgKiBEZXRlcm1pbmVzIHdoYXQgInNoYWxsb3ciIGFuZCAidW5zaGFsbG93IiBsaW5lcyB0byBzZW5kIHRvIHRoZSB1c2VyLgorCSAqIFRoZSBpbmZvcm1hdGlvbiBpcyB3cml0dGVuIHRvIHNoYWxsb3dDb21taXRzIChpZiBub3QgbnVsbCkgYW5kCisJICogdW5zaGFsbG93Q29tbWl0cywgYW5kIGFsc28gd3JpdHRlbiB0byAjcGNrT3V0IChpZiB3cml0ZVRvUGNrT3V0IGlzCisJICogdHJ1ZSkuCisJICovCisJcHJpdmF0ZSB2b2lkIHByb2Nlc3NTaGFsbG93KEBOdWxsYWJsZSBMaXN0PE9iamVjdElkPiBzaGFsbG93Q29tbWl0cywKKwkJCUxpc3Q8T2JqZWN0SWQ+IHVuc2hhbGxvd0NvbW1pdHMsCisJCQlib29sZWFuIHdyaXRlVG9QY2tPdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJCWlmIChvcHRpb25zLmNvbnRhaW5zKE9QVElPTl9ERUVQRU5fUkVMQVRJVkUpIHx8CisJCQkJc2hhbGxvd1NpbmNlICE9IDAgfHwKKwkJCQlzaGFsbG93RXhjbHVkZVJlZnMgIT0gbnVsbCkgeworCQkJLy8gVE9ETyhqb25hdGhhbnRhbm15KTogSW1wbGVtZW50IGRlZXBlbi1yZWxhdGl2ZSwgZGVlcGVuLXNpbmNlLAorCQkJLy8gYW5kIGRlZXBlbi1ub3QuCisJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKwkJfQorCiAJCWludCB3YWxrRGVwdGggPSBkZXB0aCAtIDE7CiAJCXRyeSAoRGVwdGhXYWxrLlJldldhbGsgZGVwdGhXYWxrID0gbmV3IERlcHRoV2Fsay5SZXZXYWxrKAogCQkJCXdhbGsuZ2V0T2JqZWN0UmVhZGVyKCksIHdhbGtEZXB0aCkpIHsKQEAgLTkwMCwxOSArMTI0NywyOSBAQCBwcml2YXRlIHZvaWQgcHJvY2Vzc1NoYWxsb3coKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJCS8vIENvbW1pdHMgYXQgdGhlIGJvdW5kYXJ5IHdoaWNoIGFyZW4ndCBhbHJlYWR5IHNoYWxsb3cgaW4KIAkJCQkvLyB0aGUgY2xpZW50IG5lZWQgdG8gYmUgbWFya2VkIGFzIHN1Y2gKIAkJCQlpZiAoYy5nZXREZXB0aCgpID09IHdhbGtEZXB0aAotCQkJCQkJJiYgIWNsaWVudFNoYWxsb3dDb21taXRzLmNvbnRhaW5zKGMpKQotCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoInNoYWxsb3cgIiArIG8ubmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQkJJiYgIWNsaWVudFNoYWxsb3dDb21taXRzLmNvbnRhaW5zKGMpKSB7CisJCQkJCWlmIChzaGFsbG93Q29tbWl0cyAhPSBudWxsKSB7CisJCQkJCQlzaGFsbG93Q29tbWl0cy5hZGQoYy5jb3B5KCkpOworCQkJCQl9CisJCQkJCWlmICh3cml0ZVRvUGNrT3V0KSB7CisJCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoInNoYWxsb3cgIiArIG8ubmFtZSgpKTsgLy8kTk9OLU5MUy0xJAorCQkJCQl9CisJCQkJfQogCiAJCQkJLy8gQ29tbWl0cyBub3Qgb24gdGhlIGJvdW5kYXJ5IHdoaWNoIGFyZSBzaGFsbG93IGluIHRoZSBjbGllbnQKIAkJCQkvLyBuZWVkIHRvIGJlY29tZSB1bnNoYWxsb3dlZAogCQkJCWlmIChjLmdldERlcHRoKCkgPCB3YWxrRGVwdGgKIAkJCQkJCSYmIGNsaWVudFNoYWxsb3dDb21taXRzLnJlbW92ZShjKSkgewogCQkJCQl1bnNoYWxsb3dDb21taXRzLmFkZChjLmNvcHkoKSk7Ci0JCQkJCXBja091dC53cml0ZVN0cmluZygidW5zaGFsbG93ICIgKyBjLm5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJaWYgKHdyaXRlVG9QY2tPdXQpIHsKKwkJCQkJCXBja091dC53cml0ZVN0cmluZygidW5zaGFsbG93ICIgKyBjLm5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKKwkJCQkJfQogCQkJCX0KIAkJCX0KIAkJfQotCQlwY2tPdXQuZW5kKCk7CisJCWlmICh3cml0ZVRvUGNrT3V0KSB7CisJCQlwY2tPdXQuZW5kKCk7CisJCX0KIAl9CiAKIAlwcml2YXRlIHZvaWQgdmVyaWZ5Q2xpZW50U2hhbGxvdygpCkBAIC05NTAsMTQgKzEzMDcsNTAgQEAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNsaWVudFNoYWxsb3coKQogCSAqIEBwYXJhbSBhZHYKIAkgKiAgICAgICAgICAgIHRoZSBhZHZlcnRpc2VtZW50IGZvcm1hdHRlci4KIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICB0aGUgZm9ybWF0dGVyIGZhaWxlZCB0byB3cml0ZSBhbiBhZHZlcnRpc2VtZW50LgorCSAqICAgICAgICAgICAgdGhlIGZvcm1hdHRlciBmYWlsZWQgdG8gd3JpdGUgYW4gYWR2ZXJ0aXNlbWVudC4KIAkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlNlcnZpY2VNYXlOb3RDb250aW51ZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHRoZSBob29rIGRlbmllZCBhZHZlcnRpc2VtZW50LgorCSAqICAgICAgICAgICAgdGhlIGhvb2sgZGVuaWVkIGFkdmVydGlzZW1lbnQuCiAJICovCi0JcHVibGljIHZvaWQgc2VuZEFkdmVydGlzZWRSZWZzKGZpbmFsIFJlZkFkdmVydGlzZXIgYWR2KSB0aHJvd3MgSU9FeGNlcHRpb24sCisJcHVibGljIHZvaWQgc2VuZEFkdmVydGlzZWRSZWZzKFJlZkFkdmVydGlzZXIgYWR2KSB0aHJvd3MgSU9FeGNlcHRpb24sCiAJCQlTZXJ2aWNlTWF5Tm90Q29udGludWVFeGNlcHRpb24geworCQlzZW5kQWR2ZXJ0aXNlZFJlZnMoYWR2LCBudWxsKTsKKwl9CisKKwkvKioKKwkgKiBHZW5lcmF0ZSBhbiBhZHZlcnRpc2VtZW50IG9mIGF2YWlsYWJsZSByZWZzIGFuZCBjYXBhYmlsaXRpZXMuCisJICoKKwkgKiBAcGFyYW0gYWR2CisJICogICAgICAgICAgICB0aGUgYWR2ZXJ0aXNlbWVudCBmb3JtYXR0ZXIuCisJICogQHBhcmFtIHNlcnZpY2VOYW1lCisJICogICAgICAgICAgICBpZiBub3QgbnVsbCwgYWxzbyBvdXRwdXQgIiMgc2VydmljZT1zZXJ2aWNlTmFtZSIgZm9sbG93ZWQgYnkgYQorCSAqICAgICAgICAgICAgZmx1c2ggcGFja2V0IGJlZm9yZSB0aGUgYWR2ZXJ0aXNlbWVudC4gVGhpcyBpcyByZXF1aXJlZAorCSAqICAgICAgICAgICAgaW4gdjAgb2YgdGhlIEhUVFAgcHJvdG9jb2wsIGRlc2NyaWJlZCBpbiBHaXQncworCSAqICAgICAgICAgICAgRG9jdW1lbnRhdGlvbi90ZWNobmljYWwvaHR0cC1wcm90b2NvbC50eHQuCisJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgZm9ybWF0dGVyIGZhaWxlZCB0byB3cml0ZSBhbiBhZHZlcnRpc2VtZW50LgorCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uCisJICogICAgICAgICAgICB0aGUgaG9vayBkZW5pZWQgYWR2ZXJ0aXNlbWVudC4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHZvaWQgc2VuZEFkdmVydGlzZWRSZWZzKFJlZkFkdmVydGlzZXIgYWR2LAorCQkJQE51bGxhYmxlIFN0cmluZyBzZXJ2aWNlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uLAorCQkJU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uIHsKKwkJaWYgKHVzZVByb3RvY29sVjIoKSkgeworCQkJLy8gVGhlIGVxdWl2YWxlbnQgaW4gdjIgaXMgb25seSB0aGUgY2FwYWJpbGl0aWVzCisJCQkvLyBhZHZlcnRpc2VtZW50LgorCQkJZm9yIChTdHJpbmcgcyA6IGdldFYyQ2FwYWJpbGl0eUFkdmVydGlzZW1lbnQoKSkgeworCQkJCWFkdi53cml0ZU9uZShzKTsKKwkJCX0KKwkJCWFkdi5lbmQoKTsKKwkJCXJldHVybjsKKwkJfQorCiAJCU1hcDxTdHJpbmcsIFJlZj4gYWR2ZXJ0aXNlZE9yRGVmYXVsdFJlZnMgPSBnZXRBZHZlcnRpc2VkT3JEZWZhdWx0UmVmcygpOwogCisJCWlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7CisJCQlhZHYud3JpdGVPbmUoIiMgc2VydmljZT0iICsgc2VydmljZU5hbWUgKyAnXG4nKTsgLy8kTk9OLU5MUy0xJAorCQkJYWR2LmVuZCgpOworCQl9CiAJCWFkdi5pbml0KGRiKTsKIAkJYWR2LmFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX0lOQ0xVREVfVEFHKTsKIAkJYWR2LmFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX01VTFRJX0FDS19ERVRBSUxFRCk7CkBAIC05ODAsNiArMTM3Myw5IEBAIHB1YmxpYyB2b2lkIHNlbmRBZHZlcnRpc2VkUmVmcyhmaW5hbCBSZWZBZHZlcnRpc2VyIGFkdikgdGhyb3dzIElPRXhjZXB0aW9uLAogCQkJCXx8IHBvbGljeSA9PSBudWxsKQogCQkJYWR2LmFkdmVydGlzZUNhcGFiaWxpdHkoT1BUSU9OX0FMTE9XX1JFQUNIQUJMRV9TSEExX0lOX1dBTlQpOwogCQlhZHYuYWR2ZXJ0aXNlQ2FwYWJpbGl0eShPUFRJT05fQUdFTlQsIFVzZXJBZ2VudC5nZXQoKSk7CisJCWlmICh0cmFuc2ZlckNvbmZpZy5pc0FsbG93RmlsdGVyKCkpIHsKKwkJCWFkdi5hZHZlcnRpc2VDYXBhYmlsaXR5KE9QVElPTl9GSUxURVIpOworCQl9CiAJCWFkdi5zZXREZXJlZlRhZ3ModHJ1ZSk7CiAJCWZpbmRTeW1yZWZzKGFkdiwgYWR2ZXJ0aXNlZE9yRGVmYXVsdFJlZnMpOwogCQlhZHZlcnRpc2VkID0gYWR2LnNlbmQoYWR2ZXJ0aXNlZE9yRGVmYXVsdFJlZnMpOwpAQCAtMTAxNyw4ICsxNDEzLDM2IEBAIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0TWVzc2FnZU91dHB1dFN0cmVhbSgpIHsKIAkJcmV0dXJuIG1zZ091dDsKIAl9CiAKKwlwcml2YXRlIHZvaWQgcGFyc2VGaWx0ZXIoU3RyaW5nIGFyZykgdGhyb3dzIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiB7CisJCWlmIChhcmcuZXF1YWxzKCJibG9iOm5vbmUiKSkgeyAvLyROT04tTkxTLTEkCisJCQlmaWx0ZXJCbG9iTGltaXQgPSAwOworCQl9IGVsc2UgaWYgKGFyZy5zdGFydHNXaXRoKCJibG9iOmxpbWl0PSIpKSB7IC8vJE5PTi1OTFMtMSQKKwkJCXRyeSB7CisJCQkJZmlsdGVyQmxvYkxpbWl0ID0gTG9uZy5wYXJzZUxvbmcoCisJCQkJCQlhcmcuc3Vic3RyaW5nKCJibG9iOmxpbWl0PSIubGVuZ3RoKCkpKTsgLy8kTk9OLU5MUy0xJAorCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKwkJCQl0aHJvdyBuZXcgUGFja1Byb3RvY29sRXhjZXB0aW9uKAorCQkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZEZpbHRlciwKKwkJCQkJCQkJYXJnKSk7CisJCQl9CisJCX0KKwkJLyoKKwkJICogV2UgbXVzdCBoYXZlICgxKSBlaXRoZXIgImJsb2I6bm9uZSIgb3IKKwkJICogImJsb2I6bGltaXQ9IiBzZXQgKGJlY2F1c2Ugd2Ugb25seSBzdXBwb3J0CisJCSAqIGJsb2Igc2l6ZSBsaW1pdHMgZm9yIG5vdyksIGFuZCAoMikgaWYgdGhlCisJCSAqIGxhdHRlciwgdGhlbiBpdCBtdXN0IGJlIG5vbm5lZ2F0aXZlLiBUaHJvdworCQkgKiBpZiAoMSkgb3IgKDIpIGlzIG5vdCBtZXQuCisJCSAqLworCQlpZiAoZmlsdGVyQmxvYkxpbWl0IDwgMCkgeworCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbigKKwkJCQkJTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuaW52YWxpZEZpbHRlciwKKwkJCQkJCQlhcmcpKTsKKwkJfQorCX0KKwogCXByaXZhdGUgdm9pZCByZWN2V2FudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlib29sZWFuIGlzRmlyc3QgPSB0cnVlOworCQlib29sZWFuIGZpbHRlclJlY2VpdmVkID0gZmFsc2U7CiAJCWZvciAoOzspIHsKIAkJCVN0cmluZyBsaW5lOwogCQkJdHJ5IHsKQEAgLTEwNDcsNiArMTQ3MSwxOSBAQCBwcml2YXRlIHZvaWQgcmVjdldhbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCQljb250aW51ZTsKIAkJCX0KIAorCQkJaWYgKHRyYW5zZmVyQ29uZmlnLmlzQWxsb3dGaWx0ZXIoKQorCQkJCQkmJiBsaW5lLnN0YXJ0c1dpdGgoT1BUSU9OX0ZJTFRFUiArICIgIikpIHsgLy8kTk9OLU5MUy0xJAorCQkJCVN0cmluZyBhcmcgPSBsaW5lLnN1YnN0cmluZyhPUFRJT05fRklMVEVSLmxlbmd0aCgpICsgMSk7CisKKwkJCQlpZiAoZmlsdGVyUmVjZWl2ZWQpIHsKKwkJCQkJdGhyb3cgbmV3IFBhY2tQcm90b2NvbEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS50b29NYW55RmlsdGVycyk7CisJCQkJfQorCQkJCWZpbHRlclJlY2VpdmVkID0gdHJ1ZTsKKworCQkJCXBhcnNlRmlsdGVyKGFyZyk7CisJCQkJY29udGludWU7CisJCQl9CisKIAkJCWlmICghbGluZS5zdGFydHNXaXRoKCJ3YW50ICIpIHx8IGxpbmUubGVuZ3RoKCkgPCA0NSkgLy8kTk9OLU5MUy0xJAogCQkJCXRocm93IG5ldyBQYWNrUHJvdG9jb2xFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkuZXhwZWN0ZWRHb3QsICJ3YW50IiwgbGluZSkpOyAvLyROT04tTkxTLTEkCiAKQEAgLTExMTgsNyArMTU1NSw3IEBAIHByaXZhdGUgYm9vbGVhbiBuZWdvdGlhdGUoUGFja1N0YXRpc3RpY3MuQWNjdW11bGF0b3IgYWNjdW11bGF0b3IpCiAJCQl9CiAKIAkJCWlmIChsaW5lID09IFBhY2tldExpbmVJbi5FTkQpIHsKLQkJCQlsYXN0ID0gcHJvY2Vzc0hhdmVMaW5lcyhwZWVySGFzLCBsYXN0KTsKKwkJCQlsYXN0ID0gcHJvY2Vzc0hhdmVMaW5lcyhwZWVySGFzLCBsYXN0LCBwY2tPdXQpOwogCQkJCWlmIChjb21tb25CYXNlLmlzRW1wdHkoKSB8fCBtdWx0aUFjayAhPSBNdWx0aUFjay5PRkYpCiAJCQkJCXBja091dC53cml0ZVN0cmluZygiTkFLXG4iKTsgLy8kTk9OLU5MUy0xJAogCQkJCWlmIChub0RvbmUgJiYgc2VudFJlYWR5KSB7CkBAIC0xMTMzLDcgKzE1NzAsNyBAQCBwcml2YXRlIGJvb2xlYW4gbmVnb3RpYXRlKFBhY2tTdGF0aXN0aWNzLkFjY3VtdWxhdG9yIGFjY3VtdWxhdG9yKQogCQkJCXBlZXJIYXMuYWRkKE9iamVjdElkLmZyb21TdHJpbmcobGluZS5zdWJzdHJpbmcoNSkpKTsKIAkJCQlhY2N1bXVsYXRvci5oYXZlcysrOwogCQkJfSBlbHNlIGlmIChsaW5lLmVxdWFscygiZG9uZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlsYXN0ID0gcHJvY2Vzc0hhdmVMaW5lcyhwZWVySGFzLCBsYXN0KTsKKwkJCQlsYXN0ID0gcHJvY2Vzc0hhdmVMaW5lcyhwZWVySGFzLCBsYXN0LCBwY2tPdXQpOwogCiAJCQkJaWYgKGNvbW1vbkJhc2UuaXNFbXB0eSgpKQogCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoIk5BS1xuIik7IC8vJE5PTi1OTFMtMSQKQEAgLTExNDksNyArMTU4Niw3IEBAIGVsc2UgaWYgKG11bHRpQWNrICE9IE11bHRpQWNrLk9GRikKIAkJfQogCX0KIAotCXByaXZhdGUgT2JqZWN0SWQgcHJvY2Vzc0hhdmVMaW5lcyhMaXN0PE9iamVjdElkPiBwZWVySGFzLCBPYmplY3RJZCBsYXN0KQorCXByaXZhdGUgT2JqZWN0SWQgcHJvY2Vzc0hhdmVMaW5lcyhMaXN0PE9iamVjdElkPiBwZWVySGFzLCBPYmplY3RJZCBsYXN0LCBQYWNrZXRMaW5lT3V0IG91dCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXByZVVwbG9hZEhvb2sub25CZWdpbk5lZ290aWF0ZVJvdW5kKHRoaXMsIHdhbnRJZHMsIHBlZXJIYXMuc2l6ZSgpKTsKIAkJaWYgKHdhbnRBbGwuaXNFbXB0eSgpICYmICF3YW50SWRzLmlzRW1wdHkoKSkKQEAgLTExOTQsMTMgKzE2MzEsMTMgQEAgcHJpdmF0ZSBPYmplY3RJZCBwcm9jZXNzSGF2ZUxpbmVzKExpc3Q8T2JqZWN0SWQ+IHBlZXJIYXMsIE9iamVjdElkIGxhc3QpCiAJCQkJc3dpdGNoIChtdWx0aUFjaykgewogCQkJCWNhc2UgT0ZGOgogCQkJCQlpZiAoY29tbW9uQmFzZS5zaXplKCkgPT0gMSkKLQkJCQkJCXBja091dC53cml0ZVN0cmluZygiQUNLICIgKyBvYmoubmFtZSgpICsgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJb3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIG9iai5uYW1lKCkgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCWJyZWFrOwogCQkJCWNhc2UgQ09OVElOVUU6Ci0JCQkJCXBja091dC53cml0ZVN0cmluZygiQUNLICIgKyBvYmoubmFtZSgpICsgIiBjb250aW51ZVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQlvdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgb2JqLm5hbWUoKSArICIgY29udGludWVcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJYnJlYWs7CiAJCQkJY2FzZSBERVRBSUxFRDoKLQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIG9iai5uYW1lKCkgKyAiIGNvbW1vblxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQlvdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgb2JqLm5hbWUoKSArICIgY29tbW9uXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCWJyZWFrOwogCQkJCX0KIAkJCX0KQEAgLTEyMjYsMTAgKzE2NjMsMTAgQEAgcHJpdmF0ZSBPYmplY3RJZCBwcm9jZXNzSGF2ZUxpbmVzKExpc3Q8T2JqZWN0SWQ+IHBlZXJIYXMsIE9iamVjdElkIGxhc3QpCiAJCQkJCQljYXNlIE9GRjoKIAkJCQkJCQlicmVhazsKIAkJCQkJCWNhc2UgQ09OVElOVUU6Ci0JCQkJCQkJcGNrT3V0LndyaXRlU3RyaW5nKCJBQ0sgIiArIGlkLm5hbWUoKSArICIgY29udGludWVcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKKwkJCQkJCQlvdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgaWQubmFtZSgpICsgIiBjb250aW51ZVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJCQkJCWJyZWFrOwogCQkJCQkJY2FzZSBERVRBSUxFRDoKLQkJCQkJCQlwY2tPdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgaWQubmFtZSgpICsgIiByZWFkeVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAorCQkJCQkJCW91dC53cml0ZVN0cmluZygiQUNLICIgKyBpZC5uYW1lKCkgKyAiIHJlYWR5XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCQkJCQkJc2VudFJlYWR5ID0gdHJ1ZTsKIAkJCQkJCQlicmVhazsKIAkJCQkJCX0KQEAgLTEyNDEsNyArMTY3OCw3IEBAIHByaXZhdGUgT2JqZWN0SWQgcHJvY2Vzc0hhdmVMaW5lcyhMaXN0PE9iamVjdElkPiBwZWVySGFzLCBPYmplY3RJZCBsYXN0KQogCiAJCWlmIChtdWx0aUFjayA9PSBNdWx0aUFjay5ERVRBSUxFRCAmJiAhZGlkT2tUb0dpdmVVcCAmJiBva1RvR2l2ZVVwKCkpIHsKIAkJCU9iamVjdElkIGlkID0gcGVlckhhcy5nZXQocGVlckhhcy5zaXplKCkgLSAxKTsKLQkJCXBja091dC53cml0ZVN0cmluZygiQUNLICIgKyBpZC5uYW1lKCkgKyAiIHJlYWR5XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCisJCQlvdXQud3JpdGVTdHJpbmcoIkFDSyAiICsgaWQubmFtZSgpICsgIiByZWFkeVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAogCQkJc2VudFJlYWR5ID0gdHJ1ZTsKIAkJfQogCkBAIC0xMzM2LDcgKzE3NzMsNyBAQCBwdWJsaWMgdm9pZCBjaGVja1dhbnRzKFVwbG9hZFBhY2sgdXAsIExpc3Q8T2JqZWN0SWQ+IHdhbnRzKQogCQkJCW5ldyBSZWFjaGFibGVDb21taXRUaXBSZXF1ZXN0VmFsaWRhdG9yKCkuY2hlY2tXYW50cyh1cCwgd2FudHMpOwogCQkJZWxzZSBpZiAoIXdhbnRzLmlzRW1wdHkoKSkgewogCQkJCVNldDxPYmplY3RJZD4gcmVmSWRzID0KLQkJCQkJcmVmSWRTZXQodXAuZ2V0UmVwb3NpdG9yeSgpLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcyhBTEwpLnZhbHVlcygpKTsKKwkJCQkJCXJlZklkU2V0KHVwLmdldFJlcG9zaXRvcnkoKS5nZXRSZWZEYXRhYmFzZSgpLmdldFJlZnMoKSk7CiAJCQkJZm9yIChPYmplY3RJZCBvYmogOiB3YW50cykgewogCQkJCQlpZiAoIXJlZklkcy5jb250YWlucyhvYmopKQogCQkJCQkJdGhyb3cgbmV3IFdhbnROb3RWYWxpZEV4Y2VwdGlvbihvYmopOwpAQCAtMTM1Niw3ICsxNzkzLDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWFjaGFibGVDb21taXRUaXBSZXF1ZXN0VmFsaWRhdG9yCiAJCXB1YmxpYyB2b2lkIGNoZWNrV2FudHMoVXBsb2FkUGFjayB1cCwgTGlzdDxPYmplY3RJZD4gd2FudHMpCiAJCQkJdGhyb3dzIFBhY2tQcm90b2NvbEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQkJY2hlY2tOb3RBZHZlcnRpc2VkV2FudHModXAsIHdhbnRzLAotCQkJCQlyZWZJZFNldCh1cC5nZXRSZXBvc2l0b3J5KCkuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCkudmFsdWVzKCkpKTsKKwkJCQkJcmVmSWRTZXQodXAuZ2V0UmVwb3NpdG9yeSgpLmdldFJlZkRhdGFiYXNlKCkuZ2V0UmVmcygpKSk7CiAJCX0KIAl9CiAKQEAgLTE0MzksNyArMTg3Niw3IEBAIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tOb3RBZHZlcnRpc2VkV2FudHMoVXBsb2FkUGFjayB1cCwKIAkJfQogCX0KIAotCXByaXZhdGUgdm9pZCBhZGRDb21tb25CYXNlKGZpbmFsIFJldk9iamVjdCBvKSB7CisJcHJpdmF0ZSB2b2lkIGFkZENvbW1vbkJhc2UoUmV2T2JqZWN0IG8pIHsKIAkJaWYgKCFvLmhhcyhDT01NT04pKSB7CiAJCQlvLmFkZChDT01NT04pOwogCQkJY29tbW9uQmFzZS5hZGQobyk7CkBAIC0xNDY4LDcgKzE5MDUsNyBAQCBwcml2YXRlIGJvb2xlYW4gb2tUb0dpdmVVcEltcCgpIHRocm93cyBQYWNrUHJvdG9jb2xFeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIHdhbnRTYXRpc2ZpZWQoZmluYWwgUmV2T2JqZWN0IHdhbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSBib29sZWFuIHdhbnRTYXRpc2ZpZWQoUmV2T2JqZWN0IHdhbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICh3YW50LmhhcyhTQVRJU0ZJRUQpKQogCQkJcmV0dXJuIHRydWU7CiAKQEAgLTE0ODksMTMgKzE5MjYsMjkgQEAgcHJpdmF0ZSBib29sZWFuIHdhbnRTYXRpc2ZpZWQoZmluYWwgUmV2T2JqZWN0IHdhbnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgc2VuZFBhY2soUGFja1N0YXRpc3RpY3MuQWNjdW11bGF0b3IgYWNjdW11bGF0b3IpCi0JCQl0aHJvd3MgSU9FeGNlcHRpb24geworCS8qKgorCSAqIFNlbmQgdGhlIHJlcXVlc3RlZCBvYmplY3RzIHRvIHRoZSBjbGllbnQuCisJICoKKwkgKiBAcGFyYW0gYWNjdW11bGF0b3IKKwkgKiAgICAgICAgICAgICAgICB3aGVyZSB0byB3cml0ZSBzdGF0aXN0aWNzIGFib3V0IHRoZSBjb250ZW50IG9mIHRoZSBwYWNrLgorCSAqIEBwYXJhbSBhbGxUYWdzCisJICogICAgICAgICAgICAgICAgcmVmcyB0byBzZWFyY2ggZm9yIGFubm90YXRlZCB0YWdzIHRvIGluY2x1ZGUgaW4gdGhlIHBhY2sKKwkgKiAgICAgICAgICAgICAgICBpZiB0aGUge0BsaW5rICNPUFRJT05fSU5DTFVERV9UQUd9IGNhcGFiaWxpdHkgd2FzCisJICogICAgICAgICAgICAgICAgcmVxdWVzdGVkLgorCSAqIEBwYXJhbSB1bnNoYWxsb3dDb21taXRzCisJICogICAgICAgICAgICAgICAgc2hhbGxvdyBjb21taXRzIG9uIHRoZSBjbGllbnQgdGhhdCBhcmUgbm93IGJlY29taW5nCisJICogICAgICAgICAgICAgICAgdW5zaGFsbG93CisJICogQHRocm93cyBJT0V4Y2VwdGlvbgorCSAqICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VyZWQgd2hpbGUgZ2VuZXJhdGluZyBvciB3cml0aW5nIHRoZSBwYWNrLgorCSAqLworCXByaXZhdGUgdm9pZCBzZW5kUGFjayhQYWNrU3RhdGlzdGljcy5BY2N1bXVsYXRvciBhY2N1bXVsYXRvciwKKwkJCUBOdWxsYWJsZSBDb2xsZWN0aW9uPFJlZj4gYWxsVGFncywKKwkJCUxpc3Q8T2JqZWN0SWQ+IHVuc2hhbGxvd0NvbW1pdHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIGJvb2xlYW4gc2lkZWJhbmQgPSBvcHRpb25zLmNvbnRhaW5zKE9QVElPTl9TSURFX0JBTkQpCiAJCQkJfHwgb3B0aW9ucy5jb250YWlucyhPUFRJT05fU0lERV9CQU5EXzY0Syk7CiAJCWlmIChzaWRlYmFuZCkgewogCQkJdHJ5IHsKLQkJCQlzZW5kUGFjayh0cnVlLCBhY2N1bXVsYXRvcik7CisJCQkJc2VuZFBhY2sodHJ1ZSwgYWNjdW11bGF0b3IsIGFsbFRhZ3MsIHVuc2hhbGxvd0NvbW1pdHMpOwogCQkJfSBjYXRjaCAoU2VydmljZU1heU5vdENvbnRpbnVlRXhjZXB0aW9uIG5vUGFjaykgewogCQkJCS8vIFRoaXMgd2FzIGFscmVhZHkgcmVwb3J0ZWQgb24gKGJlbG93KS4KIAkJCQl0aHJvdyBub1BhY2s7CkBAIC0xNTE2LDcgKzE5NjksNyBAQCBwcml2YXRlIHZvaWQgc2VuZFBhY2soUGFja1N0YXRpc3RpY3MuQWNjdW11bGF0b3IgYWNjdW11bGF0b3IpCiAJCQkJCXRocm93IGVycjsKIAkJCX0KIAkJfSBlbHNlIHsKLQkJCXNlbmRQYWNrKGZhbHNlLCBhY2N1bXVsYXRvcik7CisJCQlzZW5kUGFjayhmYWxzZSwgYWNjdW11bGF0b3IsIGFsbFRhZ3MsIHVuc2hhbGxvd0NvbW1pdHMpOwogCQl9CiAJfQogCkBAIC0xNTM2LDkgKzE5ODksMjggQEAgcHJpdmF0ZSBib29sZWFuIHJlcG9ydEludGVybmFsU2VydmVyRXJyb3JPdmVyU2lkZWJhbmQoKSB7CiAJCX0KIAl9CiAKLQlAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorCS8qKgorCSAqIFNlbmQgdGhlIHJlcXVlc3RlZCBvYmplY3RzIHRvIHRoZSBjbGllbnQuCisJICoKKwkgKiBAcGFyYW0gc2lkZWJhbmQKKwkgKiAgICAgICAgICAgICAgICB3aGV0aGVyIHRvIHdyYXAgdGhlIHBhY2sgaW4gc2lkZS1iYW5kIHBrdC1saW5lcywKKwkgKiAgICAgICAgICAgICAgICBpbnRlcmxlYXZlZCB3aXRoIHByb2dyZXNzIG1lc3NhZ2VzIGFuZCBlcnJvcnMuCisJICogQHBhcmFtIGFjY3VtdWxhdG9yCisJICogICAgICAgICAgICAgICAgd2hlcmUgdG8gd3JpdGUgc3RhdGlzdGljcyBhYm91dCB0aGUgY29udGVudCBvZiB0aGUgcGFjay4KKwkgKiBAcGFyYW0gYWxsVGFncworCSAqICAgICAgICAgICAgICAgIHJlZnMgdG8gc2VhcmNoIGZvciBhbm5vdGF0ZWQgdGFncyB0byBpbmNsdWRlIGluIHRoZSBwYWNrCisJICogICAgICAgICAgICAgICAgaWYgdGhlIHtAbGluayAjT1BUSU9OX0lOQ0xVREVfVEFHfSBjYXBhYmlsaXR5IHdhcworCSAqICAgICAgICAgICAgICAgIHJlcXVlc3RlZC4KKwkgKiBAcGFyYW0gdW5zaGFsbG93Q29tbWl0cworCSAqICAgICAgICAgICAgICAgIHNoYWxsb3cgY29tbWl0cyBvbiB0aGUgY2xpZW50IHRoYXQgYXJlIG5vdyBiZWNvbWluZworCSAqICAgICAgICAgICAgICAgIHVuc2hhbGxvdworCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKwkgKiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cmVkIHdoaWxlIGdlbmVyYXRpbmcgb3Igd3JpdGluZyB0aGUgcGFjay4KKwkgKi8KIAlwcml2YXRlIHZvaWQgc2VuZFBhY2soZmluYWwgYm9vbGVhbiBzaWRlYmFuZCwKLQkJCVBhY2tTdGF0aXN0aWNzLkFjY3VtdWxhdG9yIGFjY3VtdWxhdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJUGFja1N0YXRpc3RpY3MuQWNjdW11bGF0b3IgYWNjdW11bGF0b3IsCisJCQlATnVsbGFibGUgQ29sbGVjdGlvbjxSZWY+IGFsbFRhZ3MsCisJCQlMaXN0PE9iamVjdElkPiB1bnNoYWxsb3dDb21taXRzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlQcm9ncmVzc01vbml0b3IgcG0gPSBOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFOwogCQlPdXRwdXRTdHJlYW0gcGFja091dCA9IHJhd091dDsKIApAQCAtMTU3OSwxMSArMjA1MSwxOCBAQCBwcml2YXRlIHZvaWQgc2VuZFBhY2soZmluYWwgYm9vbGVhbiBzaWRlYmFuZCwKIAkJUGFja0NvbmZpZyBjZmcgPSBwYWNrQ29uZmlnOwogCQlpZiAoY2ZnID09IG51bGwpCiAJCQljZmcgPSBuZXcgUGFja0NvbmZpZyhkYik7CisJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIFBhY2tXcml0ZXIgaXMgcmVmZXJlbmNlZCBpbiB0aGUgZmluYWxseQorCQkJCQkJCQkJCS8vIGJsb2NrLCBhbmQgaXMgY2xvc2VkIHRoZXJlCiAJCWZpbmFsIFBhY2tXcml0ZXIgcHcgPSBuZXcgUGFja1dyaXRlcihjZmcsIHdhbGsuZ2V0T2JqZWN0UmVhZGVyKCksCiAJCQkJYWNjdW11bGF0b3IpOwogCQl0cnkgewogCQkJcHcuc2V0SW5kZXhEaXNhYmxlZCh0cnVlKTsKLQkJCXB3LnNldFVzZUNhY2hlZFBhY2tzKHRydWUpOworCQkJaWYgKGZpbHRlckJsb2JMaW1pdCA+PSAwKSB7CisJCQkJcHcuc2V0RmlsdGVyQmxvYkxpbWl0KGZpbHRlckJsb2JMaW1pdCk7CisJCQkJcHcuc2V0VXNlQ2FjaGVkUGFja3MoZmFsc2UpOworCQkJfSBlbHNlIHsKKwkJCQlwdy5zZXRVc2VDYWNoZWRQYWNrcyh0cnVlKTsKKwkJCX0KIAkJCXB3LnNldFVzZUJpdG1hcHMoZGVwdGggPT0gMCAmJiBjbGllbnRTaGFsbG93Q29tbWl0cy5pc0VtcHR5KCkpOwogCQkJcHcuc2V0Q2xpZW50U2hhbGxvd0NvbW1pdHMoY2xpZW50U2hhbGxvd0NvbW1pdHMpOwogCQkJcHcuc2V0UmV1c2VEZWx0YUNvbW1pdHModHJ1ZSk7CkBAIC0xNTkxLDYgKzIwNzAsOCBAQCBwcml2YXRlIHZvaWQgc2VuZFBhY2soZmluYWwgYm9vbGVhbiBzaWRlYmFuZCwKIAkJCXB3LnNldFRoaW4ob3B0aW9ucy5jb250YWlucyhPUFRJT05fVEhJTl9QQUNLKSk7CiAJCQlwdy5zZXRSZXVzZVZhbGlkYXRpbmdPYmplY3RzKGZhbHNlKTsKIAorCQkJLy8gT2JqZWN0cyBuYW1lZCBkaXJlY3RseSBieSByZWZlcmVuY2VzIGdvIGF0IHRoZSBiZWdpbm5pbmcKKwkJCS8vIG9mIHRoZSBwYWNrLgogCQkJaWYgKGNvbW1vbkJhc2UuaXNFbXB0eSgpICYmIHJlZnMgIT0gbnVsbCkgewogCQkJCVNldDxPYmplY3RJZD4gdGFnVGFyZ2V0cyA9IG5ldyBIYXNoU2V0PD4oKTsKIAkJCQlmb3IgKFJlZiByZWYgOiByZWZzLnZhbHVlcygpKSB7CkBAIC0xNjIxLDggKzIxMDIsOCBAQCBlbHNlIGlmIChyZWYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoQ29uc3RhbnRzLlJfSEVBRFMpKQogCQkJCXJ3ID0gb3c7CiAJCQl9CiAKLQkJCWlmIChvcHRpb25zLmNvbnRhaW5zKE9QVElPTl9JTkNMVURFX1RBRykgJiYgcmVmcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChSZWYgcmVmIDogcmVmcy52YWx1ZXMoKSkgeworCQkJaWYgKG9wdGlvbnMuY29udGFpbnMoT1BUSU9OX0lOQ0xVREVfVEFHKSAmJiBhbGxUYWdzICE9IG51bGwpIHsKKwkJCQlmb3IgKFJlZiByZWYgOiBhbGxUYWdzKSB7CiAJCQkJCU9iamVjdElkIG9iamVjdElkID0gcmVmLmdldE9iamVjdElkKCk7CiAJCQkJCWlmIChvYmplY3RJZCA9PSBudWxsKSB7CiAJCQkJCQkvLyBza2lwIHVuYm9ybiBicmFuY2gKQEAgLTE2NDAsNyArMjEyMSw3IEBAIGVsc2UgaWYgKHJlZi5nZXROYW1lKCkuc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUykpCiAJCQkJCX0KIAogCQkJCQlpZiAoIXJlZi5pc1BlZWxlZCgpKQotCQkJCQkJcmVmID0gZGIucGVlbChyZWYpOworCQkJCQkJcmVmID0gZGIuZ2V0UmVmRGF0YWJhc2UoKS5wZWVsKHJlZik7CiAKIAkJCQkJT2JqZWN0SWQgcGVlbGVkSWQgPSByZWYuZ2V0UGVlbGVkT2JqZWN0SWQoKTsKIAkJCQkJb2JqZWN0SWQgPSByZWYuZ2V0T2JqZWN0SWQoKTsKQEAgLTE2NjUsNyArMjE0Niw2IEBAIGVsc2UgaWYgKHJlZi5nZXROYW1lKCkuc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUykpCiAJCQlzdGF0aXN0aWNzID0gcHcuZ2V0U3RhdGlzdGljcygpOwogCQkJaWYgKHN0YXRpc3RpY3MgIT0gbnVsbCkgewogCQkJCXBvc3RVcGxvYWRIb29rLm9uUG9zdFVwbG9hZChzdGF0aXN0aWNzKTsKLQkJCQlsb2dnZXIub25QYWNrU3RhdGlzdGljcyhuZXcgUGFja1dyaXRlci5TdGF0aXN0aWNzKHN0YXRpc3RpY3MpKTsKIAkJCX0KIAkJCXB3LmNsb3NlKCk7CiAJCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tMb2dnZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tMb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjExNDE4ZC4uMDAwMDAwMAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExLCBHb29nbGUgSW5jLgotICogYW5kIG90aGVyIGNvcHlyaWdodCBvd25lcnMgYXMgZG9jdW1lbnRlZCBpbiB0aGUgcHJvamVjdCdzIElQIGxvZy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZQotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYxLjAgd2hpY2gKLSAqIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBpcyByZXByb2R1Y2VkIGJlbG93LCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAKLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKLSAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZwotICogY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCBJbmMuIG5vciB0aGUKLSAqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogICB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECi0gKiBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjay5QYWNrV3JpdGVyOwotCi0vKioKLSAqIExvZ3MgYWN0aXZpdHkgdGhhdCBvY2N1cnJlZCB3aXRoaW4KLSAqIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5VcGxvYWRQYWNrfS4KLSAqIDxwPgotICogSW1wbGVtZW50b3JzIG9mIHRoZSBpbnRlcmZhY2UgYXJlIHJlc3BvbnNpYmxlIGZvciBhc3NvY2lhdGluZyB0aGUgY3VycmVudAotICogdGhyZWFkIHRvIGEgcGFydGljdWxhciBjb25uZWN0aW9uLCBpZiB0aGV5IG5lZWQgdG8gYWxzbyBpbmNsdWRlIGNvbm5lY3Rpb24KLSAqIGluZm9ybWF0aW9uLiBPbmUgbWV0aG9kIGlzIHRvIHVzZSBhIHtAbGluayBqYXZhLmxhbmcuVGhyZWFkTG9jYWx9IHRvIHJlbWVtYmVyCi0gKiB0aGUgY29ubmVjdGlvbiBpbmZvcm1hdGlvbiBiZWZvcmUgaW52b2tpbmcgVXBsb2FkUGFjay4KLSAqCi0gKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlBvc3RVcGxvYWRIb29rfSBpbnN0ZWFkCi0gKi8KLUBEZXByZWNhdGVkCi1wdWJsaWMgaW50ZXJmYWNlIFVwbG9hZFBhY2tMb2dnZXIgeyAvLyBUT0RPIHJlbW92ZSBpbiBKR2l0IDUuMAotCS8qKiBBIHNpbXBsZSBuby1vcCBsb2dnZXIuICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBVcGxvYWRQYWNrTG9nZ2VyIE5VTEwgPSBuZXcgVXBsb2FkUGFja0xvZ2dlcigpIHsKLQkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIG9uUGFja1N0YXRpc3RpY3MoUGFja1dyaXRlci5TdGF0aXN0aWNzIHN0YXRzKSB7Ci0JCQkvLyBEbyBub3RoaW5nLgotCQl9Ci0JfTsKLQotCS8qKgotCSAqIE5vdGljZSB0byB0aGUgbG9nZ2VyIGFmdGVyIGEgcGFjayBoYXMgYmVlbiBzZW50LgotCSAqCi0JICogQHBhcmFtIHN0YXRzCi0JICogICAgICAgICAgICB0aGUgc3RhdGlzdGljcyBhZnRlciBzZW5kaW5nIGEgcGFjayB0byB0aGUgY2xpZW50LgotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgdm9pZCBvblBhY2tTdGF0aXN0aWNzKFBhY2tXcml0ZXIuU3RhdGlzdGljcyBzdGF0cyk7Ci19CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9VcGxvYWRQYWNrTG9nZ2VyQ2hhaW4uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tMb2dnZXJDaGFpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTE0NjcyLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1VwbG9hZFBhY2tMb2dnZXJDaGFpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSwgR29vZ2xlIEluYy4KLSAqIGFuZCBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHByb2plY3QncyBJUCBsb2cuCi0gKgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCi0gKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKLSAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCi0gKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAotICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0gKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmludGVybmFsLnN0b3JhZ2UucGFjay5QYWNrV3JpdGVyOwotCi0vKioKLSAqIFVwbG9hZFBhY2tMb2dnZXIgdGhhdCBkZWxlZ2F0ZXMgdG8gYSBsaXN0IG9mIG90aGVyIGxvZ2dlcnMuCi0gKiA8cD4KLSAqIGxvZ2dlcnMgYXJlIHJ1biBpbiB0aGUgb3JkZXIgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLSAqCi0gKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlBvc3RVcGxvYWRIb29rQ2hhaW59Ci0gKiAgICAgICAgICAgICBpbnN0ZWFkLgotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIFVwbG9hZFBhY2tMb2dnZXJDaGFpbiBpbXBsZW1lbnRzIFVwbG9hZFBhY2tMb2dnZXIgewotCXByaXZhdGUgZmluYWwgVXBsb2FkUGFja0xvZ2dlcltdIGxvZ2dlcnM7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgY291bnQ7Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgbG9nZ2VyIGNoYWluaW5nIHRoZSBnaXZlbiBsb2dnZXJzIHRvZ2V0aGVyLgotCSAqCi0JICogQHBhcmFtIGxvZ2dlcnMKLQkgKiAgICAgICAgICAgIGxvZ2dlcnMgdG8gZXhlY3V0ZSwgaW4gb3JkZXIuCi0JICogQHJldHVybiBhIG5ldyBsb2dnZXIgY2hhaW4gb2YgdGhlIGdpdmVuIGxvZ2dlcnMuCi0JICovCi0JcHVibGljIHN0YXRpYyBVcGxvYWRQYWNrTG9nZ2VyIG5ld0NoYWluKAotCQkJTGlzdDw/IGV4dGVuZHMgVXBsb2FkUGFja0xvZ2dlcj4gbG9nZ2VycykgewotCQlVcGxvYWRQYWNrTG9nZ2VyW10gbmV3TG9nZ2VycyA9IG5ldyBVcGxvYWRQYWNrTG9nZ2VyW2xvZ2dlcnMuc2l6ZSgpXTsKLQkJaW50IGkgPSAwOwotCQlmb3IgKFVwbG9hZFBhY2tMb2dnZXIgbG9nZ2VyIDogbG9nZ2VycykKLQkJCWlmIChsb2dnZXIgIT0gVXBsb2FkUGFja0xvZ2dlci5OVUxMKQotCQkJCW5ld0xvZ2dlcnNbaSsrXSA9IGxvZ2dlcjsKLQkJaWYgKGkgPT0gMCkKLQkJCXJldHVybiBVcGxvYWRQYWNrTG9nZ2VyLk5VTEw7Ci0JCWVsc2UgaWYgKGkgPT0gMSkKLQkJCXJldHVybiBuZXdMb2dnZXJzWzBdOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IFVwbG9hZFBhY2tMb2dnZXJDaGFpbihuZXdMb2dnZXJzLCBpKTsKLQl9Ci0KLQkvKioge0Bpbmhlcml0RG9jfSAqLwotCUBPdmVycmlkZQotCXB1YmxpYyB2b2lkIG9uUGFja1N0YXRpc3RpY3MoUGFja1dyaXRlci5TdGF0aXN0aWNzIHN0YXRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLQkJCWxvZ2dlcnNbaV0ub25QYWNrU3RhdGlzdGljcyhzdGF0cyk7Ci0JfQotCi0JcHJpdmF0ZSBVcGxvYWRQYWNrTG9nZ2VyQ2hhaW4oVXBsb2FkUGFja0xvZ2dlcltdIGxvZ2dlcnMsIGludCBjb3VudCkgewotCQl0aGlzLmxvZ2dlcnMgPSBsb2dnZXJzOwotCQl0aGlzLmNvdW50ID0gY291bnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0VuY3J5cHRpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtFbmNyeXB0aW9uLmphdmEKaW5kZXggNjE1ZTQ2Yi4uYjQyNDhlZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0VuY3J5cHRpb24uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRW5jcnlwdGlvbi5qYXZhCkBAIC0xMjgsNyArMTI4LDcgQEAgcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVJbXBsKGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIHUsIGZpbmFsIFN0cmluZyBwcmVmaXgsCiAJCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoSkdpdFRleHQuZ2V0KCkudW5zdXBwb3J0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtLCB2KSk7CiAJfQogCi0JSU9FeGNlcHRpb24gZXJyb3IoZmluYWwgVGhyb3dhYmxlIHdoeSkgeworCUlPRXhjZXB0aW9uIGVycm9yKFRocm93YWJsZSB3aHkpIHsKIAkJcmV0dXJuIG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0CiAJCQkJLmZvcm1hdChKR2l0VGV4dC5nZXQoKS5lbmNyeXB0aW9uRXJyb3IsCiAJCQkJd2h5LmdldE1lc3NhZ2UoKSksIHdoeSk7CkBAIC0xNDEsNyArMTQxLDcgQEAgdm9pZCByZXF1ZXN0KEh0dHBVUkxDb25uZWN0aW9uIHUsIFN0cmluZyBwcmVmaXgpIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIHZhbGlkYXRlKGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIHUsIGZpbmFsIFN0cmluZyBwcmVmaXgpCisJCXZvaWQgdmFsaWRhdGUoSHR0cFVSTENvbm5lY3Rpb24gdSwgU3RyaW5nIHByZWZpeCkKIAkJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJdmFsaWRhdGVJbXBsKHUsIHByZWZpeCwgIiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCiAJCX0KQEAgLTI0MCwxOSArMjQwLDE5IEBAIHN0YXRpYyBjbGFzcyBKZXRTM3RWMiBleHRlbmRzIFdhbGtFbmNyeXB0aW9uIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQl2b2lkIHJlcXVlc3QoZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gdSwgZmluYWwgU3RyaW5nIHByZWZpeCkgeworCQl2b2lkIHJlcXVlc3QoSHR0cFVSTENvbm5lY3Rpb24gdSwgU3RyaW5nIHByZWZpeCkgewogCQkJdS5zZXRSZXF1ZXN0UHJvcGVydHkocHJlZml4ICsgSkVUUzNUX0NSWVBUT19WRVIsIENSWVBUT19WRVIpOwogCQkJdS5zZXRSZXF1ZXN0UHJvcGVydHkocHJlZml4ICsgSkVUUzNUX0NSWVBUT19BTEcsIGNyeXB0b0FsZyk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJdm9pZCB2YWxpZGF0ZShmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiB1LCBmaW5hbCBTdHJpbmcgcHJlZml4KQorCQl2b2lkIHZhbGlkYXRlKEh0dHBVUkxDb25uZWN0aW9uIHUsIFN0cmluZyBwcmVmaXgpCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCXZhbGlkYXRlSW1wbCh1LCBwcmVmaXgsIENSWVBUT19WRVIsIGNyeXB0b0FsZyk7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJT3V0cHV0U3RyZWFtIGVuY3J5cHQoZmluYWwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlPdXRwdXRTdHJlYW0gZW5jcnlwdChPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQl0cnkgewogCQkJCWZpbmFsIENpcGhlciBjaXBoZXIgPSBJbnNlY3VyZUNpcGhlckZhY3RvcnkuY3JlYXRlKGNyeXB0b0FsZyk7CiAJCQkJY2lwaGVyLmluaXQoQ2lwaGVyLkVOQ1JZUFRfTU9ERSwgc2VjcmV0S2V5LCBwYXJhbVNwZWMpOwpAQCAtMjYzLDcgKzI2Myw3IEBAIE91dHB1dFN0cmVhbSBlbmNyeXB0KGZpbmFsIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlJbnB1dFN0cmVhbSBkZWNyeXB0KGZpbmFsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQlJbnB1dFN0cmVhbSBkZWNyeXB0KElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJdHJ5IHsKIAkJCQlmaW5hbCBDaXBoZXIgY2lwaGVyID0gSW5zZWN1cmVDaXBoZXJGYWN0b3J5LmNyZWF0ZShjcnlwdG9BbGcpOwogCQkJCWNpcGhlci5pbml0KENpcGhlci5ERUNSWVBUX01PREUsIHNlY3JldEtleSwgcGFyYW1TcGVjKTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtGZXRjaENvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtGZXRjaENvbm5lY3Rpb24uamF2YQppbmRleCA2NzA4OTY0Li45MzA3OTE0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrRmV0Y2hDb25uZWN0aW9uLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvV2Fsa0ZldGNoQ29ubmVjdGlvbi5qYXZhCkBAIC00NCw4ICs0NCw2IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQ7CiAKLWltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVmRGF0YWJhc2UuQUxMOwotCiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKQEAgLTU4LDcgKzU2LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuQ29tcG91bmRFeGNlcHRpb247CkBAIC0xOTAsNyArMTg3LDcgQEAgY2xhc3MgV2Fsa0ZldGNoQ29ubmVjdGlvbiBleHRlbmRzIEJhc2VGZXRjaENvbm5lY3Rpb24gewogCS8qKiBJbnNlcnRlciB0byByZWFkIG9iamVjdHMgZnJvbSB7QGxpbmsgI2xvY2FsfS4gKi8KIAlwcml2YXRlIGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXI7CiAKLQlXYWxrRmV0Y2hDb25uZWN0aW9uKGZpbmFsIFdhbGtUcmFuc3BvcnQgdCwgZmluYWwgV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIHcpIHsKKwlXYWxrRmV0Y2hDb25uZWN0aW9uKFdhbGtUcmFuc3BvcnQgdCwgV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIHcpIHsKIAkJVHJhbnNwb3J0IHd0ID0gKFRyYW5zcG9ydCl0OwogCQlsb2NhbCA9IHd0LmxvY2FsOwogCQlvYmpDaGVjayA9IHd0LmdldE9iamVjdENoZWNrZXIoKTsKQEAgLTI1OSw3ICsyNTYsNyBAQCBwdWJsaWMgQ29sbGVjdGlvbjxQYWNrTG9jaz4gZ2V0UGFja0xvY2tzKCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBzZXRQYWNrTG9ja01lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKwlwdWJsaWMgdm9pZCBzZXRQYWNrTG9ja01lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKIAkJbG9ja01lc3NhZ2UgPSBtZXNzYWdlOwogCX0KIApAQCAtMjY4LDE4ICsyNjUsMTggQEAgcHVibGljIHZvaWQgc2V0UGFja0xvY2tNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CiAJcHVibGljIHZvaWQgY2xvc2UoKSB7CiAJCWluc2VydGVyLmNsb3NlKCk7CiAJCXJlYWRlci5jbG9zZSgpOwotCQlmb3IgKGZpbmFsIFJlbW90ZVBhY2sgcCA6IHVuZmV0Y2hlZFBhY2tzKSB7CisJCWZvciAoUmVtb3RlUGFjayBwIDogdW5mZXRjaGVkUGFja3MpIHsKIAkJCWlmIChwLnRtcElkeCAhPSBudWxsKQogCQkJCXAudG1wSWR4LmRlbGV0ZSgpOwogCQl9Ci0JCWZvciAoZmluYWwgV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIHIgOiByZW1vdGVzKQorCQlmb3IgKFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSByIDogcmVtb3RlcykKIAkJCXIuY2xvc2UoKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgcXVldWVXYW50cyhmaW5hbCBDb2xsZWN0aW9uPFJlZj4gd2FudCkKKwlwcml2YXRlIHZvaWQgcXVldWVXYW50cyhDb2xsZWN0aW9uPFJlZj4gd2FudCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlmaW5hbCBIYXNoU2V0PE9iamVjdElkPiBpbldvcmtRdWV1ZSA9IG5ldyBIYXNoU2V0PD4oKTsKLQkJZm9yIChmaW5hbCBSZWYgciA6IHdhbnQpIHsKKwkJZm9yIChSZWYgciA6IHdhbnQpIHsKIAkJCWZpbmFsIE9iamVjdElkIGlkID0gci5nZXRPYmplY3RJZCgpOwogCQkJaWYgKGlkID09IG51bGwpIHsKIAkJCQl0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCkBAIC0zMDIsNyArMjk5LDcgQEAgcHJpdmF0ZSB2b2lkIHF1ZXVlV2FudHMoZmluYWwgQ29sbGVjdGlvbjxSZWY+IHdhbnQpCiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgcHJvY2VzcyhmaW5hbCBPYmplY3RJZCBpZCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIHByb2Nlc3MoT2JqZWN0SWQgaWQpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlmaW5hbCBSZXZPYmplY3Qgb2JqOwogCQl0cnkgewogCQkJaWYgKGlkIGluc3RhbmNlb2YgUmV2T2JqZWN0KSB7CkBAIC0zNDIsNyArMzM5LDcgQEAgcHJpdmF0ZSB2b2lkIHByb2Nlc3MoZmluYWwgT2JqZWN0SWQgaWQpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlmZXRjaEVycm9ycy5yZW1vdmUoaWQpOwogCX0KIAotCXByaXZhdGUgdm9pZCBwcm9jZXNzQmxvYihmaW5hbCBSZXZPYmplY3Qgb2JqKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwlwcml2YXRlIHZvaWQgcHJvY2Vzc0Jsb2IoUmV2T2JqZWN0IG9iaikgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlpZiAocmVhZGVyLmhhcyhvYmosIENvbnN0YW50cy5PQkpfQkxPQikpCiAJCQkJb2JqLmFkZChDT01QTEVURSk7CkBAIC0zNTYsNyArMzUzLDcgQEAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NCbG9iKGZpbmFsIFJldk9iamVjdCBvYmopIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NUcmVlKGZpbmFsIFJldk9iamVjdCBvYmopIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBwcm9jZXNzVHJlZShSZXZPYmplY3Qgb2JqKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCXRyZWVXYWxrLnJlc2V0KG9iaik7CiAJCQl3aGlsZSAodHJlZVdhbGsubmV4dCgpKSB7CkBAIC0zODQsMjIgKzM4MSwyMiBAQCBwcml2YXRlIHZvaWQgcHJvY2Vzc1RyZWUoZmluYWwgUmV2T2JqZWN0IG9iaikgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCW9iai5hZGQoQ09NUExFVEUpOwogCX0KIAotCXByaXZhdGUgdm9pZCBwcm9jZXNzQ29tbWl0KGZpbmFsIFJldk9iamVjdCBvYmopIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCXByaXZhdGUgdm9pZCBwcm9jZXNzQ29tbWl0KFJldk9iamVjdCBvYmopIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlmaW5hbCBSZXZDb21taXQgY29tbWl0ID0gKFJldkNvbW1pdCkgb2JqOwogCQltYXJrTG9jYWxDb21taXRzQ29tcGxldGUoY29tbWl0LmdldENvbW1pdFRpbWUoKSk7CiAJCW5lZWRzKGNvbW1pdC5nZXRUcmVlKCkpOwotCQlmb3IgKGZpbmFsIFJldkNvbW1pdCBwIDogY29tbWl0LmdldFBhcmVudHMoKSkKKwkJZm9yIChSZXZDb21taXQgcCA6IGNvbW1pdC5nZXRQYXJlbnRzKCkpCiAJCQluZWVkcyhwKTsKIAkJb2JqLmFkZChDT01QTEVURSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NUYWcoZmluYWwgUmV2T2JqZWN0IG9iaikgeworCXByaXZhdGUgdm9pZCBwcm9jZXNzVGFnKFJldk9iamVjdCBvYmopIHsKIAkJZmluYWwgUmV2VGFnIHRhZyA9IChSZXZUYWcpIG9iajsKIAkJbmVlZHModGFnLmdldE9iamVjdCgpKTsKIAkJb2JqLmFkZChDT01QTEVURSk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG5lZWRzKGZpbmFsIFJldk9iamVjdCBvYmopIHsKKwlwcml2YXRlIHZvaWQgbmVlZHMoUmV2T2JqZWN0IG9iaikgewogCQlpZiAob2JqLmhhcyhDT01QTEVURSkpCiAJCQlyZXR1cm47CiAJCWlmICghb2JqLmhhcyhJTl9XT1JLX1FVRVVFKSkgewpAQCAtNDA4LDcgKzQwNSw3IEBAIHByaXZhdGUgdm9pZCBuZWVkcyhmaW5hbCBSZXZPYmplY3Qgb2JqKSB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgZG93bmxvYWRPYmplY3QoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHBtLCBmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlwcml2YXRlIHZvaWQgZG93bmxvYWRPYmplY3QoUHJvZ3Jlc3NNb25pdG9yIHBtLCBBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQlpZiAoYWxyZWFkeUhhdmUoaWQpKQogCQkJcmV0dXJuOwpAQCAtNDYyLDcgKzQ1OSw3IEBAIHByaXZhdGUgdm9pZCBkb3dubG9hZE9iamVjdChmaW5hbCBQcm9ncmVzc01vbml0b3IgcG0sIGZpbmFsIEFueU9iamVjdElkIGlkKQogCiAJCQkJaWYgKHBhY2tOYW1lTGlzdCA9PSBudWxsIHx8IHBhY2tOYW1lTGlzdC5pc0VtcHR5KCkpCiAJCQkJCWNvbnRpbnVlOwotCQkJCWZvciAoZmluYWwgU3RyaW5nIHBhY2tOYW1lIDogcGFja05hbWVMaXN0KSB7CisJCQkJZm9yIChTdHJpbmcgcGFja05hbWUgOiBwYWNrTmFtZUxpc3QpIHsKIAkJCQkJaWYgKHBhY2tzQ29uc2lkZXJlZC5hZGQocGFja05hbWUpKQogCQkJCQkJdW5mZXRjaGVkUGFja3MuYWRkKG5ldyBSZW1vdGVQYWNrKHdyciwgcGFja05hbWUpKTsKIAkJCQl9CkBAIC00NzQsNyArNDcxLDcgQEAgcHJpdmF0ZSB2b2lkIGRvd25sb2FkT2JqZWN0KGZpbmFsIFByb2dyZXNzTW9uaXRvciBwbSwgZmluYWwgQW55T2JqZWN0SWQgaWQpCiAJCQkvLwogCQkJQ29sbGVjdGlvbjxXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2U+IGFsID0gZXhwYW5kT25lQWx0ZXJuYXRlKGlkLCBwbSk7CiAJCQlpZiAoYWwgIT0gbnVsbCAmJiAhYWwuaXNFbXB0eSgpKSB7Ci0JCQkJZm9yIChmaW5hbCBXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgYWx0IDogYWwpIHsKKwkJCQlmb3IgKFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBhbHQgOiBhbCkgewogCQkJCQlyZW1vdGVzLmFkZChhbHQpOwogCQkJCQlub1BhY2tzWWV0LmFkZChhbHQpOwogCQkJCQlub0FsdGVybmF0ZXNZZXQuYWRkKGFsdCk7CkBAIC00OTgsNyArNDk1LDcgQEAgcHJpdmF0ZSB2b2lkIGRvd25sb2FkT2JqZWN0KGZpbmFsIFByb2dyZXNzTW9uaXRvciBwbSwgZmluYWwgQW55T2JqZWN0SWQgaWQpCiAJCX0KIAl9CiAKLQlwcml2YXRlIGJvb2xlYW4gYWxyZWFkeUhhdmUoZmluYWwgQW55T2JqZWN0SWQgaWQpIHRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24geworCXByaXZhdGUgYm9vbGVhbiBhbHJlYWR5SGF2ZShBbnlPYmplY3RJZCBpZCkgdGhyb3dzIFRyYW5zcG9ydEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gcmVhZGVyLmhhcyhpZCk7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGVycm9yKSB7CkBAIC02ODksMjEgKzY4NiwyMSBAQCBwcml2YXRlIENvbGxlY3Rpb248V2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlPiBleHBhbmRPbmVBbHRlcm5hdGUoCiAJCXJldHVybiBudWxsOwogCX0KIAotCXByaXZhdGUgdm9pZCBtYXJrTG9jYWxSZWZzQ29tcGxldGUoZmluYWwgU2V0PE9iamVjdElkPiBoYXZlKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKLQkJTWFwPFN0cmluZywgUmVmPiByZWZzOworCXByaXZhdGUgdm9pZCBtYXJrTG9jYWxSZWZzQ29tcGxldGUoU2V0PE9iamVjdElkPiBoYXZlKSB0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKKwkJTGlzdDxSZWY+IHJlZnM7CiAJCXRyeSB7Ci0JCQlyZWZzID0gbG9jYWwuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKEFMTCk7CisJCQlyZWZzID0gbG9jYWwuZ2V0UmVmRGF0YWJhc2UoKS5nZXRSZWZzKCk7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKIAkJCXRocm93IG5ldyBUcmFuc3BvcnRFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCksIGUpOwogCQl9Ci0JCWZvciAoZmluYWwgUmVmIHIgOiByZWZzLnZhbHVlcygpKSB7CisJCWZvciAoUmVmIHIgOiByZWZzKSB7CiAJCQl0cnkgewogCQkJCW1hcmtMb2NhbE9iakNvbXBsZXRlKHJldldhbGsucGFyc2VBbnkoci5nZXRPYmplY3RJZCgpKSk7CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiByZWFkRXJyb3IpIHsKIAkJCQl0aHJvdyBuZXcgVHJhbnNwb3J0RXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmxvY2FsUmVmSXNNaXNzaW5nT2JqZWN0cywgci5nZXROYW1lKCkpLCByZWFkRXJyb3IpOwogCQkJfQogCQl9Ci0JCWZvciAoZmluYWwgT2JqZWN0SWQgaWQgOiBoYXZlKSB7CisJCWZvciAoT2JqZWN0SWQgaWQgOiBoYXZlKSB7CiAJCQl0cnkgewogCQkJCW1hcmtMb2NhbE9iakNvbXBsZXRlKHJldldhbGsucGFyc2VBbnkoaWQpKTsKIAkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIHJlYWRFcnJvcikgewpAQCAtNzMyLDcgKzcyOSw3IEBAIHByaXZhdGUgdm9pZCBtYXJrTG9jYWxPYmpDb21wbGV0ZShSZXZPYmplY3Qgb2JqKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIG1hcmtMb2NhbENvbW1pdHNDb21wbGV0ZShmaW5hbCBpbnQgdW50aWwpCisJcHJpdmF0ZSB2b2lkIG1hcmtMb2NhbENvbW1pdHNDb21wbGV0ZShpbnQgdW50aWwpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWZvciAoOzspIHsKQEAgLTc0Miw3ICs3MzksNyBAQCBwcml2YXRlIHZvaWQgbWFya0xvY2FsQ29tbWl0c0NvbXBsZXRlKGZpbmFsIGludCB1bnRpbCkKIAkJCQlsb2NhbENvbW1pdFF1ZXVlLm5leHQoKTsKIAogCQkJCW1hcmtUcmVlQ29tcGxldGUoYy5nZXRUcmVlKCkpOwotCQkJCWZvciAoZmluYWwgUmV2Q29tbWl0IHAgOiBjLmdldFBhcmVudHMoKSkKKwkJCQlmb3IgKFJldkNvbW1pdCBwIDogYy5nZXRQYXJlbnRzKCkpCiAJCQkJCXB1c2hMb2NhbENvbW1pdChwKTsKIAkJCX0KIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7CkBAIC03NTAsNyArNzQ3LDcgQEAgcHJpdmF0ZSB2b2lkIG1hcmtMb2NhbENvbW1pdHNDb21wbGV0ZShmaW5hbCBpbnQgdW50aWwpCiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgcHVzaExvY2FsQ29tbWl0KGZpbmFsIFJldkNvbW1pdCBwKQorCXByaXZhdGUgdm9pZCBwdXNoTG9jYWxDb21taXQoUmV2Q29tbWl0IHApCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlpZiAocC5oYXMoTE9DQUxMWV9TRUVOKSkKIAkJCXJldHVybjsKQEAgLTc2MSw3ICs3NTgsNyBAQCBwcml2YXRlIHZvaWQgcHVzaExvY2FsQ29tbWl0KGZpbmFsIFJldkNvbW1pdCBwKQogCQlsb2NhbENvbW1pdFF1ZXVlLmFkZChwKTsKIAl9CiAKLQlwcml2YXRlIHZvaWQgbWFya1RyZWVDb21wbGV0ZShmaW5hbCBSZXZUcmVlIHRyZWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJpdmF0ZSB2b2lkIG1hcmtUcmVlQ29tcGxldGUoUmV2VHJlZSB0cmVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAodHJlZS5oYXMoQ09NUExFVEUpKQogCQkJcmV0dXJuOwogCQl0cmVlLmFkZChDT01QTEVURSk7CkBAIC03OTUsNyArNzkyLDcgQEAgcHJpdmF0ZSB2b2lkIG1hcmtUcmVlQ29tcGxldGUoZmluYWwgUmV2VHJlZSB0cmVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHJlY29yZEVycm9yKGZpbmFsIEFueU9iamVjdElkIGlkLCBmaW5hbCBUaHJvd2FibGUgd2hhdCkgeworCXByaXZhdGUgdm9pZCByZWNvcmRFcnJvcihBbnlPYmplY3RJZCBpZCwgVGhyb3dhYmxlIHdoYXQpIHsKIAkJZmluYWwgT2JqZWN0SWQgb2JqSWQgPSBpZC5jb3B5KCk7CiAJCUxpc3Q8VGhyb3dhYmxlPiBlcnJvcnMgPSBmZXRjaEVycm9ycy5nZXQob2JqSWQpOwogCQlpZiAoZXJyb3JzID09IG51bGwpIHsKQEAgLTgxNiw3ICs4MTMsNyBAQCBwcml2YXRlIGNsYXNzIFJlbW90ZVBhY2sgewogCiAJCVBhY2tJbmRleCBpbmRleDsKIAotCQlSZW1vdGVQYWNrKGZpbmFsIFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZSBjLCBmaW5hbCBTdHJpbmcgcG4pIHsKKwkJUmVtb3RlUGFjayhXYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UgYywgU3RyaW5nIHBuKSB7CiAJCQljb25uZWN0aW9uID0gYzsKIAkJCXBhY2tOYW1lID0gcG47CiAJCQlpZHhOYW1lID0gcGFja05hbWUuc3Vic3RyaW5nKDAsIHBhY2tOYW1lLmxlbmd0aCgpIC0gNSkgKyAiLmlkeCI7IC8vJE5PTi1OTFMtMSQKQEAgLTgzNCw3ICs4MzEsNyBAQCBwcml2YXRlIGNsYXNzIFJlbW90ZVBhY2sgewogCQkJfQogCQl9CiAKLQkJdm9pZCBvcGVuSW5kZXgoZmluYWwgUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQl2b2lkIG9wZW5JbmRleChQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlpZiAoaW5kZXggIT0gbnVsbCkKIAkJCQlyZXR1cm47CiAJCQlpZiAodG1wSWR4ID09IG51bGwpCkBAIC04NTMsMTcgKzg1MCwxMiBAQCBlbHNlIGlmICh0bXBJZHguaXNGaWxlKCkpIHsKIAkJCXBtLmJlZ2luVGFzaygiR2V0ICIgKyBpZHhOYW1lLnN1YnN0cmluZygwLCAxMikgKyAiLi5pZHgiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKIAkJCQkJcy5sZW5ndGggPCAwID8gUHJvZ3Jlc3NNb25pdG9yLlVOS05PV04KIAkJCQkJCQk6IChpbnQpIChzLmxlbmd0aCAvIDEwMjQpKTsKLQkJCXRyeSB7Ci0JCQkJZmluYWwgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0bXBJZHgpOwotCQkJCXRyeSB7Ci0JCQkJCWZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCQkJaW50IGNudDsKLQkJCQkJd2hpbGUgKCFwbS5pc0NhbmNlbGxlZCgpICYmIChjbnQgPSBzLmluLnJlYWQoYnVmKSkgPj0gMCkgewotCQkJCQkJZm9zLndyaXRlKGJ1ZiwgMCwgY250KTsKLQkJCQkJCXBtLnVwZGF0ZShjbnQgLyAxMDI0KTsKLQkJCQkJfQotCQkJCX0gZmluYWxseSB7Ci0JCQkJCWZvcy5jbG9zZSgpOworCQkJdHJ5IChGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcElkeCkpIHsKKwkJCQlmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbMjA0OF07CisJCQkJaW50IGNudDsKKwkJCQl3aGlsZSAoIXBtLmlzQ2FuY2VsbGVkKCkgJiYgKGNudCA9IHMuaW4ucmVhZChidWYpKSA+PSAwKSB7CisJCQkJCWZvcy53cml0ZShidWYsIDAsIGNudCk7CisJCQkJCXBtLnVwZGF0ZShjbnQgLyAxMDI0KTsKIAkJCQl9CiAJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlcnIpIHsKIAkJCQlGaWxlVXRpbHMuZGVsZXRlKHRtcElkeCk7CkBAIC04ODYsNyArODc4LDcgQEAgZWxzZSBpZiAodG1wSWR4LmlzRmlsZSgpKSB7CiAJCQl9CiAJCX0KIAotCQl2b2lkIGRvd25sb2FkUGFjayhmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJdm9pZCBkb3dubG9hZFBhY2soUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCQlTdHJpbmcgbmFtZSA9ICJwYWNrLyIgKyBwYWNrTmFtZTsgLy8kTk9OLU5MUy0xJAogCQkJV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlLkZpbGVTdHJlYW0gcyA9IGNvbm5lY3Rpb24ub3BlbihuYW1lKTsKIAkJCXRyeSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUHVzaENvbm5lY3Rpb24uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtQdXNoQ29ubmVjdGlvbi5qYXZhCmluZGV4IGNmNTBjNTEuLjRjNzU0MjUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtQdXNoQ29ubmVjdGlvbi5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtQdXNoQ29ubmVjdGlvbi5qYXZhCkBAIC0xNTcsNyArMTU3LDcgQEAgcHVibGljIHZvaWQgcHVzaChmaW5hbCBQcm9ncmVzc01vbml0b3IgbW9uaXRvciwKIAkJLy8gcmVmIHVzaW5nIHRoZSBkaXJlY3RvcnkgbmFtZSBiZWluZyBjcmVhdGVkLgogCQkvLwogCQlmaW5hbCBMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1IDogcmVmVXBkYXRlcy52YWx1ZXMoKSkgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1IDogcmVmVXBkYXRlcy52YWx1ZXMoKSkgewogCQkJZmluYWwgU3RyaW5nIG4gPSB1LmdldFJlbW90ZU5hbWUoKTsKIAkJCWlmICghbi5zdGFydHNXaXRoKCJyZWZzLyIpIHx8ICFSZXBvc2l0b3J5LmlzVmFsaWRSZWZOYW1lKG4pKSB7IC8vJE5PTi1OTFMtMSQKIAkJCQl1LnNldFN0YXR1cyhTdGF0dXMuUkVKRUNURURfT1RIRVJfUkVBU09OKTsKQEAgLTE3Nyw3ICsxNzcsNyBAQCBwdWJsaWMgdm9pZCBwdXNoKGZpbmFsIFByb2dyZXNzTW9uaXRvciBtb25pdG9yLAogCQkvLwogCQlpZiAoIXVwZGF0ZXMuaXNFbXB0eSgpKQogCQkJc2VuZHBhY2sodXBkYXRlcywgbW9uaXRvcik7Ci0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHUgOiB1cGRhdGVzKQorCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1IDogdXBkYXRlcykKIAkJCXVwZGF0ZUNvbW1hbmQodSk7CiAKIAkJLy8gSXMgdGhpcyBhIG5ldyByZXBvc2l0b3J5PyBJZiBzbyB3ZSBzaG91bGQgY3JlYXRlIGFkZGl0aW9uYWwKQEAgLTE5NiwxMCArMTk2LDEwIEBAIHByb3RlY3RlZCB2b2lkIHdyaXRlRmlsZShTdHJpbmcgZmlsZSwgYnl0ZVtdIGNvbnRlbnQpCiAJCWlmICghcGFja2VkUmVmVXBkYXRlcy5pc0VtcHR5KCkpIHsKIAkJCXRyeSB7CiAJCQkJcmVmV3JpdGVyLndyaXRlUGFja2VkUmVmcygpOwotCQkJCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHUgOiBwYWNrZWRSZWZVcGRhdGVzKQorCQkJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHUgOiBwYWNrZWRSZWZVcGRhdGVzKQogCQkJCQl1LnNldFN0YXR1cyhTdGF0dXMuT0spOwogCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyKSB7Ci0JCQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgdSA6IHBhY2tlZFJlZlVwZGF0ZXMpIHsKKwkJCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1IDogcGFja2VkUmVmVXBkYXRlcykgewogCQkJCQl1LnNldFN0YXR1cyhTdGF0dXMuUkVKRUNURURfT1RIRVJfUkVBU09OKTsKIAkJCQkJdS5zZXRNZXNzYWdlKGVyci5nZXRNZXNzYWdlKCkpOwogCQkJCX0KQEAgLTIyNSwxNCArMjI1LDE0IEBAIHByaXZhdGUgdm9pZCBzZW5kcGFjayhmaW5hbCBMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcywKIAkJU3RyaW5nIHBhdGhQYWNrID0gbnVsbDsKIAkJU3RyaW5nIHBhdGhJZHggPSBudWxsOwogCi0JCXRyeSAoZmluYWwgUGFja1dyaXRlciB3cml0ZXIgPSBuZXcgUGFja1dyaXRlcih0cmFuc3BvcnQuZ2V0UGFja0NvbmZpZygpLAorCQl0cnkgKFBhY2tXcml0ZXIgd3JpdGVyID0gbmV3IFBhY2tXcml0ZXIodHJhbnNwb3J0LmdldFBhY2tDb25maWcoKSwKIAkJCQlsb2NhbC5uZXdPYmplY3RSZWFkZXIoKSkpIHsKIAogCQkJZmluYWwgU2V0PE9iamVjdElkPiBuZWVkID0gbmV3IEhhc2hTZXQ8PigpOwogCQkJZmluYWwgU2V0PE9iamVjdElkPiBoYXZlID0gbmV3IEhhc2hTZXQ8PigpOwotCQkJZm9yIChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgciA6IHVwZGF0ZXMpCisJCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSByIDogdXBkYXRlcykKIAkJCQluZWVkLmFkZChyLmdldE5ld09iamVjdElkKCkpOwotCQkJZm9yIChmaW5hbCBSZWYgciA6IGdldFJlZnMoKSkgeworCQkJZm9yIChSZWYgciA6IGdldFJlZnMoKSkgewogCQkJCWhhdmUuYWRkKHIuZ2V0T2JqZWN0SWQoKSk7CiAJCQkJaWYgKHIuZ2V0UGVlbGVkT2JqZWN0SWQoKSAhPSBudWxsKQogCQkJCQloYXZlLmFkZChyLmdldFBlZWxlZE9iamVjdElkKCkpOwpAQCAtMjQ3LDcgKzI0Nyw3IEBAIHByaXZhdGUgdm9pZCBzZW5kcGFjayhmaW5hbCBMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcywKIAkJCQlyZXR1cm47CiAKIAkJCXBhY2tOYW1lcyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKLQkJCWZvciAoZmluYWwgU3RyaW5nIG4gOiBkZXN0LmdldFBhY2tOYW1lcygpKQorCQkJZm9yIChTdHJpbmcgbiA6IGRlc3QuZ2V0UGFja05hbWVzKCkpCiAJCQkJcGFja05hbWVzLnB1dChuLCBuKTsKIAogCQkJZmluYWwgU3RyaW5nIGJhc2UgPSAicGFjay0iICsgd3JpdGVyLmNvbXB1dGVOYW1lKCkubmFtZSgpOyAvLyROT04tTkxTLTEkCkBAIC0yOTUsNyArMjk1LDcgQEAgcHJpdmF0ZSB2b2lkIHNlbmRwYWNrKGZpbmFsIExpc3Q8UmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzLAogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIHNhZmVEZWxldGUoZmluYWwgU3RyaW5nIHBhdGgpIHsKKwlwcml2YXRlIHZvaWQgc2FmZURlbGV0ZShTdHJpbmcgcGF0aCkgewogCQlpZiAocGF0aCAhPSBudWxsKSB7CiAJCQl0cnkgewogCQkJCWRlc3QuZGVsZXRlRmlsZShwYXRoKTsKQEAgLTMwNyw3ICszMDcsNyBAQCBwcml2YXRlIHZvaWQgc2FmZURlbGV0ZShmaW5hbCBTdHJpbmcgcGF0aCkgewogCQl9CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZUNvbW1hbmQoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHUpIHsKKwlwcml2YXRlIHZvaWQgZGVsZXRlQ29tbWFuZChSZW1vdGVSZWZVcGRhdGUgdSkgewogCQlmaW5hbCBSZWYgciA9IG5ld1JlZnMucmVtb3ZlKHUuZ2V0UmVtb3RlTmFtZSgpKTsKIAkJaWYgKHIgPT0gbnVsbCkgewogCQkJLy8gQWxyZWFkeSBnb25lLgpAQCAtMzM3LDcgKzMzNyw3IEBAIHByaXZhdGUgdm9pZCBkZWxldGVDb21tYW5kKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1KSB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIHZvaWQgdXBkYXRlQ29tbWFuZChmaW5hbCBSZW1vdGVSZWZVcGRhdGUgdSkgeworCXByaXZhdGUgdm9pZCB1cGRhdGVDb21tYW5kKFJlbW90ZVJlZlVwZGF0ZSB1KSB7CiAJCXRyeSB7CiAJCQlkZXN0LndyaXRlUmVmKHUuZ2V0UmVtb3RlTmFtZSgpLCB1LmdldE5ld09iamVjdElkKCkpOwogCQkJbmV3UmVmcy5wdXQodS5nZXRSZW1vdGVOYW1lKCksIG5ldyBPYmplY3RJZFJlZi5VbnBlZWxlZCgKQEAgLTM1NCw3ICszNTQsNyBAQCBwcml2YXRlIGJvb2xlYW4gaXNOZXdSZXBvc2l0b3J5KCkgewogCQkJCSYmIHBhY2tOYW1lcy5pc0VtcHR5KCk7CiAJfQogCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU5ld1JlcG9zaXRvcnkoZmluYWwgTGlzdDxSZW1vdGVSZWZVcGRhdGU+IHVwZGF0ZXMpCisJcHJpdmF0ZSB2b2lkIGNyZWF0ZU5ld1JlcG9zaXRvcnkoTGlzdDxSZW1vdGVSZWZVcGRhdGU+IHVwZGF0ZXMpCiAJCQl0aHJvd3MgVHJhbnNwb3J0RXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIFN0cmluZyByZWYgPSAicmVmOiAiICsgcGlja0hFQUQodXBkYXRlcykgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKQEAgLTM3NCwxMiArMzc0LDEyIEBAIHByaXZhdGUgdm9pZCBjcmVhdGVOZXdSZXBvc2l0b3J5KGZpbmFsIExpc3Q8UmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzKQogCQl9CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBpY2tIRUFEKGZpbmFsIExpc3Q8UmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzKSB7CisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBpY2tIRUFEKExpc3Q8UmVtb3RlUmVmVXBkYXRlPiB1cGRhdGVzKSB7CiAJCS8vIFRyeSB0byB1c2UgbWFzdGVyIGlmIHRoZSB1c2VyIGlzIHB1c2hpbmcgdGhhdCwgaXQgaXMgdGhlCiAJCS8vIGRlZmF1bHQgYnJhbmNoIGFuZCBpcyBsaWtlbHkgd2hhdCB0aGV5IHdhbnQgdG8gcmVtYWluIGFzCiAJCS8vIHRoZSBkZWZhdWx0IG9uIHRoZSBuZXcgcmVtb3RlLgogCQkvLwotCQlmb3IgKGZpbmFsIFJlbW90ZVJlZlVwZGF0ZSB1IDogdXBkYXRlcykgeworCQlmb3IgKFJlbW90ZVJlZlVwZGF0ZSB1IDogdXBkYXRlcykgewogCQkJZmluYWwgU3RyaW5nIG4gPSB1LmdldFJlbW90ZU5hbWUoKTsKIAkJCWlmIChuLmVxdWFscyhDb25zdGFudHMuUl9IRUFEUyArIENvbnN0YW50cy5NQVNURVIpKQogCQkJCXJldHVybiBuOwpAQCAtMzg4LDcgKzM4OCw3IEBAIHByaXZhdGUgc3RhdGljIFN0cmluZyBwaWNrSEVBRChmaW5hbCBMaXN0PFJlbW90ZVJlZlVwZGF0ZT4gdXBkYXRlcykgewogCQkvLyBQaWNrIGFueSBicmFuY2gsIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoZSB1c2VyIHB1c2hlZCBvbmx5CiAJCS8vIG9uZSB0byB0aGUgcmVtb3RlIHNpZGUuCiAJCS8vCi0JCWZvciAoZmluYWwgUmVtb3RlUmVmVXBkYXRlIHUgOiB1cGRhdGVzKSB7CisJCWZvciAoUmVtb3RlUmVmVXBkYXRlIHUgOiB1cGRhdGVzKSB7CiAJCQlmaW5hbCBTdHJpbmcgbiA9IHUuZ2V0UmVtb3RlTmFtZSgpOwogCQkJaWYgKG4uc3RhcnRzV2l0aChDb25zdGFudHMuUl9IRUFEUykpCiAJCQkJcmV0dXJuIG47CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9XYWxrUmVtb3RlT2JqZWN0RGF0YWJhc2UuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtSZW1vdGVPYmplY3REYXRhYmFzZS5qYXZhCmluZGV4IDk2NWJlNTAuLmFhNzFjOTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtSZW1vdGVPYmplY3REYXRhYmFzZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L1dhbGtSZW1vdGVPYmplY3REYXRhYmFzZS5qYXZhCkBAIC0yMDIsNyArMjAyLDcgQEAgYWJzdHJhY3QgV2Fsa1JlbW90ZU9iamVjdERhdGFiYXNlIG9wZW5BbHRlcm5hdGUoU3RyaW5nIGxvY2F0aW9uKQogCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBkZWxldGlvbiBpcyBub3Qgc3VwcG9ydGVkLCBvciBkZWxldGlvbiBmYWlsZWQuCiAJICovCi0Jdm9pZCBkZWxldGVGaWxlKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgZGVsZXRlRmlsZShTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpHaXRUZXh0LmdldCgpLmRlbGV0aW5nTm90U3VwcG9ydGVkLCBwYXRoKSk7CiAJfQogCkBAIC0yNjMsNyArMjYzLDcgQEAgT3V0cHV0U3RyZWFtIHdyaXRlRmlsZShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsCiAJICogICAgICAgICAgICAgd3JpdGluZyBpcyBub3Qgc3VwcG9ydGVkLCBvciBhdHRlbXB0aW5nIHRvIHdyaXRlIHRoZSBmaWxlCiAJICogICAgICAgICAgICAgZmFpbGVkLCBwb3NzaWJseSBkdWUgdG8gcGVybWlzc2lvbnMgb3IgcmVtb3RlIGRpc2sgZnVsbCwgZXRjLgogCSAqLwotCXZvaWQgd3JpdGVGaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIHdyaXRlRmlsZShTdHJpbmcgcGF0aCwgYnl0ZVtdIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSAoT3V0cHV0U3RyZWFtIG9zID0gd3JpdGVGaWxlKHBhdGgsIG51bGwsIG51bGwpKSB7CiAJCQlvcy53cml0ZShkYXRhKTsKIAkJfQpAQCAtMjc4LDcgKzI3OCw3IEBAIHZvaWQgd3JpdGVGaWxlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBieXRlW10gZGF0YSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgZGVsZXRpb24gaXMgbm90IHN1cHBvcnRlZCwgb3IgZGVsZXRpb24gZmFpbGVkLgogCSAqLwotCXZvaWQgZGVsZXRlUmVmKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworCXZvaWQgZGVsZXRlUmVmKFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlkZWxldGVGaWxlKFJPT1RfRElSICsgbmFtZSk7CiAJfQogCkBAIC0yOTEsNyArMjkxLDcgQEAgdm9pZCBkZWxldGVSZWYoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHRocm93cyBJT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGRlbGV0aW9uIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGRlbGV0aW9uIGZhaWxlZC4KIAkgKi8KLQl2b2lkIGRlbGV0ZVJlZkxvZyhmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwl2b2lkIGRlbGV0ZVJlZkxvZyhTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZGVsZXRlRmlsZShST09UX0RJUiArIENvbnN0YW50cy5MT0dTICsgIi8iICsgbmFtZSk7IC8vJE5PTi1OTFMtMSQKIAl9CiAKQEAgLTMwOSw3ICszMDksNyBAQCB2b2lkIGRlbGV0ZVJlZkxvZyhmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgICB3cml0aW5nIGlzIG5vdCBzdXBwb3J0ZWQsIG9yIGF0dGVtcHRpbmcgdG8gd3JpdGUgdGhlIGZpbGUKIAkgKiAgICAgICAgICAgICBmYWlsZWQsIHBvc3NpYmx5IGR1ZSB0byBwZXJtaXNzaW9ucyBvciByZW1vdGUgZGlzayBmdWxsLCBldGMuCiAJICovCi0Jdm9pZCB3cml0ZVJlZihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0SWQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCB3cml0ZVJlZihTdHJpbmcgbmFtZSwgT2JqZWN0SWQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiOwogCiAJCWIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKENvbnN0YW50cy5PQkpFQ1RfSURfU1RSSU5HX0xFTkdUSCArIDEpOwpAQCAtMzMzLDkgKzMzMyw5IEBAIHZvaWQgd3JpdGVSZWYoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdElkIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgICAgIHdyaXRpbmcgaXMgbm90IHN1cHBvcnRlZCwgb3IgYXR0ZW1wdGluZyB0byB3cml0ZSB0aGUgZmlsZQogCSAqICAgICAgICAgICAgIGZhaWxlZCwgcG9zc2libHkgZHVlIHRvIHBlcm1pc3Npb25zIG9yIHJlbW90ZSBkaXNrIGZ1bGwsIGV0Yy4KIAkgKi8KLQl2b2lkIHdyaXRlSW5mb1BhY2tzKGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBwYWNrTmFtZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJdm9pZCB3cml0ZUluZm9QYWNrcyhDb2xsZWN0aW9uPFN0cmluZz4gcGFja05hbWVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCQlmb3IgKGZpbmFsIFN0cmluZyBuIDogcGFja05hbWVzKSB7CisJCWZvciAoU3RyaW5nIG4gOiBwYWNrTmFtZXMpIHsKIAkJCXcuYXBwZW5kKCJQICIpOyAvLyROT04tTkxTLTEkCiAJCQl3LmFwcGVuZChuKTsKIAkJCXcuYXBwZW5kKCdcbicpOwpAQCAtMzYxLDcgKzM2MSw3IEBAIHZvaWQgd3JpdGVJbmZvUGFja3MoZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHBhY2tOYW1lcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgICBleGlzdHMsIG9yIGFmdGVyIGl0IHdhcyBkZXRlcm1pbmVkIHRvIGV4aXN0IGJ1dCBiZWZvcmUgdGhlCiAJICogICAgICAgICAgICAgc3RyZWFtIGNvdWxkIGJlIGNyZWF0ZWQuCiAJICovCi0JQnVmZmVyZWRSZWFkZXIgb3BlblJlYWRlcihmaW5hbCBTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlCdWZmZXJlZFJlYWRlciBvcGVuUmVhZGVyKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IG9wZW4ocGF0aCkuaW47CiAJCXJldHVybiBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCBDb25zdGFudHMuQ0hBUlNFVCkpOwogCX0KQEAgLTQxNCw3ICs0MTQsNyBAQCBDb2xsZWN0aW9uPFdhbGtSZW1vdGVPYmplY3REYXRhYmFzZT4gcmVhZEFsdGVybmF0ZXMoZmluYWwgU3RyaW5nIGxpc3RQYXRoKQogCSAqIEB0aHJvd3Mgb3JnLmVjbGlwc2UuamdpdC5lcnJvcnMuVHJhbnNwb3J0RXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYW4gZXJyb3Igb2NjdXJyZWQgcmVhZGluZyBmcm9tIHRoZSBwYWNrZWQgcmVmcyBmaWxlLgogCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRQYWNrZWRSZWZzKGZpbmFsIE1hcDxTdHJpbmcsIFJlZj4gYXZhaWwpCisJcHJvdGVjdGVkIHZvaWQgcmVhZFBhY2tlZFJlZnMoTWFwPFN0cmluZywgUmVmPiBhdmFpbCkKIAkJCXRocm93cyBUcmFuc3BvcnRFeGNlcHRpb24gewogCQl0cnkgKEJ1ZmZlcmVkUmVhZGVyIGJyID0gb3BlblJlYWRlcihST09UX0RJUiArIENvbnN0YW50cy5QQUNLRURfUkVGUykpIHsKIAkJCXJlYWRQYWNrZWRSZWZzSW1wbChhdmFpbCwgYnIpOwpAQCAtNDc1LDcgKzQ3NSw3IEBAIHN0YXRpYyBmaW5hbCBjbGFzcyBGaWxlU3RyZWFtIHsKIAkJICogICAgICAgICAgICBzdHJlYW0gY29udGFpbmluZyB0aGUgZmlsZSBkYXRhLiBUaGlzIHN0cmVhbSB3aWxsIGJlCiAJCSAqICAgICAgICAgICAgY2xvc2VkIGJ5IHRoZSBjYWxsZXIgd2hlbiByZWFkaW5nIGlzIGNvbXBsZXRlLgogCQkgKi8KLQkJRmlsZVN0cmVhbShmaW5hbCBJbnB1dFN0cmVhbSBpKSB7CisJCUZpbGVTdHJlYW0oSW5wdXRTdHJlYW0gaSkgewogCQkJaW4gPSBpOwogCQkJbGVuZ3RoID0gLTE7CiAJCX0KQEAgLTQ5MCw3ICs0OTAsNyBAQCBzdGF0aWMgZmluYWwgY2xhc3MgRmlsZVN0cmVhbSB7CiAJCSAqICAgICAgICAgICAgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3IgcmVhZGluZyB0aHJvdWdoCiAJCSAqICAgICAgICAgICAgPGNvZGU+aTwvY29kZT4uCiAJCSAqLwotCQlGaWxlU3RyZWFtKGZpbmFsIElucHV0U3RyZWFtIGksIGZpbmFsIGxvbmcgbikgeworCQlGaWxlU3RyZWFtKElucHV0U3RyZWFtIGksIGxvbmcgbikgewogCQkJaW4gPSBpOwogCQkJbGVuZ3RoID0gbjsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvcmVzb2x2ZXIvRmlsZVJlc29sdmVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9yZXNvbHZlci9GaWxlUmVzb2x2ZXIuamF2YQppbmRleCAxNmE2ZjRhLi42MGFjZDJmIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9yZXNvbHZlci9GaWxlUmVzb2x2ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9yZXNvbHZlci9GaWxlUmVzb2x2ZXIuamF2YQpAQCAtODcsNyArODcsNyBAQCBwdWJsaWMgRmlsZVJlc29sdmVyKCkgewogCSAqICAgICAgICAgICAgaWYgdHJ1ZSwgZXhwb3J0cyBhbGwgcmVwb3NpdG9yaWVzLCBpZ25vcmluZyB0aGUgY2hlY2sgZm9yIHRoZQogCSAqICAgICAgICAgICAge0Bjb2RlIGdpdC1kYWVtb24tZXhwb3J0LW9rfSBmaWxlcy4KIAkgKi8KLQlwdWJsaWMgRmlsZVJlc29sdmVyKGZpbmFsIEZpbGUgYmFzZVBhdGgsIGZpbmFsIGJvb2xlYW4gZXhwb3J0QWxsKSB7CisJcHVibGljIEZpbGVSZXNvbHZlcihGaWxlIGJhc2VQYXRoLCBib29sZWFuIGV4cG9ydEFsbCkgewogCQl0aGlzKCk7CiAJCWV4cG9ydERpcmVjdG9yeShiYXNlUGF0aCk7CiAJCXNldEV4cG9ydEFsbChleHBvcnRBbGwpOwpAQCAtOTUsNyArOTUsNyBAQCBwdWJsaWMgRmlsZVJlc29sdmVyKGZpbmFsIEZpbGUgYmFzZVBhdGgsIGZpbmFsIGJvb2xlYW4gZXhwb3J0QWxsKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBSZXBvc2l0b3J5IG9wZW4oZmluYWwgQyByZXEsIGZpbmFsIFN0cmluZyBuYW1lKQorCXB1YmxpYyBSZXBvc2l0b3J5IG9wZW4oQyByZXEsIFN0cmluZyBuYW1lKQogCQkJdGhyb3dzIFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbiwgU2VydmljZU5vdEVuYWJsZWRFeGNlcHRpb24gewogCQlpZiAoaXNVbnJlYXNvbmFibGVOYW1lKG5hbWUpKQogCQkJdGhyb3cgbmV3IFJlcG9zaXRvcnlOb3RGb3VuZEV4Y2VwdGlvbihuYW1lKTsKQEAgLTE3NSw3ICsxNzUsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0V4cG9ydEFsbCgpIHsKIAkgKgogCSAqIEBwYXJhbSBleHBvcnQgYSBib29sZWFuLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4cG9ydEFsbChmaW5hbCBib29sZWFuIGV4cG9ydCkgeworCXB1YmxpYyB2b2lkIHNldEV4cG9ydEFsbChib29sZWFuIGV4cG9ydCkgewogCQlleHBvcnRBbGwgPSBleHBvcnQ7CiAJfQogCkBAIC0yMDIsNyArMjAyLDcgQEAgcHVibGljIHZvaWQgZXhwb3J0UmVwb3NpdG9yeShTdHJpbmcgbmFtZSwgUmVwb3NpdG9yeSBkYikgewogCSAqICAgICAgICAgICAgZ2l0IHJlcG9zaXRvcnksIGJ1dCBhbnkgZGlyZWN0b3J5IGJlbG93IGl0IHdoaWNoIGhhcyBhIGZpbGUKIAkgKiAgICAgICAgICAgIG5hbWVkIDxjb2RlPmdpdC1kYWVtb24tZXhwb3J0LW9rPC9jb2RlPiB3aWxsIGJlIHB1Ymxpc2hlZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBleHBvcnREaXJlY3RvcnkoZmluYWwgRmlsZSBkaXIpIHsKKwlwdWJsaWMgdm9pZCBleHBvcnREaXJlY3RvcnkoRmlsZSBkaXIpIHsKIAkJZXhwb3J0QmFzZS5hZGQoZGlyKTsKIAl9CiAKQEAgLTI0MCw3ICsyNDAsNyBAQCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmFtZVdpdGhEb3RHaXQoU3RyaW5nIG5hbWUpIHsKIAkJcmV0dXJuIG5hbWUgKyBDb25zdGFudHMuRE9UX0dJVF9FWFQ7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VucmVhc29uYWJsZU5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKwlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVW5yZWFzb25hYmxlTmFtZShTdHJpbmcgbmFtZSkgewogCQlpZiAobmFtZS5sZW5ndGgoKSA9PSAwKQogCQkJcmV0dXJuIHRydWU7IC8vIG5vIGVtcHR5IHBhdGhzCiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQWJzdHJhY3RUcmVlSXRlcmF0b3IuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQWJzdHJhY3RUcmVlSXRlcmF0b3IuamF2YQppbmRleCBhNzkwMGYwLi40NzBlZDAyIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0Fic3RyYWN0VHJlZUl0ZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9BYnN0cmFjdFRyZWVJdGVyYXRvci5qYXZhCkBAIC0xNzYsNyArMTc2LDcgQEAgcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yKCkgewogCSAqICAgICAgICAgICAgcm9vdCBvZiB0aGUgcmVwb3NpdG9yeS4gQSB0cmFpbGluZyBzbGFzaCAoJy8nKSBpcwogCSAqICAgICAgICAgICAgYXV0b21hdGljYWxseSBhcHBlbmRlZCBpZiB0aGUgcHJlZml4IGRvZXMgbm90IGVuZCBpbiAnLycuCiAJICovCi0JcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yKGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKKwlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IoU3RyaW5nIHByZWZpeCkgewogCQlwYXJlbnQgPSBudWxsOwogCiAJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7CkBAIC0yMTAsNyArMjEwLDcgQEAgcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yKGZpbmFsIFN0cmluZyBwcmVmaXgpIHsKIAkgKiAgICAgICAgICAgIHJvb3Qgb2YgdGhlIHJlcG9zaXRvcnkuIEEgdHJhaWxpbmcgc2xhc2ggKCcvJykgaXMKIAkgKiAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgdGhlIHByZWZpeCBkb2VzIG5vdCBlbmQgaW4gJy8nLgogCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvcihmaW5hbCBieXRlW10gcHJlZml4KSB7CisJcHJvdGVjdGVkIEFic3RyYWN0VHJlZUl0ZXJhdG9yKGJ5dGVbXSBwcmVmaXgpIHsKIAkJcGFyZW50ID0gbnVsbDsKIAogCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCA+IDApIHsKQEAgLTIzMiw3ICsyMzIsNyBAQCBwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZmluYWwgYnl0ZVtdIHByZWZpeCkgewogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwYXJlbnQgdHJlZSBpdGVyYXRvci4KIAkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCkgeworCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvcihBYnN0cmFjdFRyZWVJdGVyYXRvciBwKSB7CiAJCXBhcmVudCA9IHA7CiAJCXBhdGggPSBwLnBhdGg7CiAJCXBhdGhPZmZzZXQgPSBwLnBhdGhMZW4gKyAxOwpAQCAtMjc1LDcgKzI3NSw3IEBAIHByb3RlY3RlZCBBYnN0cmFjdFRyZWVJdGVyYXRvcihmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBwLAogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIGxpdmUgYnl0ZXMgaW4gdGhlIHBhdGggYnVmZmVyLiBUaGlzIG1hbnkgYnl0ZXMgd2lsbAogCSAqICAgICAgICAgICAgYmUgbW92ZWQgaW50byB0aGUgbGFyZ2VyIGJ1ZmZlci4KIAkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBncm93UGF0aChmaW5hbCBpbnQgbGVuKSB7CisJcHJvdGVjdGVkIHZvaWQgZ3Jvd1BhdGgoaW50IGxlbikgewogCQlzZXRQYXRoQ2FwYWNpdHkocGF0aC5sZW5ndGggPDwgMSwgbGVuKTsKIAl9CiAKQEAgLTI4Nyw3ICsyODcsNyBAQCBwcm90ZWN0ZWQgdm9pZCBncm93UGF0aChmaW5hbCBpbnQgbGVuKSB7CiAJICogQHBhcmFtIGxlbgogCSAqICAgICAgICAgICAgdGhlIGFtb3VudCBvZiBsaXZlIGJ5dGVzIGluIHBhdGggYnVmZmVyCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgZW5zdXJlUGF0aENhcGFjaXR5KGZpbmFsIGludCBjYXBhY2l0eSwgZmluYWwgaW50IGxlbikgeworCXByb3RlY3RlZCB2b2lkIGVuc3VyZVBhdGhDYXBhY2l0eShpbnQgY2FwYWNpdHksIGludCBsZW4pIHsKIAkJaWYgKHBhdGgubGVuZ3RoID49IGNhcGFjaXR5KQogCQkJcmV0dXJuOwogCQlmaW5hbCBieXRlW10gbyA9IHBhdGg7CkBAIC0zMjIsMTEgKzMyMiwxMSBAQCBwcml2YXRlIHZvaWQgc2V0UGF0aENhcGFjaXR5KGludCBjYXBhY2l0eSwgaW50IGxlbikgewogCSAqIEByZXR1cm4gLTEgaWYgdGhpcyBlbnRyeSBzb3J0cyBmaXJzdDsgMCBpZiB0aGUgZW50cmllcyBhcmUgZXF1YWw7IDEgaWYKIAkgKiAgICAgICAgIHAncyBlbnRyeSBzb3J0cyBmaXJzdC4KIAkgKi8KLQlwdWJsaWMgaW50IHBhdGhDb21wYXJlKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKKwlwdWJsaWMgaW50IHBhdGhDb21wYXJlKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKIAkJcmV0dXJuIHBhdGhDb21wYXJlKHAsIHAubW9kZSk7CiAJfQogCi0JaW50IHBhdGhDb21wYXJlKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHAsIGZpbmFsIGludCBwTW9kZSkgeworCWludCBwYXRoQ29tcGFyZShBYnN0cmFjdFRyZWVJdGVyYXRvciBwLCBpbnQgcE1vZGUpIHsKIAkJLy8gSXRzIGNvbW1vbiB3aGVuIHdlIGFyZSBhIHN1YnRyZWUgZm9yIGJvdGggcGFyZW50cyB0byBtYXRjaDsKIAkJLy8gd2hlbiB0aGlzIGhhcHBlbnMgZXZlcnl0aGluZyBpbiBwYXRoWzAuLmNQb3NdIGlzIGtub3duIHRvCiAJCS8vIGJlIGVxdWFsIGFuZCBkb2VzIG5vdCByZXF1aXJlIGV2YWx1YXRpb24gYWdhaW4uCkBAIC00MjAsNyArNDIwLDcgQEAgcHJpdmF0ZSBzdGF0aWMgaW50IGFscmVhZHlNYXRjaChBYnN0cmFjdFRyZWVJdGVyYXRvciBhLAogCSAqICAgICAgICAgICAgdGhlIG90aGVyIGl0ZXJhdG9yIHRvIHRlc3QgYWdhaW5zdC4KIAkgKiBAcmV0dXJuIHRydWUgaWYgYm90aCBpdGVyYXRvcnMgaGF2ZSB0aGUgc2FtZSBvYmplY3QgaWQ7IGZhbHNlIG90aGVyd2lzZS4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpZEVxdWFsKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIG90aGVySXRlcmF0b3IpIHsKKwlwdWJsaWMgYm9vbGVhbiBpZEVxdWFsKEFic3RyYWN0VHJlZUl0ZXJhdG9yIG90aGVySXRlcmF0b3IpIHsKIAkJcmV0dXJuIE9iamVjdElkLmVxdWFscyhpZEJ1ZmZlcigpLCBpZE9mZnNldCgpLAogCQkJCW90aGVySXRlcmF0b3IuaWRCdWZmZXIoKSwgb3RoZXJJdGVyYXRvci5pZE9mZnNldCgpKTsKIAl9CkBAIC00NDcsNyArNDQ3LDcgQEAgcHVibGljIE9iamVjdElkIGdldEVudHJ5T2JqZWN0SWQoKSB7CiAJICogQHBhcmFtIG91dAogCSAqICAgICAgICAgICAgYnVmZmVyIHRvIGNvcHkgdGhlIG9iamVjdCBpZCBpbnRvLgogCSAqLwotCXB1YmxpYyB2b2lkIGdldEVudHJ5T2JqZWN0SWQoZmluYWwgTXV0YWJsZU9iamVjdElkIG91dCkgeworCXB1YmxpYyB2b2lkIGdldEVudHJ5T2JqZWN0SWQoTXV0YWJsZU9iamVjdElkIG91dCkgewogCQlvdXQuZnJvbVJhdyhpZEJ1ZmZlcigpLCBpZE9mZnNldCgpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvQ2Fub25pY2FsVHJlZVBhcnNlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9DYW5vbmljYWxUcmVlUGFyc2VyLmphdmEKaW5kZXggNzExMTNhNi4uMDE5OTY4OCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9DYW5vbmljYWxUcmVlUGFyc2VyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9DYW5vbmljYWxUcmVlUGFyc2VyLmphdmEKQEAgLTExOSw3ICsxMTksNyBAQCBwdWJsaWMgQ2Fub25pY2FsVHJlZVBhcnNlcihmaW5hbCBieXRlW10gcHJlZml4LCBmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyLAogCQlyZXNldChyZWFkZXIsIHRyZWVJZCk7CiAJfQogCi0JcHJpdmF0ZSBDYW5vbmljYWxUcmVlUGFyc2VyKGZpbmFsIENhbm9uaWNhbFRyZWVQYXJzZXIgcCkgeworCXByaXZhdGUgQ2Fub25pY2FsVHJlZVBhcnNlcihDYW5vbmljYWxUcmVlUGFyc2VyIHApIHsKIAkJc3VwZXIocCk7CiAJfQogCkBAIC0xNDAsNyArMTQwLDcgQEAgcHVibGljIENhbm9uaWNhbFRyZWVQYXJzZXIgZ2V0UGFyZW50KCkgewogCSAqIEBwYXJhbSB0cmVlRGF0YQogCSAqICAgICAgICAgICAgdGhlIHJhdyB0cmVlIGNvbnRlbnQuCiAJICovCi0JcHVibGljIHZvaWQgcmVzZXQoZmluYWwgYnl0ZVtdIHRyZWVEYXRhKSB7CisJcHVibGljIHZvaWQgcmVzZXQoYnl0ZVtdIHRyZWVEYXRhKSB7CiAJCWF0dHJpYnV0ZXNOb2RlID0gbnVsbDsKIAkJcmF3ID0gdHJlZURhdGE7CiAJCXByZXZQdHIgPSAtMTsKQEAgLTIxOSw3ICsyMTksNyBAQCBwdWJsaWMgQ2Fub25pY2FsVHJlZVBhcnNlciBuZXh0KCkgewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgbG9vc2Ugb2JqZWN0IG9yIHBhY2sgZmlsZSBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyLCBmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlwdWJsaWMgdm9pZCByZXNldChPYmplY3RSZWFkZXIgcmVhZGVyLCBBbnlPYmplY3RJZCBpZCkKIAkJCXRocm93cyBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXJlc2V0KHJlYWRlci5vcGVuKGlkLCBPQkpfVFJFRSkuZ2V0Q2FjaGVkQnl0ZXMoKSk7CiAJfQpAQCAtMjYyLDcgKzI2Miw3IEBAIHB1YmxpYyBmaW5hbCBDYW5vbmljYWxUcmVlUGFyc2VyIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcjAoCiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBDYW5vbmljYWxUcmVlUGFyc2VyIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihmaW5hbCBPYmplY3RSZWFkZXIgcmVhZGVyKQorCXB1YmxpYyBDYW5vbmljYWxUcmVlUGFyc2VyIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihyZWFkZXIsIG5ldyBNdXRhYmxlT2JqZWN0SWQoKSk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9FbXB0eVRyZWVJdGVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9FbXB0eVRyZWVJdGVyYXRvci5qYXZhCmluZGV4IDU5NmQzZDAuLmY1ZDQ1YzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvRW1wdHlUcmVlSXRlcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0VtcHR5VHJlZUl0ZXJhdG9yLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAgcHVibGljIEVtcHR5VHJlZUl0ZXJhdG9yKCkgewogCQkvLyBDcmVhdGUgYSByb290IGVtcHR5IHRyZWUuCiAJfQogCi0JRW1wdHlUcmVlSXRlcmF0b3IoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCkgeworCUVtcHR5VHJlZUl0ZXJhdG9yKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKIAkJc3VwZXIocCk7CiAJCXBhdGhMZW4gPSBwYXRoT2Zmc2V0OwogCX0KQEAgLTkyLDcgKzkyLDcgQEAgcHVibGljIEVtcHR5VHJlZUl0ZXJhdG9yKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHAsCiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBBYnN0cmFjdFRyZWVJdGVyYXRvciBjcmVhdGVTdWJ0cmVlSXRlcmF0b3IoZmluYWwgT2JqZWN0UmVhZGVyIHJlYWRlcikKKwlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKE9iamVjdFJlYWRlciByZWFkZXIpCiAJCQl0aHJvd3MgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gbmV3IEVtcHR5VHJlZUl0ZXJhdG9yKHRoaXMpOwogCX0KQEAgLTE0MSwxMyArMTQxLDEzIEBAIHB1YmxpYyBib29sZWFuIGVvZigpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbmV4dChmaW5hbCBpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBuZXh0KGludCBkZWx0YSkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQkvLyBEbyBub3RoaW5nLgogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgYmFjayhmaW5hbCBpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBiYWNrKGludCBkZWx0YSkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQkvLyBEbyBub3RoaW5nLgogCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9GaWxlVHJlZUl0ZXJhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3IuamF2YQppbmRleCA4ZGY3NjRkLi4yNGI5YWMwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3IuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL0ZpbGVUcmVlSXRlcmF0b3IuamF2YQpAQCAtNTIsNiArNTIsNyBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIAoraW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZGlyY2FjaGUuRGlyQ2FjaGVJdGVyYXRvcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5JbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5GaWxlTW9kZTsKQEAgLTY3LDYgKzY4LDcgQEAKICAqIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLlRyZWVXYWxrfS4KICAqLwogcHVibGljIGNsYXNzIEZpbGVUcmVlSXRlcmF0b3IgZXh0ZW5kcyBXb3JraW5nVHJlZUl0ZXJhdG9yIHsKKwogCS8qKgogCSAqIHRoZSBzdGFydGluZyBkaXJlY3Rvcnkgb2YgdGhpcyBJdGVyYXRvci4gQWxsIGVudHJpZXMgYXJlIGxvY2F0ZWQgZGlyZWN0bHkKIAkgKiBpbiB0aGlzIGRpcmVjdG9yeS4KQEAgLTEzMCw3ICsxMzIsNyBAQCBwdWJsaWMgRmlsZVRyZWVJdGVyYXRvcihSZXBvc2l0b3J5IHJlcG8sIEZpbGVNb2RlU3RyYXRlZ3kgZmlsZU1vZGVTdHJhdGVneSkgewogCSAqIEBwYXJhbSBvcHRpb25zCiAJICogICAgICAgICAgICB3b3JraW5nIHRyZWUgb3B0aW9ucyB0byBiZSB1c2VkCiAJICovCi0JcHVibGljIEZpbGVUcmVlSXRlcmF0b3IoZmluYWwgRmlsZSByb290LCBGUyBmcywgV29ya2luZ1RyZWVPcHRpb25zIG9wdGlvbnMpIHsKKwlwdWJsaWMgRmlsZVRyZWVJdGVyYXRvcihGaWxlIHJvb3QsIEZTIGZzLCBXb3JraW5nVHJlZU9wdGlvbnMgb3B0aW9ucykgewogCQl0aGlzKHJvb3QsIGZzLCBvcHRpb25zLCBEZWZhdWx0RmlsZU1vZGVTdHJhdGVneS5JTlNUQU5DRSk7CiAJfQogCkBAIC0xNzEsMjcgKzE3Myw2IEBAIHB1YmxpYyBGaWxlVHJlZUl0ZXJhdG9yKGZpbmFsIEZpbGUgcm9vdCwgRlMgZnMsIFdvcmtpbmdUcmVlT3B0aW9ucyBvcHRpb25zLAogCSAqICAgICAgICAgICAgdGhlIGZpbGUgc3lzdGVtIGFic3RyYWN0aW9uIHdoaWNoIHdpbGwgYmUgbmVjZXNzYXJ5IHRvIHBlcmZvcm0KIAkgKiAgICAgICAgICAgIGNlcnRhaW4gZmlsZSBzeXN0ZW0gb3BlcmF0aW9ucy4KIAkgKiBAc2luY2UgNC4zCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjRmlsZVRyZWVJdGVyYXRvcihGaWxlVHJlZUl0ZXJhdG9yLCBGaWxlLCBGUyl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZC4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXByb3RlY3RlZCBGaWxlVHJlZUl0ZXJhdG9yKGZpbmFsIFdvcmtpbmdUcmVlSXRlcmF0b3IgcCwgZmluYWwgRmlsZSByb290LAotCQkJRlMgZnMpIHsKLQkJdGhpcyhwLCByb290LCBmcywgRGVmYXVsdEZpbGVNb2RlU3RyYXRlZ3kuSU5TVEFOQ0UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIG5ldyBpdGVyYXRvciB0byB0cmF2ZXJzZSBhIHN1YmRpcmVjdG9yeS4KLQkgKgotCSAqIEBwYXJhbSBwCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGl0ZXJhdG9yIHdlIHdlcmUgY3JlYXRlZCBmcm9tLgotCSAqIEBwYXJhbSByb290Ci0JICogICAgICAgICAgICB0aGUgc3ViZGlyZWN0b3J5LiBUaGlzIHNob3VsZCBiZSBhIGRpcmVjdG9yeSBjb250YWluZWQgd2l0aGluCi0JICogICAgICAgICAgICB0aGUgcGFyZW50IGRpcmVjdG9yeS4KLQkgKiBAcGFyYW0gZnMKLQkgKiAgICAgICAgICAgIHRoZSBmaWxlIHN5c3RlbSBhYnN0cmFjdGlvbiB3aGljaCB3aWxsIGJlIG5lY2Vzc2FyeSB0byBwZXJmb3JtCi0JICogICAgICAgICAgICBjZXJ0YWluIGZpbGUgc3lzdGVtIG9wZXJhdGlvbnMuCi0JICogQHNpbmNlIDQuMwogCSAqLwogCXByb3RlY3RlZCBGaWxlVHJlZUl0ZXJhdG9yKGZpbmFsIEZpbGVUcmVlSXRlcmF0b3IgcCwgZmluYWwgRmlsZSByb290LAogCQkJRlMgZnMpIHsKQEAgLTIyNiwxOSArMjA3LDM5IEBAIHByb3RlY3RlZCBGaWxlVHJlZUl0ZXJhdG9yKGZpbmFsIFdvcmtpbmdUcmVlSXRlcmF0b3IgcCwgZmluYWwgRmlsZSByb290LAogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgQWJzdHJhY3RUcmVlSXRlcmF0b3IgY3JlYXRlU3VidHJlZUl0ZXJhdG9yKGZpbmFsIE9iamVjdFJlYWRlciByZWFkZXIpCisJcHVibGljIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNyZWF0ZVN1YnRyZWVJdGVyYXRvcihPYmplY3RSZWFkZXIgcmVhZGVyKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBGaWxlVHJlZUl0ZXJhdG9yKHRoaXMsICgoRmlsZUVudHJ5KSBjdXJyZW50KCkpLmdldEZpbGUoKSwgZnMsIGZpbGVNb2RlU3RyYXRlZ3kpOworCQlpZiAoIXdhbGtzSWdub3JlZERpcmVjdG9yaWVzKCkgJiYgaXNFbnRyeUlnbm9yZWQoKSkgeworCQkJRGlyQ2FjaGVJdGVyYXRvciBpdGVyYXRvciA9IGdldERpckNhY2hlSXRlcmF0b3IoKTsKKwkJCWlmIChpdGVyYXRvciA9PSBudWxsKSB7CisJCQkJcmV0dXJuIG5ldyBFbXB0eVRyZWVJdGVyYXRvcih0aGlzKTsKKwkJCX0KKwkJCS8vIE9ubHkgZW50ZXIgaWYgd2UgaGF2ZSBhbiBhc3NvY2lhdGVkIERpckNhY2hlSXRlcmF0b3IgdGhhdCBpcworCQkJLy8gYXQgdGhlIHNhbWUgZW50cnkgKHdoaWNoIGluZGljYXRlcyB0aGVyZSBpcyBzb21lIGFscmVhZHkKKwkJCS8vIHRyYWNrZWQgZmlsZSB1bmRlcm5lYXRoIHRoaXMgZGlyZWN0b3J5KS4gT3RoZXJ3aXNlIHRoZQorCQkJLy8gZGlyZWN0b3J5IGlzIGluZGVlZCBpZ25vcmVkIGFuZCBjYW4gYmUgc2tpcHBlZCBlbnRpcmVseS4KKwkJfQorCQlyZXR1cm4gZW50ZXJTdWJ0cmVlKCk7CisJfQorCisKKwkvKioKKwkgKiBDcmVhdGUgYSBuZXcgaXRlcmF0b3IgZm9yIHRoZSBjdXJyZW50IGVudHJ5J3Mgc3VidHJlZS4KKwkgKiA8cD4KKwkgKiBUaGUgcGFyZW50IHJlZmVyZW5jZSBvZiB0aGUgaXRlcmF0b3IgbXVzdCBiZSA8Y29kZT50aGlzPC9jb2RlPiwgb3RoZXJ3aXNlCisJICogdGhlIGNhbGxlciB3b3VsZCBub3QgYmUgYWJsZSB0byBleGl0IG91dCBvZiB0aGUgc3VidHJlZSBpdGVyYXRvcgorCSAqIGNvcnJlY3RseSBhbmQgcmV0dXJuIHRvIGNvbnRpbnVlIHdhbGtpbmcgPGNvZGU+dGhpczwvY29kZT4uCisJICoKKwkgKiBAcmV0dXJuIGEgbmV3IGl0ZXJhdG9yIHRoYXQgd2Fsa3Mgb3ZlciB0aGUgY3VycmVudCBzdWJ0cmVlLgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwcm90ZWN0ZWQgQWJzdHJhY3RUcmVlSXRlcmF0b3IgZW50ZXJTdWJ0cmVlKCkgeworCQlyZXR1cm4gbmV3IEZpbGVUcmVlSXRlcmF0b3IodGhpcywgKChGaWxlRW50cnkpIGN1cnJlbnQoKSkuZ2V0RmlsZSgpLCBmcywKKwkJCQlmaWxlTW9kZVN0cmF0ZWd5KTsKIAl9CiAKIAlwcml2YXRlIEVudHJ5W10gZW50cmllcygpIHsKLQkJZmluYWwgRmlsZVtdIGFsbCA9IGRpcmVjdG9yeS5saXN0RmlsZXMoKTsKLQkJaWYgKGFsbCA9PSBudWxsKQotCQkJcmV0dXJuIEVPRjsKLQkJZmluYWwgRW50cnlbXSByID0gbmV3IEVudHJ5W2FsbC5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspCi0JCQlyW2ldID0gbmV3IEZpbGVFbnRyeShhbGxbaV0sIGZzLCBmaWxlTW9kZVN0cmF0ZWd5KTsKLQkJcmV0dXJuIHI7CisJCXJldHVybiBmcy5saXN0KGRpcmVjdG9yeSwgZmlsZU1vZGVTdHJhdGVneSk7CiAJfQogCiAJLyoqCkBAIC0yNjcsNyArMjY4LDcgQEAgcHVibGljIGludGVyZmFjZSBGaWxlTW9kZVN0cmF0ZWd5IHsKIAkgKgogCSAqIEBzaW5jZSA0LjMKIAkgKi8KLQlzdGF0aWMgcHVibGljIGNsYXNzIERlZmF1bHRGaWxlTW9kZVN0cmF0ZWd5IGltcGxlbWVudHMgRmlsZU1vZGVTdHJhdGVneSB7CisJcHVibGljIHN0YXRpYyBjbGFzcyBEZWZhdWx0RmlsZU1vZGVTdHJhdGVneSBpbXBsZW1lbnRzIEZpbGVNb2RlU3RyYXRlZ3kgewogCQkvKioKIAkJICogYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgRmlsZU1vZGVTdHJhdGVneQogCQkgKi8KQEAgLTMwMCw3ICszMDEsNyBAQCBwdWJsaWMgRmlsZU1vZGUgZ2V0TW9kZShGaWxlIGYsIEZTLkF0dHJpYnV0ZXMgYXR0cmlidXRlcykgewogCSAqCiAJICogQHNpbmNlIDQuMwogCSAqLwotCXN0YXRpYyBwdWJsaWMgY2xhc3MgTm9HaXRsaW5rc1N0cmF0ZWd5IGltcGxlbWVudHMgRmlsZU1vZGVTdHJhdGVneSB7CisJcHVibGljIHN0YXRpYyBjbGFzcyBOb0dpdGxpbmtzU3RyYXRlZ3kgaW1wbGVtZW50cyBGaWxlTW9kZVN0cmF0ZWd5IHsKIAogCQkvKioKIAkJICogYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgRmlsZU1vZGVTdHJhdGVneQpAQCAtMzI1LDcgKzMyNiw3IEBAIHB1YmxpYyBGaWxlTW9kZSBnZXRNb2RlKEZpbGUgZiwgRlMuQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7CiAJLyoqCiAJICogV3JhcHBlciBmb3IgYSBzdGFuZGFyZCBKYXZhIElPIGZpbGUKIAkgKi8KLQlzdGF0aWMgcHVibGljIGNsYXNzIEZpbGVFbnRyeSBleHRlbmRzIEVudHJ5IHsKKwlwdWJsaWMgc3RhdGljIGNsYXNzIEZpbGVFbnRyeSBleHRlbmRzIEVudHJ5IHsKIAkJcHJpdmF0ZSBmaW5hbCBGaWxlTW9kZSBtb2RlOwogCiAJCXByaXZhdGUgRlMuQXR0cmlidXRlcyBhdHRyaWJ1dGVzOwpAQCAtMzY0LDYgKzM2NSwyOSBAQCBwdWJsaWMgRmlsZUVudHJ5KEZpbGUgZiwgRlMgZnMsIEZpbGVNb2RlU3RyYXRlZ3kgZmlsZU1vZGVTdHJhdGVneSkgewogCQkJbW9kZSA9IGZpbGVNb2RlU3RyYXRlZ3kuZ2V0TW9kZShmLCBhdHRyaWJ1dGVzKTsKIAkJfQogCisJCS8qKgorCQkgKiBDcmVhdGUgYSBuZXcgZmlsZSBlbnRyeSBnaXZlbiB0aGUgc3BlY2lmaWVkIEZpbGVNb2RlU3RyYXRlZ3kKKwkJICoKKwkJICogQHBhcmFtIGYKKwkJICogICAgICAgICAgICBmaWxlCisJCSAqIEBwYXJhbSBmcworCQkgKiAgICAgICAgICAgIGZpbGUgc3lzdGVtCisJCSAqIEBwYXJhbSBhdHRyaWJ1dGVzCisJCSAqICAgICAgICAgICAgb2YgdGhlIGZpbGUKKwkJICogQHBhcmFtIGZpbGVNb2RlU3RyYXRlZ3kKKwkJICogICAgICAgICAgICB0aGUgc3RyYXRlZ3kgdG8gdXNlIHdoZW4gZGV0ZXJtaW5pbmcgdGhlIEZpbGVNb2RlIG9mIGEKKwkJICogICAgICAgICAgICBmaWxlOyBjb250cm9scyBnaXRsaW5rcyBldGMuCisJCSAqCisJCSAqIEBzaW5jZSA1LjAKKwkJICovCisJCXB1YmxpYyBGaWxlRW50cnkoRmlsZSBmLCBGUyBmcywgRlMuQXR0cmlidXRlcyBhdHRyaWJ1dGVzLAorCQkJCUZpbGVNb2RlU3RyYXRlZ3kgZmlsZU1vZGVTdHJhdGVneSkgeworCQkJdGhpcy5mcyA9IGZzOworCQkJdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKKwkJCWYgPSBmcy5ub3JtYWxpemUoZik7CisJCQltb2RlID0gZmlsZU1vZGVTdHJhdGVneS5nZXRNb2RlKGYsIGF0dHJpYnV0ZXMpOworCQl9CisKIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBGaWxlTW9kZSBnZXRNb2RlKCkgewogCQkJcmV0dXJuIG1vZGU7CkBAIC0zODYsMTIgKzQxMCwxMiBAQCBwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7CiAKIAkJQE92ZXJyaWRlCiAJCXB1YmxpYyBJbnB1dFN0cmVhbSBvcGVuSW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkJaWYgKGZzLmlzU3ltTGluayhnZXRGaWxlKCkpKQorCQkJaWYgKGF0dHJpYnV0ZXMuaXNTeW1ib2xpY0xpbmsoKSkgewogCQkJCXJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZnMucmVhZFN5bUxpbmsoZ2V0RmlsZSgpKQotCQkJCQkJLmdldEJ5dGVzKAotCQkJCQkJQ29uc3RhbnRzLkNIQVJBQ1RFUl9FTkNPRElORykpOwotCQkJZWxzZQorCQkJCQkJLmdldEJ5dGVzKENvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkcpKTsKKwkJCX0gZWxzZSB7CiAJCQkJcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oZ2V0RmlsZSgpKTsKKwkJCX0KIAkJfQogCiAJCS8qKgpAQCAtNDI2LDcgKzQ1MCw3IEBAIHB1YmxpYyBGaWxlIGdldEVudHJ5RmlsZSgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHJvdGVjdGVkIGJ5dGVbXSBpZFN1Ym1vZHVsZShmaW5hbCBFbnRyeSBlKSB7CisJcHJvdGVjdGVkIGJ5dGVbXSBpZFN1Ym1vZHVsZShFbnRyeSBlKSB7CiAJCXJldHVybiBpZFN1Ym1vZHVsZShnZXREaXJlY3RvcnkoKSwgZSk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL05hbWVDb25mbGljdFRyZWVXYWxrLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL05hbWVDb25mbGljdFRyZWVXYWxrLmphdmEKaW5kZXggNTU2MGY3Ny4uNjFiMTMwZiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9OYW1lQ29uZmxpY3RUcmVlV2Fsay5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvTmFtZUNvbmZsaWN0VHJlZVdhbGsuamF2YQpAQCAtOTksNyArOTksNyBAQCBwdWJsaWMgY2xhc3MgTmFtZUNvbmZsaWN0VHJlZVdhbGsgZXh0ZW5kcyBUcmVlV2FsayB7CiAJICogQHBhcmFtIHJlcG8KIAkgKiAgICAgICAgICAgIHRoZSByZXBvc2l0b3J5IHRoZSB3YWxrZXIgd2lsbCBvYnRhaW4gZGF0YSBmcm9tLgogCSAqLwotCXB1YmxpYyBOYW1lQ29uZmxpY3RUcmVlV2FsayhmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKKwlwdWJsaWMgTmFtZUNvbmZsaWN0VHJlZVdhbGsoUmVwb3NpdG9yeSByZXBvKSB7CiAJCXN1cGVyKHJlcG8pOwogCX0KIApAQCAtMTEyLDcgKzExMiw3IEBAIHB1YmxpYyBOYW1lQ29uZmxpY3RUcmVlV2FsayhmaW5hbCBSZXBvc2l0b3J5IHJlcG8pIHsKIAkgKiAgICAgICAgICAgIHRoZSByZWFkZXIgdGhlIHdhbGtlciB3aWxsIG9idGFpbiB0cmVlIGRhdGEgZnJvbS4KIAkgKiBAc2luY2UgNC4zCiAJICovCi0JcHVibGljIE5hbWVDb25mbGljdFRyZWVXYWxrKEBOdWxsYWJsZSBSZXBvc2l0b3J5IHJlcG8sIGZpbmFsIE9iamVjdFJlYWRlciBvcikgeworCXB1YmxpYyBOYW1lQ29uZmxpY3RUcmVlV2FsayhATnVsbGFibGUgUmVwb3NpdG9yeSByZXBvLCBPYmplY3RSZWFkZXIgb3IpIHsKIAkJc3VwZXIocmVwbywgb3IpOwogCX0KIApAQCAtMTIyLDcgKzEyMiw3IEBAIHB1YmxpYyBOYW1lQ29uZmxpY3RUcmVlV2FsayhATnVsbGFibGUgUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBPYmplY3RSZWFkZXIgb3IpIHsKIAkgKiBAcGFyYW0gb3IKIAkgKiAgICAgICAgICAgIHRoZSByZWFkZXIgdGhlIHdhbGtlciB3aWxsIG9idGFpbiB0cmVlIGRhdGEgZnJvbS4KIAkgKi8KLQlwdWJsaWMgTmFtZUNvbmZsaWN0VHJlZVdhbGsoZmluYWwgT2JqZWN0UmVhZGVyIG9yKSB7CisJcHVibGljIE5hbWVDb25mbGljdFRyZWVXYWxrKE9iamVjdFJlYWRlciBvcikgewogCQlzdXBlcihvcik7CiAJfQogCkBAIC0xMzUsNyArMTM1LDcgQEAgQWJzdHJhY3RUcmVlSXRlcmF0b3IgbWluKCkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCiAJCQlpZiAoaXNUcmVlKG1pblJlZikpIHsKIAkJCQlpZiAoc2tpcEVudHJ5KG1pblJlZikpIHsKLQkJCQkJZm9yIChmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpIHsKKwkJCQkJZm9yIChBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpIHsKIAkJCQkJCWlmICh0Lm1hdGNoZXMgPT0gbWluUmVmKSB7CiAJCQkJCQkJdC5uZXh0KDEpOwogCQkJCQkJCXQubWF0Y2hlcyA9IG51bGw7CkBAIC0yMjIsMTYgKzIyMiwxNiBAQCBwcml2YXRlIGJvb2xlYW4gaXNHaXRsaW5rKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKIAkJcmV0dXJuIEZpbGVNb2RlLkdJVExJTksuZXF1YWxzKHAubW9kZSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1RyZWUoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgcCkgeworCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUcmVlKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHApIHsKIAkJcmV0dXJuIEZpbGVNb2RlLlRSRUUuZXF1YWxzKHAubW9kZSk7CiAJfQogCi0JcHJpdmF0ZSBib29sZWFuIHNraXBFbnRyeShmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBtaW5SZWYpCisJcHJpdmF0ZSBib29sZWFuIHNraXBFbnRyeShBYnN0cmFjdFRyZWVJdGVyYXRvciBtaW5SZWYpCiAJCQl0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCS8vIEEgdHJlZSBEL0YgbWF5IGhhdmUgYmVlbiBoYW5kbGVkIGVhcmxpZXIuIFdlIG5lZWQgdG8KIAkJLy8gbm90IHJlcG9ydCB0aGlzIHBhdGggaWYgaXQgaGFzIGFscmVhZHkgYmVlbiByZXBvcnRlZC4KIAkJLy8KLQkJZm9yIChmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpIHsKKwkJZm9yIChBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpIHsKIAkJCWlmICh0Lm1hdGNoZXMgPT0gbWluUmVmIHx8IHQuZmlyc3QoKSkKIAkJCQljb250aW51ZTsKIApAQCAtMjYwLDE0ICsyNjAsMTQgQEAgcHJpdmF0ZSBib29sZWFuIHNraXBFbnRyeShmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBtaW5SZWYpCiAJCXJldHVybiBmYWxzZTsKIAl9CiAKLQlwcml2YXRlIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNvbWJpbmVERihmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBtaW5SZWYpCisJcHJpdmF0ZSBBYnN0cmFjdFRyZWVJdGVyYXRvciBjb21iaW5lREYoQWJzdHJhY3RUcmVlSXRlcmF0b3IgbWluUmVmKQogCQkJdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQkvLyBMb29rIGZvciBhIHBvc3NpYmxlIEQvRiBjb25mbGljdCBmb3J3YXJkIGluIHRoZSB0cmVlKHMpCiAJCS8vIGFzIHRoZXJlIG1heSBiZSBhICIkcGF0aC8iIHdoaWNoIG1hdGNoZXMgIiRwYXRoIi4gTWFrZQogCQkvLyBzdWNoIGVudHJpZXMgbWF0Y2ggdGhpcyBlbnRyeS4KIAkJLy8KIAkJQWJzdHJhY3RUcmVlSXRlcmF0b3IgdHJlZU1hdGNoID0gbnVsbDsKLQkJZm9yIChmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpIHsKKwkJZm9yIChBYnN0cmFjdFRyZWVJdGVyYXRvciB0IDogdHJlZXMpIHsKIAkJCWlmICh0Lm1hdGNoZXMgPT0gbWluUmVmIHx8IHQuZW9mKCkpCiAJCQkJY29udGludWU7CiAKQEAgLTMwNiw3ICszMDYsNyBAQCBwcml2YXRlIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNvbWJpbmVERihmaW5hbCBBYnN0cmFjdFRyZWVJdGVyYXRvciBtaW5SZWYpCiAJCQkvLyBtYXRjaGluZyBpdGVyYXRvcnMgaW5zdGVhZCBvZiB0aGUgZmlsZSBpdGVyYXRvci4KIAkJCS8vIFRoaXMgd2F5IGlzU3VidHJlZSBpcyB0cnVlIGFuZCBpc1JlY3Vyc2l2ZSB3b3Jrcy4KIAkJCS8vCi0JCQlmb3IgKGZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgOiB0cmVlcykKKwkJCWZvciAoQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKQogCQkJCWlmICh0Lm1hdGNoZXMgPT0gbWluUmVmKQogCQkJCQl0Lm1hdGNoZXMgPSB0cmVlTWF0Y2g7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvVHJlZVdhbGsuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvVHJlZVdhbGsuamF2YQppbmRleCA4ODcyNjg5Li5kNTAwYWFlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1RyZWVXYWxrLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9UcmVlV2Fsay5qYXZhCkBAIC0zMzIsNyArMzMyLDcgQEAgcHVibGljIHN0YXRpYyBUcmVlV2FsayBmb3JQYXRoKGZpbmFsIFJlcG9zaXRvcnkgZGIsIGZpbmFsIFN0cmluZyBwYXRoLAogCSAqICAgICAgICAgICAgT2JqZWN0UmVhZGVyIHdpbGwgYmUgY3JlYXRlZCBieSB0aGUgd2Fsa2VyLCBhbmQgd2lsbCBiZSBjbG9zZWQKIAkgKiAgICAgICAgICAgIHdoZW4gdGhlIHdhbGtlciBpcyBjbG9zZWQuCiAJICovCi0JcHVibGljIFRyZWVXYWxrKGZpbmFsIFJlcG9zaXRvcnkgcmVwbykgeworCXB1YmxpYyBUcmVlV2FsayhSZXBvc2l0b3J5IHJlcG8pIHsKIAkJdGhpcyhyZXBvLCByZXBvLm5ld09iamVjdFJlYWRlcigpLCB0cnVlKTsKIAl9CiAKQEAgLTM0OCw3ICszNDgsNyBAQCBwdWJsaWMgVHJlZVdhbGsoZmluYWwgUmVwb3NpdG9yeSByZXBvKSB7CiAJICogICAgICAgICAgICBpcyBub3QgY2xvc2VkIHdoZW4gdGhlIHdhbGtlciBpcyBjbG9zZWQuCiAJICogQHNpbmNlIDQuMwogCSAqLwotCXB1YmxpYyBUcmVlV2FsayhmaW5hbCBATnVsbGFibGUgUmVwb3NpdG9yeSByZXBvLCBmaW5hbCBPYmplY3RSZWFkZXIgb3IpIHsKKwlwdWJsaWMgVHJlZVdhbGsoQE51bGxhYmxlIFJlcG9zaXRvcnkgcmVwbywgT2JqZWN0UmVhZGVyIG9yKSB7CiAJCXRoaXMocmVwbywgb3IsIGZhbHNlKTsKIAl9CiAKQEAgLTM1OSw3ICszNTksNyBAQCBwdWJsaWMgVHJlZVdhbGsoZmluYWwgQE51bGxhYmxlIFJlcG9zaXRvcnkgcmVwbywgZmluYWwgT2JqZWN0UmVhZGVyIG9yKSB7CiAJICogICAgICAgICAgICB0aGUgcmVhZGVyIHRoZSB3YWxrZXIgd2lsbCBvYnRhaW4gdHJlZSBkYXRhIGZyb20uIFRoZSByZWFkZXIKIAkgKiAgICAgICAgICAgIGlzIG5vdCBjbG9zZWQgd2hlbiB0aGUgd2Fsa2VyIGlzIGNsb3NlZC4KIAkgKi8KLQlwdWJsaWMgVHJlZVdhbGsoZmluYWwgT2JqZWN0UmVhZGVyIG9yKSB7CisJcHVibGljIFRyZWVXYWxrKE9iamVjdFJlYWRlciBvcikgewogCQl0aGlzKG51bGwsIG9yLCBmYWxzZSk7CiAJfQogCkBAIC00NDcsNyArNDQ3LDcgQEAgcHVibGljIFRyZWVGaWx0ZXIgZ2V0RmlsdGVyKCkgewogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIuQW5kVHJlZUZpbHRlcgogCSAqIEBzZWUgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5maWx0ZXIuT3JUcmVlRmlsdGVyCiAJICovCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyKGZpbmFsIFRyZWVGaWx0ZXIgbmV3RmlsdGVyKSB7CisJcHVibGljIHZvaWQgc2V0RmlsdGVyKFRyZWVGaWx0ZXIgbmV3RmlsdGVyKSB7CiAJCWZpbHRlciA9IG5ld0ZpbHRlciAhPSBudWxsID8gbmV3RmlsdGVyIDogVHJlZUZpbHRlci5BTEw7CiAJfQogCkBAIC00NzUsNyArNDc1LDcgQEAgcHVibGljIGJvb2xlYW4gaXNSZWN1cnNpdmUoKSB7CiAJICogQHBhcmFtIGIKIAkgKiAgICAgICAgICAgIHRydWUgdG8gc2tpcCBzdWJ0cmVlIG5vZGVzIGFuZCBvbmx5IG9idGFpbiBmaWxlcyBub2Rlcy4KIAkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWN1cnNpdmUoZmluYWwgYm9vbGVhbiBiKSB7CisJcHVibGljIHZvaWQgc2V0UmVjdXJzaXZlKGJvb2xlYW4gYikgewogCQlyZWN1cnNpdmUgPSBiOwogCX0KIApAQCAtNTA1LDcgKzUwNSw3IEBAIHB1YmxpYyBib29sZWFuIGlzUG9zdE9yZGVyVHJhdmVyc2FsKCkgewogCSAqICAgICAgICAgICAgdHJ1ZSB0byBnZXQgdHJlZXMgYWZ0ZXIgdGhlaXIgY2hpbGRyZW4uCiAJICogQHNlZSAjaXNQb3N0T3JkZXJUcmF2ZXJzYWwoKQogCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc3RPcmRlclRyYXZlcnNhbChmaW5hbCBib29sZWFuIGIpIHsKKwlwdWJsaWMgdm9pZCBzZXRQb3N0T3JkZXJUcmF2ZXJzYWwoYm9vbGVhbiBiKSB7CiAJCXBvc3RPcmRlclRyYXZlcnNhbCA9IGI7CiAJfQogCkBAIC02MzMsMjIgKzYzMyw2IEBAIHB1YmxpYyBFb2xTdHJlYW1UeXBlIGdldEVvbFN0cmVhbVR5cGUoT3BlcmF0aW9uVHlwZSBvcFR5cGUpIHsKIAl9CiAKIAkvKioKLQkgKiBHZXQgdGhlIEVPTCBzdHJlYW0gdHlwZSBvZiB0aGUgY3VycmVudCBlbnRyeSB1c2luZyB0aGUgY29uZmlnIGFuZAotCSAqIHtAbGluayAjZ2V0QXR0cmlidXRlcygpfS4KLQkgKgotCSAqIEByZXR1cm4gdGhlIEVPTCBzdHJlYW0gdHlwZSBvZiB0aGUgY3VycmVudCBlbnRyeSB1c2luZyB0aGUgY29uZmlnIGFuZAotCSAqICAgICAgICAge0BsaW5rICNnZXRBdHRyaWJ1dGVzKCl9LiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsCi0JICogICAgICAgICBpZiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuVHJlZVdhbGt9IGlzIG5vdCBiYXNlZCBvbgotCSAqICAgICAgICAgYSB3b3JraW5nIHRyZWUKLQkgKiBAc2luY2UgNC4zCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjZ2V0RW9sU3RyZWFtVHlwZShPcGVyYXRpb25UeXBlKX0gaW5zdGVhZC4KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBATnVsbGFibGUgRW9sU3RyZWFtVHlwZSBnZXRFb2xTdHJlYW1UeXBlKCkgewotCQlyZXR1cm4gKGdldEVvbFN0cmVhbVR5cGUob3BlcmF0aW9uVHlwZSkpOwotCX0KLQotCS8qKgogCSAqIFJlc2V0IHRoaXMgd2Fsa2VyIHNvIG5ldyB0cmVlIGl0ZXJhdG9ycyBjYW4gYmUgYWRkZWQgdG8gaXQuCiAJICovCiAJcHVibGljIHZvaWQgcmVzZXQoKSB7CkBAIC02NzcsNyArNjYxLDcgQEAgcHVibGljIHZvaWQgcmVzZXQoKSB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSBsb29zZSBvYmplY3Qgb3IgcGFjayBmaWxlIGNvdWxkIG5vdCBiZSByZWFkLgogCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlwdWJsaWMgdm9pZCByZXNldChBbnlPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCWlmICh0cmVlcy5sZW5ndGggPT0gMSkgewogCQkJQWJzdHJhY3RUcmVlSXRlcmF0b3IgbyA9IHRyZWVzWzBdOwpAQCAtNzE4LDcgKzcwMiw3IEBAIHB1YmxpYyB2b2lkIHJlc2V0KGZpbmFsIEFueU9iamVjdElkIGlkKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBhIGxvb3NlIG9iamVjdCBvciBwYWNrIGZpbGUgY291bGQgbm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHZvaWQgcmVzZXQoZmluYWwgQW55T2JqZWN0SWQuLi4gaWRzKSB0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwKKwlwdWJsaWMgdm9pZCByZXNldChBbnlPYmplY3RJZC4uLiBpZHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCQkJSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlmaW5hbCBpbnQgb2xkTGVuID0gdHJlZXMubGVuZ3RoOwogCQlmaW5hbCBpbnQgbmV3TGVuID0gaWRzLmxlbmd0aDsKQEAgLTc3Myw3ICs3NTcsNyBAQCBwdWJsaWMgdm9pZCByZXNldChmaW5hbCBBbnlPYmplY3RJZC4uLiBpZHMpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIGEgbG9vc2Ugb2JqZWN0IG9yIHBhY2sgZmlsZSBjb3VsZCBub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgaW50IGFkZFRyZWUoZmluYWwgQW55T2JqZWN0SWQgaWQpIHRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLAorCXB1YmxpYyBpbnQgYWRkVHJlZShBbnlPYmplY3RJZCBpZCkgdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sCiAJCQlJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLCBDb3JydXB0T2JqZWN0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBhZGRUcmVlKHBhcnNlckZvcihpZCkpOwogCX0KQEAgLTkzNiw3ICs5MjAsNyBAQCBwdWJsaWMgPFQgZXh0ZW5kcyBBYnN0cmFjdFRyZWVJdGVyYXRvcj4gVCBnZXRUcmVlKGZpbmFsIGludCBudGgsCiAJICogQHJldHVybiBtb2RlIGJpdHMgZm9yIHRoZSBjdXJyZW50IGVudHJ5IG9mIHRoZSBudGggdHJlZS4KIAkgKiBAc2VlIEZpbGVNb2RlI2Zyb21CaXRzKGludCkKIAkgKi8KLQlwdWJsaWMgaW50IGdldFJhd01vZGUoZmluYWwgaW50IG50aCkgeworCXB1YmxpYyBpbnQgZ2V0UmF3TW9kZShpbnQgbnRoKSB7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgPSB0cmVlc1tudGhdOwogCQlyZXR1cm4gdC5tYXRjaGVzID09IGN1cnJlbnRIZWFkID8gdC5tb2RlIDogMDsKIAl9CkBAIC05NTIsNyArOTM2LDcgQEAgcHVibGljIGludCBnZXRSYXdNb2RlKGZpbmFsIGludCBudGgpIHsKIAkgKiAgICAgICAgICAgIHRyZWUgdG8gb2J0YWluIHRoZSBtb2RlIGZyb20uCiAJICogQHJldHVybiBtb2RlIGZvciB0aGUgY3VycmVudCBlbnRyeSBvZiB0aGUgbnRoIHRyZWUuCiAJICovCi0JcHVibGljIEZpbGVNb2RlIGdldEZpbGVNb2RlKGZpbmFsIGludCBudGgpIHsKKwlwdWJsaWMgRmlsZU1vZGUgZ2V0RmlsZU1vZGUoaW50IG50aCkgewogCQlyZXR1cm4gRmlsZU1vZGUuZnJvbUJpdHMoZ2V0UmF3TW9kZShudGgpKTsKIAl9CiAKQEAgLTk4Nyw3ICs5NzEsNyBAQCBwdWJsaWMgRmlsZU1vZGUgZ2V0RmlsZU1vZGUoKSB7CiAJICogQHNlZSAjZ2V0T2JqZWN0SWQoTXV0YWJsZU9iamVjdElkLCBpbnQpCiAJICogQHNlZSAjaWRFcXVhbChpbnQsIGludCkKIAkgKi8KLQlwdWJsaWMgT2JqZWN0SWQgZ2V0T2JqZWN0SWQoZmluYWwgaW50IG50aCkgeworCXB1YmxpYyBPYmplY3RJZCBnZXRPYmplY3RJZChpbnQgbnRoKSB7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgPSB0cmVlc1tudGhdOwogCQlyZXR1cm4gdC5tYXRjaGVzID09IGN1cnJlbnRIZWFkID8gdC5nZXRFbnRyeU9iamVjdElkKCkgOiBPYmplY3RJZAogCQkJCS56ZXJvSWQoKTsKQEAgLTEwMDksNyArOTkzLDcgQEAgcHVibGljIE9iamVjdElkIGdldE9iamVjdElkKGZpbmFsIGludCBudGgpIHsKIAkgKiAgICAgICAgICAgIHRyZWUgdG8gb2J0YWluIHRoZSBvYmplY3QgaWRlbnRpZmllciBmcm9tLgogCSAqIEBzZWUgI2lkRXF1YWwoaW50LCBpbnQpCiAJICovCi0JcHVibGljIHZvaWQgZ2V0T2JqZWN0SWQoZmluYWwgTXV0YWJsZU9iamVjdElkIG91dCwgZmluYWwgaW50IG50aCkgeworCXB1YmxpYyB2b2lkIGdldE9iamVjdElkKE11dGFibGVPYmplY3RJZCBvdXQsIGludCBudGgpIHsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA9IHRyZWVzW250aF07CiAJCWlmICh0Lm1hdGNoZXMgPT0gY3VycmVudEhlYWQpCiAJCQl0LmdldEVudHJ5T2JqZWN0SWQob3V0KTsKQEAgLTEwMjgsNyArMTAxMiw3IEBAIHB1YmxpYyB2b2lkIGdldE9iamVjdElkKGZpbmFsIE11dGFibGVPYmplY3RJZCBvdXQsIGZpbmFsIGludCBudGgpIHsKIAkgKiAgICAgICAgIDxjb2RlPmdldE9iamVjdElkKG50aEEpLmVxdWFscyhnZXRPYmplY3RJZChudGhCKSk8L2NvZGU+LgogCSAqIEBzZWUgI2dldE9iamVjdElkKGludCkKIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpZEVxdWFsKGZpbmFsIGludCBudGhBLCBmaW5hbCBpbnQgbnRoQikgeworCXB1YmxpYyBib29sZWFuIGlkRXF1YWwoaW50IG50aEEsIGludCBudGhCKSB7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGNoID0gY3VycmVudEhlYWQ7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIGEgPSB0cmVlc1tudGhBXTsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgYiA9IHRyZWVzW250aEJdOwpAQCAtMTEyNiw3ICsxMTEwLDcgQEAgcHVibGljIGludCBnZXRQYXRoTGVuZ3RoKCkgewogCSAqICAgICAgICAgYWdhaW4gb24gdGhpcyB0cmVlIHdhbGsuCiAJICogQHNpbmNlIDQuNwogCSAqLwotCXB1YmxpYyBpbnQgaXNQYXRoTWF0Y2goZmluYWwgYnl0ZVtdIHAsIGZpbmFsIGludCBwTGVuKSB7CisJcHVibGljIGludCBpc1BhdGhNYXRjaChieXRlW10gcCwgaW50IHBMZW4pIHsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA9IGN1cnJlbnRIZWFkOwogCQlmaW5hbCBieXRlW10gYyA9IHQucGF0aDsKIAkJZmluYWwgaW50IGNMZW4gPSB0LnBhdGhMZW47CkBAIC0xMTc5LDcgKzExNjMsNyBAQCBwdWJsaWMgaW50IGlzUGF0aE1hdGNoKGZpbmFsIGJ5dGVbXSBwLCBmaW5hbCBpbnQgcExlbikgewogCSAqICAgICAgICAgcGF0aDsgMSBpZiB0aGUgY3VycmVudCBwYXRoIGlzIHBhc3QgcCBhbmQgcCB3aWxsIG5ldmVyIG1hdGNoCiAJICogICAgICAgICBhZ2FpbiBvbiB0aGlzIHRyZWUgd2Fsay4KIAkgKi8KLQlwdWJsaWMgaW50IGlzUGF0aFByZWZpeChmaW5hbCBieXRlW10gcCwgZmluYWwgaW50IHBMZW4pIHsKKwlwdWJsaWMgaW50IGlzUGF0aFByZWZpeChieXRlW10gcCwgaW50IHBMZW4pIHsKIAkJZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA9IGN1cnJlbnRIZWFkOwogCQlmaW5hbCBieXRlW10gYyA9IHQucGF0aDsKIAkJZmluYWwgaW50IGNMZW4gPSB0LnBhdGhMZW47CkBAIC0xMjI5LDcgKzEyMTMsNyBAQCBwdWJsaWMgaW50IGlzUGF0aFByZWZpeChmaW5hbCBieXRlW10gcCwgZmluYWwgaW50IHBMZW4pIHsKIAkgKiBAcmV0dXJuIHRydWUgaWYgcCBpcyBzdWZmaXggb2YgdGhlIGN1cnJlbnQgcGF0aDsKIAkgKiAgICAgICAgIGZhbHNlIGlmIG90aGVyd2lzZQogCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUGF0aFN1ZmZpeChmaW5hbCBieXRlW10gcCwgZmluYWwgaW50IHBMZW4pIHsKKwlwdWJsaWMgYm9vbGVhbiBpc1BhdGhTdWZmaXgoYnl0ZVtdIHAsIGludCBwTGVuKSB7CiAJCWZpbmFsIEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQgPSBjdXJyZW50SGVhZDsKIAkJZmluYWwgYnl0ZVtdIGMgPSB0LnBhdGg7CiAJCWZpbmFsIGludCBjTGVuID0gdC5wYXRoTGVuOwpAQCAtMTM3Nyw3ICsxMzYxLDcgQEAgdm9pZCBleGl0U3VidHJlZSgpIHsKIAkJCXRyZWVzW2ldID0gdHJlZXNbaV0ucGFyZW50OwogCiAJCUFic3RyYWN0VHJlZUl0ZXJhdG9yIG1pblJlZiA9IG51bGw7Ci0JCWZvciAoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CisJCWZvciAoQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCA6IHRyZWVzKSB7CiAJCQlpZiAodC5tYXRjaGVzICE9IHQpCiAJCQkJY29udGludWU7CiAJCQlpZiAobWluUmVmID09IG51bGwgfHwgdC5wYXRoQ29tcGFyZShtaW5SZWYpIDwgMCkKQEAgLTEzODYsMTggKzEzNzAsMTggQEAgdm9pZCBleGl0U3VidHJlZSgpIHsKIAkJY3VycmVudEhlYWQgPSBtaW5SZWY7CiAJfQogCi0JcHJpdmF0ZSBDYW5vbmljYWxUcmVlUGFyc2VyIHBhcnNlckZvcihmaW5hbCBBbnlPYmplY3RJZCBpZCkKKwlwcml2YXRlIENhbm9uaWNhbFRyZWVQYXJzZXIgcGFyc2VyRm9yKEFueU9iamVjdElkIGlkKQogCQkJdGhyb3dzIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgQ2Fub25pY2FsVHJlZVBhcnNlciBwID0gbmV3IENhbm9uaWNhbFRyZWVQYXJzZXIoKTsKIAkJcC5yZXNldChyZWFkZXIsIGlkKTsKIAkJcmV0dXJuIHA7CiAJfQogCi0Jc3RhdGljIFN0cmluZyBwYXRoT2YoZmluYWwgQWJzdHJhY3RUcmVlSXRlcmF0b3IgdCkgeworCXN0YXRpYyBTdHJpbmcgcGF0aE9mKEFic3RyYWN0VHJlZUl0ZXJhdG9yIHQpIHsKIAkJcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKENvbnN0YW50cy5DSEFSU0VULCB0LnBhdGgsIDAsIHQucGF0aExlbik7CiAJfQogCi0Jc3RhdGljIFN0cmluZyBwYXRoT2YoZmluYWwgYnl0ZVtdIGJ1ZiwgaW50IHBvcywgaW50IGVuZCkgeworCXN0YXRpYyBTdHJpbmcgcGF0aE9mKGJ5dGVbXSBidWYsIGludCBwb3MsIGludCBlbmQpIHsKIAkJcmV0dXJuIFJhd1BhcnNlVXRpbHMuZGVjb2RlKENvbnN0YW50cy5DSEFSU0VULCBidWYsIHBvcywgZW5kKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVJdGVyYXRvci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZUl0ZXJhdG9yLmphdmEKaW5kZXggNjhjYzdjYi4uMTc5ZmQ0NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZUl0ZXJhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZUl0ZXJhdG9yLmphdmEKQEAgLTIxMSw3ICsyMTEsNyBAQCBwcm90ZWN0ZWQgV29ya2luZ1RyZWVJdGVyYXRvcihmaW5hbCBTdHJpbmcgcHJlZml4LAogCSAqIEBwYXJhbSBwCiAJICogICAgICAgICAgICBwYXJlbnQgdHJlZSBpdGVyYXRvci4KIAkgKi8KLQlwcm90ZWN0ZWQgV29ya2luZ1RyZWVJdGVyYXRvcihmaW5hbCBXb3JraW5nVHJlZUl0ZXJhdG9yIHApIHsKKwlwcm90ZWN0ZWQgV29ya2luZ1RyZWVJdGVyYXRvcihXb3JraW5nVHJlZUl0ZXJhdG9yIHApIHsKIAkJc3VwZXIocCk7CiAJCXN0YXRlID0gcC5zdGF0ZTsKIAkJcmVwb3NpdG9yeSA9IHAucmVwb3NpdG9yeTsKQEAgLTI1Niw2ICsyNTYsNDUgQEAgcHVibGljIHZvaWQgc2V0RGlyQ2FjaGVJdGVyYXRvcihUcmVlV2FsayB3YWxrLCBpbnQgdHJlZUlkKSB7CiAJCXN0YXRlLmRpckNhY2hlVHJlZSA9IHRyZWVJZDsKIAl9CiAKKwkvKioKKwkgKiBSZXRyaWV2ZXMgdGhlIHtAbGluayBEaXJDYWNoZUl0ZXJhdG9yfSBhdCB0aGUgY3VycmVudCBlbnRyeSBpZgorCSAqIHtAbGluayAjc2V0RGlyQ2FjaGVJdGVyYXRvcihUcmVlV2FsaywgaW50KX0gd2FzIGNhbGxlZC4KKwkgKgorCSAqIEByZXR1cm4gdGhlIERpckNhY2hlSXRlcmF0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3Qgc2V0IG9yIG5vdCBhdCB0aGUKKwkgKiAgICAgICAgIGN1cnJlbnQgZW50cnkKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHJvdGVjdGVkIERpckNhY2hlSXRlcmF0b3IgZ2V0RGlyQ2FjaGVJdGVyYXRvcigpIHsKKwkJaWYgKHN0YXRlLmRpckNhY2hlVHJlZSA+PSAwICYmIHN0YXRlLndhbGsgIT0gbnVsbCkgeworCQkJcmV0dXJuIHN0YXRlLndhbGsuZ2V0VHJlZShzdGF0ZS5kaXJDYWNoZVRyZWUsCisJCQkJCURpckNhY2hlSXRlcmF0b3IuY2xhc3MpOworCQl9CisJCXJldHVybiBudWxsOworCX0KKworCS8qKgorCSAqIERlZmluZXMgd2hldGhlciB0aGlzIHtAbGluayBXb3JraW5nVHJlZUl0ZXJhdG9yfSB3YWxrcyBpZ25vcmVkCisJICogZGlyZWN0b3JpZXMuCisJICoKKwkgKiBAcGFyYW0gaW5jbHVkZUlnbm9yZWQKKwkgKiAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gdG8gc2tpcCBpZ25vcmVkIGRpcmVjdG9yaWVzLCBpZiBwb3NzaWJsZTsKKwkgKiAgICAgICAgICAgIHtAY29kZSB0cnVlfSB0byBhbHdheXMgaW5jbHVkZSB0aGVtIGluIHRoZSB3YWxrCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyB2b2lkIHNldFdhbGtJZ25vcmVkRGlyZWN0b3JpZXMoYm9vbGVhbiBpbmNsdWRlSWdub3JlZCkgeworCQlzdGF0ZS53YWxrSWdub3JlZCA9IGluY2x1ZGVJZ25vcmVkOworCX0KKworCS8qKgorCSAqIFRlbGxzIHdoZXRoZXIgdGhpcyB7QGxpbmsgV29ya2luZ1RyZWVJdGVyYXRvcn0gd2Fsa3MgaWdub3JlZCBkaXJlY3Rvcmllcy4KKwkgKgorCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGl0IGRvZXMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBib29sZWFuIHdhbGtzSWdub3JlZERpcmVjdG9yaWVzKCkgeworCQlyZXR1cm4gc3RhdGUud2Fsa0lnbm9yZWQ7CisJfQorCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKIAlwdWJsaWMgYm9vbGVhbiBoYXNJZCgpIHsKQEAgLTM0MCwzMCArMzc5LDIyIEBAIHB1YmxpYyBib29sZWFuIGlzV29ya1RyZWUoKSB7CiAJICogQHJldHVybiBub24tbnVsbCBzdWJtb2R1bGUgaWQKIAkgKi8KIAlwcm90ZWN0ZWQgYnl0ZVtdIGlkU3VibW9kdWxlKEZpbGUgZGlyZWN0b3J5LCBFbnRyeSBlKSB7Ci0JCWZpbmFsIFJlcG9zaXRvcnkgc3VibW9kdWxlUmVwbzsKLQkJdHJ5IHsKLQkJCXN1Ym1vZHVsZVJlcG8gPSBTdWJtb2R1bGVXYWxrLmdldFN1Ym1vZHVsZVJlcG9zaXRvcnkoZGlyZWN0b3J5LAotCQkJCQllLmdldE5hbWUoKSwKLQkJCQkJcmVwb3NpdG9yeSAhPSBudWxsID8gcmVwb3NpdG9yeS5nZXRGUygpIDogRlMuREVURUNURUQpOworCQl0cnkgKFJlcG9zaXRvcnkgc3VibW9kdWxlUmVwbyA9IFN1Ym1vZHVsZVdhbGsuZ2V0U3VibW9kdWxlUmVwb3NpdG9yeSgKKwkJCQlkaXJlY3RvcnksIGUuZ2V0TmFtZSgpLAorCQkJCXJlcG9zaXRvcnkgIT0gbnVsbCA/IHJlcG9zaXRvcnkuZ2V0RlMoKSA6IEZTLkRFVEVDVEVEKSkgeworCQkJaWYgKHN1Ym1vZHVsZVJlcG8gPT0gbnVsbCkgeworCQkJCXJldHVybiB6ZXJvaWQ7CisJCQl9CisJCQlPYmplY3RJZCBoZWFkID0gc3VibW9kdWxlUmVwby5yZXNvbHZlKENvbnN0YW50cy5IRUFEKTsKKwkJCWlmIChoZWFkID09IG51bGwpIHsKKwkJCQlyZXR1cm4gemVyb2lkOworCQkJfQorCQkJYnl0ZVtdIGlkID0gbmV3IGJ5dGVbQ29uc3RhbnRzLk9CSkVDVF9JRF9MRU5HVEhdOworCQkJaGVhZC5jb3B5UmF3VG8oaWQsIDApOworCQkJcmV0dXJuIGlkOwogCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKIAkJCXJldHVybiB6ZXJvaWQ7CiAJCX0KLQkJaWYgKHN1Ym1vZHVsZVJlcG8gPT0gbnVsbCkKLQkJCXJldHVybiB6ZXJvaWQ7Ci0KLQkJZmluYWwgT2JqZWN0SWQgaGVhZDsKLQkJdHJ5IHsKLQkJCWhlYWQgPSBzdWJtb2R1bGVSZXBvLnJlc29sdmUoQ29uc3RhbnRzLkhFQUQpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCXJldHVybiB6ZXJvaWQ7Ci0JCX0gZmluYWxseSB7Ci0JCQlzdWJtb2R1bGVSZXBvLmNsb3NlKCk7Ci0JCX0KLQkJaWYgKGhlYWQgPT0gbnVsbCkKLQkJCXJldHVybiB6ZXJvaWQ7Ci0JCWZpbmFsIGJ5dGVbXSBpZCA9IG5ldyBieXRlW0NvbnN0YW50cy5PQkpFQ1RfSURfTEVOR1RIXTsKLQkJaGVhZC5jb3B5UmF3VG8oaWQsIDApOwotCQlyZXR1cm4gaWQ7CiAJfQogCiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGRpZ2l0cyA9IHsgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLApAQCAtMzcyLDcgKzQwMyw3IEBAIHB1YmxpYyBib29sZWFuIGlzV29ya1RyZWUoKSB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGhibG9iID0gQ29uc3RhbnRzCiAJCQkuZW5jb2RlZFR5cGVTdHJpbmcoQ29uc3RhbnRzLk9CSl9CTE9CKTsKIAotCXByaXZhdGUgYnl0ZVtdIGlkQnVmZmVyQmxvYihmaW5hbCBFbnRyeSBlKSB7CisJcHJpdmF0ZSBieXRlW10gaWRCdWZmZXJCbG9iKEVudHJ5IGUpIHsKIAkJdHJ5IHsKIAkJCWZpbmFsIElucHV0U3RyZWFtIGlzID0gZS5vcGVuSW5wdXRTdHJlYW0oKTsKIAkJCWlmIChpcyA9PSBudWxsKQpAQCAtNDMwLDcgKzQ2MSw3IEBAICYmIGdldEVvbFN0cmVhbVR5cGUob3BUeXBlKSA9PSBFb2xTdHJlYW1UeXBlLkRJUkVDVCkgewogCQlyZXR1cm4gZmlsdGVyQ2xlYW4oaXMsIG9wVHlwZSk7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzYWZlQ2xvc2UoZmluYWwgSW5wdXRTdHJlYW0gaW4pIHsKKwlwcml2YXRlIHN0YXRpYyB2b2lkIHNhZmVDbG9zZShJbnB1dFN0cmVhbSBpbikgewogCQl0cnkgewogCQkJaW4uY2xvc2UoKTsKIAkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZXJyMikgewpAQCAtNTQ4LDcgKzU3OSw3IEBAIHB1YmxpYyBib29sZWFuIGVvZigpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgbmV4dChmaW5hbCBpbnQgZGVsdGEpIHRocm93cyBDb3JydXB0T2JqZWN0RXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBuZXh0KGludCBkZWx0YSkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCQlwdHIgKz0gZGVsdGE7CiAJCWlmICghZW9mKCkpIHsKIAkJCXBhcnNlRW50cnkoKTsKQEAgLTU1Nyw3ICs1ODgsNyBAQCBwdWJsaWMgdm9pZCBuZXh0KGZpbmFsIGludCBkZWx0YSkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24gewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCBiYWNrKGZpbmFsIGludCBkZWx0YSkgdGhyb3dzIENvcnJ1cHRPYmplY3RFeGNlcHRpb24geworCXB1YmxpYyB2b2lkIGJhY2soaW50IGRlbHRhKSB0aHJvd3MgQ29ycnVwdE9iamVjdEV4Y2VwdGlvbiB7CiAJCXB0ciAtPSBkZWx0YTsKIAkJcGFyc2VFbnRyeSgpOwogCX0KQEAgLTY2Miw3ICs2OTMsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc0VudHJ5SWdub3JlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSByZWxldmFudCBpZ25vcmUgcnVsZSBmaWxlIGV4aXN0cyBidXQgY2Fubm90IGJlIHJlYWQuCiAJICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRyeUlnbm9yZWQoZmluYWwgaW50IHBMZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHJvdGVjdGVkIGJvb2xlYW4gaXNFbnRyeUlnbm9yZWQoaW50IHBMZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXJldHVybiBpc0VudHJ5SWdub3JlZChwTGVuLCBtb2RlKTsKIAl9CiAKQEAgLTY3Nyw3ICs3MDgsNyBAQCBwcm90ZWN0ZWQgYm9vbGVhbiBpc0VudHJ5SWdub3JlZChmaW5hbCBpbnQgcExlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAJICogICAgICAgICAgICAgYSByZWxldmFudCBpZ25vcmUgcnVsZSBmaWxlIGV4aXN0cyBidXQgY2Fubm90IGJlIHJlYWQuCiAJICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW50cnlJZ25vcmVkKGZpbmFsIGludCBwTGVuLCBpbnQgZmlsZU1vZGUpCisJcHJpdmF0ZSBib29sZWFuIGlzRW50cnlJZ25vcmVkKGludCBwTGVuLCBpbnQgZmlsZU1vZGUpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQkvLyBUaGUgaWdub3JlIGNvZGUgd2FudHMgcGF0aCB0byBzdGFydCB3aXRoIGEgJy8nIGlmIHBvc3NpYmxlLgogCQkvLyBJZiB3ZSBoYXZlIHRoZSAnLycgaW4gb3VyIHBhdGggYnVmZmVyIGJlY2F1c2Ugd2UgYXJlIGluc2lkZQpAQCAtNzU2LDcgKzc4Nyw3IEBAIHB1YmxpYyBpbnQgY29tcGFyZShFbnRyeSBhLCBFbnRyeSBiKSB7CiAJICogICAgICAgICAgICBmaWxlcyBpbiB0aGUgc3VidHJlZSBvZiB0aGUgd29yayB0cmVlIHRoaXMgaXRlcmF0b3Igb3BlcmF0ZXMKIAkgKiAgICAgICAgICAgIG9uCiAJICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdChmaW5hbCBFbnRyeVtdIGxpc3QpIHsKKwlwcm90ZWN0ZWQgdm9pZCBpbml0KEVudHJ5W10gbGlzdCkgewogCQkvLyBGaWx0ZXIgb3V0IG51bGxzLCAuIGFuZCAuLiBhcyB0aGVzZSBhcmUgbm90IHZhbGlkIHRyZWUgZW50cmllcywKIAkJLy8gYWxzbyBjYWNoZSB0aGUgZW5jb2RlZCBmb3JtcyBvZiB0aGUgcGF0aCBuYW1lcyBmb3IgZWZmaWNpZW50IHVzZQogCQkvLyBsYXRlciBvbiBkdXJpbmcgc29ydGluZyBhbmQgaXRlcmF0aW9uLgpAQCAtODM4LDcgKzg2OSw3IEBAIHB1YmxpYyBlbnVtIE1ldGFkYXRhRGlmZiB7CiAJICogICAgICAgICAgICBhbiBpbnQuCiAJICogQHJldHVybiB0cnVlIGlmIGRpZmZlcmVudCwgZmFsc2Ugb3RoZXJ3aXNlCiAJICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlRGlmZmVyZW50KGZpbmFsIGludCByYXdNb2RlKSB7CisJcHVibGljIGJvb2xlYW4gaXNNb2RlRGlmZmVyZW50KGludCByYXdNb2RlKSB7CiAJCS8vIERldGVybWluZSBkaWZmZXJlbmNlIGluIG1vZGUtYml0cyBvZiBmaWxlIGFuZCBpbmRleC1lbnRyeS4gSW4gdGhlCiAJCS8vIGJpdHdpc2UgcHJlc2VudGF0aW9uIG9mIG1vZGVEaWZmIHdlJ2xsIGhhdmUgYSAnMScgd2hlbiB0aGUgdHdvIG1vZGVzCiAJCS8vIGRpZmZlciBhdCB0aGlzIHBvc2l0aW9uLgpAQCAtOTkyLDcgKzEwMjMsNyBAQCBwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKERpckNhY2hlRW50cnkgZW50cnksIGJvb2xlYW4gZm9yY2VDb250ZW50Q2hlY2ssCiAJICogICAgICAgICAgICBhdmFpbGFibGUgYXQgdGhpcyBpdGVyYXRvcidzIGN1cnJlbnQgZW50cnkKIAkgKiBAcmV0dXJuIGluZGV4IGZpbGUgbW9kZQogCSAqLwotCXB1YmxpYyBGaWxlTW9kZSBnZXRJbmRleEZpbGVNb2RlKGZpbmFsIERpckNhY2hlSXRlcmF0b3IgaW5kZXhJdGVyKSB7CisJcHVibGljIEZpbGVNb2RlIGdldEluZGV4RmlsZU1vZGUoRGlyQ2FjaGVJdGVyYXRvciBpbmRleEl0ZXIpIHsKIAkJZmluYWwgRmlsZU1vZGUgd3RNb2RlID0gZ2V0RW50cnlGaWxlTW9kZSgpOwogCQlpZiAoaW5kZXhJdGVyID09IG51bGwpIHsKIAkJCXJldHVybiB3dE1vZGU7CkBAIC0xMTczLDEzICsxMjA0LDE3IEBAIHByaXZhdGUgc3RhdGljIGxvbmcgY29tcHV0ZUxlbmd0aChJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmV0dXJuIGNvbnRlbnREaWdlc3QuZGlnZXN0KCk7CiAJfQogCi0JLyoqIEEgc2luZ2xlIGVudHJ5IHdpdGhpbiBhIHdvcmtpbmcgZGlyZWN0b3J5IHRyZWUuICovCi0JcHJvdGVjdGVkIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBFbnRyeSB7CisJLyoqCisJICogQSBzaW5nbGUgZW50cnkgd2l0aGluIGEgd29ya2luZyBkaXJlY3RvcnkgdHJlZS4KKwkgKgorCSAqIEBzaW5jZSA1LjAKKwkgKi8KKwlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEVudHJ5IHsKIAkJYnl0ZVtdIGVuY29kZWROYW1lOwogCiAJCWludCBlbmNvZGVkTmFtZUxlbjsKIAotCQl2b2lkIGVuY29kZU5hbWUoZmluYWwgQ2hhcnNldEVuY29kZXIgZW5jKSB7CisJCXZvaWQgZW5jb2RlTmFtZShDaGFyc2V0RW5jb2RlciBlbmMpIHsKIAkJCWZpbmFsIEJ5dGVCdWZmZXIgYjsKIAkJCXRyeSB7CiAJCQkJYiA9IGVuYy5lbmNvZGUoQ2hhckJ1ZmZlci53cmFwKGdldE5hbWUoKSkpOwpAQCAtMTI4MCwxMSArMTMxNSw4IEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIFBlckRpcmVjdG9yeUlnbm9yZU5vZGUgZXh0ZW5kcyBJZ25vcmVOb2RlIHsKIAogCQlJZ25vcmVOb2RlIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJSWdub3JlTm9kZSByID0gbmV3IElnbm9yZU5vZGUoKTsKLQkJCUlucHV0U3RyZWFtIGluID0gZW50cnkub3BlbklucHV0U3RyZWFtKCk7Ci0JCQl0cnkgeworCQkJdHJ5IChJbnB1dFN0cmVhbSBpbiA9IGVudHJ5Lm9wZW5JbnB1dFN0cmVhbSgpKSB7CiAJCQkJci5wYXJzZShpbik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluLmNsb3NlKCk7CiAJCQl9CiAJCQlyZXR1cm4gci5nZXRSdWxlcygpLmlzRW1wdHkoKSA/IG51bGwgOiByOwogCQl9CkBAIC0xMzMyLDExICsxMzY0LDggQEAgSWdub3JlTm9kZSBsb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkUnVsZXNGcm9tRmlsZShJZ25vcmVOb2RlIHIsIEZpbGUgZXhjbHVkZSkKIAkJCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CiAJCQlpZiAoRlMuREVURUNURUQuZXhpc3RzKGV4Y2x1ZGUpKSB7Ci0JCQkJRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShleGNsdWRlKTsKLQkJCQl0cnkgeworCQkJCXRyeSAoRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShleGNsdWRlKSkgewogCQkJCQlyLnBhcnNlKGluKTsKLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpbi5jbG9zZSgpOwogCQkJCX0KIAkJCX0KIAkJfQpAQCAtMTM1MywxMSArMTM4Miw4IEBAIHByaXZhdGUgc3RhdGljIGNsYXNzIFBlckRpcmVjdG9yeUF0dHJpYnV0ZXNOb2RlIGV4dGVuZHMgQXR0cmlidXRlc05vZGUgewogCiAJCUF0dHJpYnV0ZXNOb2RlIGxvYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQkJQXR0cmlidXRlc05vZGUgciA9IG5ldyBBdHRyaWJ1dGVzTm9kZSgpOwotCQkJSW5wdXRTdHJlYW0gaW4gPSBlbnRyeS5vcGVuSW5wdXRTdHJlYW0oKTsKLQkJCXRyeSB7CisJCQl0cnkgKElucHV0U3RyZWFtIGluID0gZW50cnkub3BlbklucHV0U3RyZWFtKCkpIHsKIAkJCQlyLnBhcnNlKGluKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJaW4uY2xvc2UoKTsKIAkJCX0KIAkJCXJldHVybiByLmdldFJ1bGVzKCkuaXNFbXB0eSgpID8gbnVsbCA6IHI7CiAJCX0KQEAgLTEzNzgsNyArMTQwNCwxMCBAQCBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBJdGVyYXRvclN0YXRlIHsKIAkJVHJlZVdhbGsgd2FsazsKIAogCQkvKiogUG9zaXRpb24gb2YgdGhlIG1hdGNoaW5nIHtAbGluayBEaXJDYWNoZUl0ZXJhdG9yfS4gKi8KLQkJaW50IGRpckNhY2hlVHJlZTsKKwkJaW50IGRpckNhY2hlVHJlZSA9IC0xOworCisJCS8qKiBXaGV0aGVyIHRoZSBpdGVyYXRvciBzaGFsbCB3YWxrIGlnbm9yZWQgZGlyZWN0b3JpZXMuICovCisJCWJvb2xlYW4gd2Fsa0lnbm9yZWQgPSBmYWxzZTsKIAogCQlmaW5hbCBNYXA8U3RyaW5nLCBCb29sZWFuPiBkaXJlY3RvcnlUb0lnbm9yZWQgPSBuZXcgSGFzaE1hcDw+KCk7CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVPcHRpb25zLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL1dvcmtpbmdUcmVlT3B0aW9ucy5qYXZhCmluZGV4IDJkZmIyMDMuLjg0NmZiNmUgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvV29ya2luZ1RyZWVPcHRpb25zLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9Xb3JraW5nVHJlZU9wdGlvbnMuamF2YQpAQCAtNzQsNyArNzQsNyBAQCBwdWJsaWMgY2xhc3MgV29ya2luZ1RyZWVPcHRpb25zIHsKIAogCXByaXZhdGUgZmluYWwgYm9vbGVhbiBkaXJOb0dpdExpbmtzOwogCi0JcHJpdmF0ZSBXb3JraW5nVHJlZU9wdGlvbnMoZmluYWwgQ29uZmlnIHJjKSB7CisJcHJpdmF0ZSBXb3JraW5nVHJlZU9wdGlvbnMoQ29uZmlnIHJjKSB7CiAJCWZpbGVNb2RlID0gcmMuZ2V0Qm9vbGVhbihDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwKIAkJCQlDb25maWdDb25zdGFudHMuQ09ORklHX0tFWV9GSUxFTU9ERSwgdHJ1ZSk7CiAJCWF1dG9DUkxGID0gcmMuZ2V0RW51bShDb25maWdDb25zdGFudHMuQ09ORklHX0NPUkVfU0VDVElPTiwgbnVsbCwKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0FuZFRyZWVGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0FuZFRyZWVGaWx0ZXIuamF2YQppbmRleCA2ZDQwYTRlLi5hOTYwYmQ3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9BbmRUcmVlRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQW5kVHJlZUZpbHRlci5qYXZhCkBAIC03MSw3ICs3MSw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBbmRUcmVlRmlsdGVyIGV4dGVuZHMgVHJlZUZpbHRlciB7CiAJICogICAgICAgICAgICBzZWNvbmQgZmlsdGVyIHRvIHRlc3QuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYm90aCBpbnB1dCBmaWx0ZXJzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgVHJlZUZpbHRlciBhLCBmaW5hbCBUcmVlRmlsdGVyIGIpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKFRyZWVGaWx0ZXIgYSwgVHJlZUZpbHRlciBiKSB7CiAJCWlmIChhID09IEFMTCkKIAkJCXJldHVybiBiOwogCQlpZiAoYiA9PSBBTEwpCkBAIC04Nyw3ICs4Nyw3IEBAIHB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgVHJlZUZpbHRlciBhLCBmaW5hbCBUcmVlRmlsdGVyIGIpIHsKIAkgKiAgICAgICAgICAgIGZpbHRlcnMuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYWxsIGlucHV0IGZpbHRlcnMuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBUcmVlRmlsdGVyW10gbGlzdCkgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoVHJlZUZpbHRlcltdIGxpc3QpIHsKIAkJaWYgKGxpc3QubGVuZ3RoID09IDIpCiAJCQlyZXR1cm4gY3JlYXRlKGxpc3RbMF0sIGxpc3RbMV0pOwogCQlpZiAobGlzdC5sZW5ndGggPCAyKQpAQCAtMTA1LDcgKzEwNSw3IEBAIHB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgVHJlZUZpbHRlcltdIGxpc3QpIHsKIAkgKiAgICAgICAgICAgIGZpbHRlcnMuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYWxsIGlucHV0IGZpbHRlcnMuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBDb2xsZWN0aW9uPFRyZWVGaWx0ZXI+IGxpc3QpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKENvbGxlY3Rpb248VHJlZUZpbHRlcj4gbGlzdCkgewogCQlpZiAobGlzdC5zaXplKCkgPCAyKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5hdExlYXN0VHdvRmlsdGVyc05lZWRlZCk7CiAJCWZpbmFsIFRyZWVGaWx0ZXJbXSBzdWJmaWx0ZXJzID0gbmV3IFRyZWVGaWx0ZXJbbGlzdC5zaXplKCldOwpAQCAtMTIwLDEzICsxMjAsMTMgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmluYXJ5IGV4dGVuZHMgQW5kVHJlZUZpbHRlciB7CiAKIAkJcHJpdmF0ZSBmaW5hbCBUcmVlRmlsdGVyIGI7CiAKLQkJQmluYXJ5KGZpbmFsIFRyZWVGaWx0ZXIgb25lLCBmaW5hbCBUcmVlRmlsdGVyIHR3bykgeworCQlCaW5hcnkoVHJlZUZpbHRlciBvbmUsIFRyZWVGaWx0ZXIgdHdvKSB7CiAJCQlhID0gb25lOwogCQkJYiA9IHR3bzsKIAkJfQogCiAJCUBPdmVycmlkZQotCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewogCQkJcmV0dXJuIG1hdGNoRmlsdGVyKHdhbGtlcikgPD0gMDsKQEAgLTE3MCwxMiArMTcwLDEyIEBAIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CiAJcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdCBleHRlbmRzIEFuZFRyZWVGaWx0ZXIgewogCQlwcml2YXRlIGZpbmFsIFRyZWVGaWx0ZXJbXSBzdWJmaWx0ZXJzOwogCi0JCUxpc3QoZmluYWwgVHJlZUZpbHRlcltdIGxpc3QpIHsKKwkJTGlzdChUcmVlRmlsdGVyW10gbGlzdCkgewogCQkJc3ViZmlsdGVycyA9IGxpc3Q7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpCisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCXJldHVybiBtYXRjaEZpbHRlcih3YWxrZXIpIDw9IDA7CkBAIC0xODYsNyArMTg2LDcgQEAgcHVibGljIGludCBtYXRjaEZpbHRlcihUcmVlV2FsayB3YWxrZXIpCiAJCQkJdGhyb3dzIE1pc3NpbmdPYmplY3RFeGNlcHRpb24sIEluY29ycmVjdE9iamVjdFR5cGVFeGNlcHRpb24sCiAJCQkJSU9FeGNlcHRpb24gewogCQkJaW50IG0gPSAwOwotCQkJZm9yIChmaW5hbCBUcmVlRmlsdGVyIGYgOiBzdWJmaWx0ZXJzKSB7CisJCQlmb3IgKFRyZWVGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpIHsKIAkJCQlpbnQgciA9IGYubWF0Y2hGaWx0ZXIod2Fsa2VyKTsKIAkJCQlpZiAociA9PSAxKSB7CiAJCQkJCXJldHVybiAxOwpAQCAtMjAwLDcgKzIwMCw3IEBAIHB1YmxpYyBpbnQgbWF0Y2hGaWx0ZXIoVHJlZVdhbGsgd2Fsa2VyKQogCiAJCUBPdmVycmlkZQogCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRCZVJlY3Vyc2l2ZSgpIHsKLQkJCWZvciAoZmluYWwgVHJlZUZpbHRlciBmIDogc3ViZmlsdGVycykKKwkJCWZvciAoVHJlZUZpbHRlciBmIDogc3ViZmlsdGVycykKIAkJCQlpZiAoZi5zaG91bGRCZVJlY3Vyc2l2ZSgpKQogCQkJCQlyZXR1cm4gdHJ1ZTsKIAkJCXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0J5dGVBcnJheVNldC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQnl0ZUFycmF5U2V0LmphdmEKaW5kZXggNjUzNzg2Yi4uOTk1NTYxZSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQnl0ZUFycmF5U2V0LmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvQnl0ZUFycmF5U2V0LmphdmEKQEAgLTc3LDcgKzc3LDcgQEAgY2xhc3MgQnl0ZUFycmF5U2V0IHsKIAkJaW5pdFRhYmxlKDEgPDwgSW50ZWdlci5oaWdoZXN0T25lQml0KChjYXBhY2l0eSAqIDIpIC0gMSkpOwogCX0KIAotCXByaXZhdGUgYnl0ZVtdIGdldChmaW5hbCBieXRlW10gdG9GaW5kLCBpbnQgbGVuZ3RoLCBpbnQgaGFzaCkgeworCXByaXZhdGUgYnl0ZVtdIGdldChieXRlW10gdG9GaW5kLCBpbnQgbGVuZ3RoLCBpbnQgaGFzaCkgewogCQlmaW5hbCBpbnQgbXNrID0gbWFzazsKIAkJaW50IGkgPSBoYXNoICYgbXNrOwogCQlmaW5hbCBieXRlW11bXSB0YmwgPSB0YWJsZTsKQEAgLTExMiw3ICsxMTIsNyBAQCBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxdWFscyhieXRlW10gc3RvcmVkT2JqLCBieXRlW10gdG9GaW5kLCBpbnQgbGVuZ3RoKSB7CiAJICogICAgICAgICAgICBwcmUtY29tcHV0ZWQgaGFzaCBvZiB0b0ZpbmQKIAkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1hcHBpbmcgZXhpc3RzIGZvciB0aGlzIGJ5dGUgYXJyYXk7IGZhbHNlIG90aGVyd2lzZS4KIAkgKi8KLQlib29sZWFuIGNvbnRhaW5zKGZpbmFsIGJ5dGVbXSB0b0ZpbmQsIGludCBsZW5ndGgsIGludCBoYXNoKSB7CisJYm9vbGVhbiBjb250YWlucyhieXRlW10gdG9GaW5kLCBpbnQgbGVuZ3RoLCBpbnQgaGFzaCkgewogCQlyZXR1cm4gZ2V0KHRvRmluZCwgbGVuZ3RoLCBoYXNoKSAhPSBudWxsOwogCX0KIApAQCAtMTgwLDcgKzE4MCw3IEBAIGJvb2xlYW4gaXNFbXB0eSgpIHsKIAkJcmV0dXJuIHNpemUgPT0gMDsKIAl9CiAKLQlwcml2YXRlIHZvaWQgaW5zZXJ0KGZpbmFsIGJ5dGVbXSBuZXdWYWx1ZSwgaW50IGhhc2gpIHsKKwlwcml2YXRlIHZvaWQgaW5zZXJ0KGJ5dGVbXSBuZXdWYWx1ZSwgaW50IGhhc2gpIHsKIAkJZmluYWwgaW50IG1zayA9IG1hc2s7CiAJCWludCBqID0gaGFzaCAmIG1zazsKIAkJZmluYWwgYnl0ZVtdW10gdGJsID0gdGFibGU7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9JbnRlckluZGV4RGlmZkZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvSW50ZXJJbmRleERpZmZGaWx0ZXIuamF2YQppbmRleCA4MWI4ZTZkLi4zMzhlZTJiIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9JbnRlckluZGV4RGlmZkZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL0ludGVySW5kZXhEaWZmRmlsdGVyLmphdmEKQEAgLTYzLDcgKzYzLDcgQEAgcHVibGljIGZpbmFsIGNsYXNzIEludGVySW5kZXhEaWZmRmlsdGVyIGV4dGVuZHMgVHJlZUZpbHRlciB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpIHsKIAkJZmluYWwgaW50IG4gPSB3YWxrZXIuZ2V0VHJlZUNvdW50KCk7CiAJCWlmIChuID09IDEpIC8vIEFzc3VtZSB0aGV5IG1lYW50IGRpZmZlcmVuY2UgdG8gZW1wdHkgdHJlZS4KIAkJCXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90SWdub3JlZEZpbHRlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90SWdub3JlZEZpbHRlci5qYXZhCmluZGV4IDM0MDNjNzguLjYwOTA1MDggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdElnbm9yZWRGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RJZ25vcmVkRmlsdGVyLmphdmEKQEAgLTYyLDcgKzYyLDcgQEAgcHVibGljIGNsYXNzIE5vdElnbm9yZWRGaWx0ZXIgZXh0ZW5kcyBUcmVlRmlsdGVyIHsKIAkgKiBAcGFyYW0gd29ya2RpclRyZWVJbmRleAogCSAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIHdvcmtkaXIgdHJlZSBpbiB0aGUgdHJlZSB3YWxrCiAJICovCi0JcHVibGljIE5vdElnbm9yZWRGaWx0ZXIoZmluYWwgaW50IHdvcmtkaXJUcmVlSW5kZXgpIHsKKwlwdWJsaWMgTm90SWdub3JlZEZpbHRlcihpbnQgd29ya2RpclRyZWVJbmRleCkgewogCQl0aGlzLmluZGV4ID0gd29ya2RpclRyZWVJbmRleDsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdFRyZWVGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL05vdFRyZWVGaWx0ZXIuamF2YQppbmRleCAyZTAyM2QwLi5kMzE1NTI2IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9Ob3RUcmVlRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvTm90VHJlZUZpbHRlci5qYXZhCkBAIC02MSwxMyArNjEsMTMgQEAgcHVibGljIGNsYXNzIE5vdFRyZWVGaWx0ZXIgZXh0ZW5kcyBUcmVlRmlsdGVyIHsKIAkgKiAgICAgICAgICAgIGZpbHRlciB0byBuZWdhdGUuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IGRvZXMgdGhlIHJldmVyc2Ugb2YgPGNvZGU+YTwvY29kZT4uCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBUcmVlRmlsdGVyIGEpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKFRyZWVGaWx0ZXIgYSkgewogCQlyZXR1cm4gbmV3IE5vdFRyZWVGaWx0ZXIoYSk7CiAJfQogCiAJcHJpdmF0ZSBmaW5hbCBUcmVlRmlsdGVyIGE7CiAKLQlwcml2YXRlIE5vdFRyZWVGaWx0ZXIoZmluYWwgVHJlZUZpbHRlciBvbmUpIHsKKwlwcml2YXRlIE5vdFRyZWVGaWx0ZXIoVHJlZUZpbHRlciBvbmUpIHsKIAkJYSA9IG9uZTsKIAl9CiAKQEAgLTc5LDcgKzc5LDcgQEAgcHVibGljIFRyZWVGaWx0ZXIgbmVnYXRlKCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikKKwlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikKIAkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJSU9FeGNlcHRpb24gewogCQlyZXR1cm4gbWF0Y2hGaWx0ZXIod2Fsa2VyKSA9PSAwOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvT3JUcmVlRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9PclRyZWVGaWx0ZXIuamF2YQppbmRleCBkYmIwNjJiLi4zMDhmZjBjIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9PclRyZWVGaWx0ZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9PclRyZWVGaWx0ZXIuamF2YQpAQCAtNzEsNyArNzEsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3JUcmVlRmlsdGVyIGV4dGVuZHMgVHJlZUZpbHRlciB7CiAJICogICAgICAgICAgICBzZWNvbmQgZmlsdGVyIHRvIHRlc3QuCiAJICogQHJldHVybiBhIGZpbHRlciB0aGF0IG11c3QgbWF0Y2ggYXQgbGVhc3Qgb25lIGlucHV0IGZpbHRlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIFRyZWVGaWx0ZXIgYSwgZmluYWwgVHJlZUZpbHRlciBiKSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShUcmVlRmlsdGVyIGEsIFRyZWVGaWx0ZXIgYikgewogCQlpZiAoYSA9PSBBTEwgfHwgYiA9PSBBTEwpCiAJCQlyZXR1cm4gQUxMOwogCQlyZXR1cm4gbmV3IEJpbmFyeShhLCBiKTsKQEAgLTg1LDcgKzg1LDcgQEAgcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBUcmVlRmlsdGVyIGEsIGZpbmFsIFRyZWVGaWx0ZXIgYikgewogCSAqICAgICAgICAgICAgZmlsdGVycy4KIAkgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgaW5wdXQgZmlsdGVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgVHJlZUZpbHRlcltdIGxpc3QpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKFRyZWVGaWx0ZXJbXSBsaXN0KSB7CiAJCWlmIChsaXN0Lmxlbmd0aCA9PSAyKQogCQkJcmV0dXJuIGNyZWF0ZShsaXN0WzBdLCBsaXN0WzFdKTsKIAkJaWYgKGxpc3QubGVuZ3RoIDwgMikKQEAgLTEwMyw3ICsxMDMsNyBAQCBwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIFRyZWVGaWx0ZXJbXSBsaXN0KSB7CiAJICogICAgICAgICAgICBmaWx0ZXJzLgogCSAqIEByZXR1cm4gYSBmaWx0ZXIgdGhhdCBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBpbnB1dCBmaWx0ZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBDb2xsZWN0aW9uPFRyZWVGaWx0ZXI+IGxpc3QpIHsKKwlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKENvbGxlY3Rpb248VHJlZUZpbHRlcj4gbGlzdCkgewogCQlpZiAobGlzdC5zaXplKCkgPCAyKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5hdExlYXN0VHdvRmlsdGVyc05lZWRlZCk7CiAJCWZpbmFsIFRyZWVGaWx0ZXJbXSBzdWJmaWx0ZXJzID0gbmV3IFRyZWVGaWx0ZXJbbGlzdC5zaXplKCldOwpAQCAtMTE4LDEzICsxMTgsMTMgQEAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQmluYXJ5IGV4dGVuZHMgT3JUcmVlRmlsdGVyIHsKIAogCQlwcml2YXRlIGZpbmFsIFRyZWVGaWx0ZXIgYjsKIAotCQlCaW5hcnkoZmluYWwgVHJlZUZpbHRlciBvbmUsIGZpbmFsIFRyZWVGaWx0ZXIgdHdvKSB7CisJCUJpbmFyeShUcmVlRmlsdGVyIG9uZSwgVHJlZUZpbHRlciB0d28pIHsKIAkJCWEgPSBvbmU7CiAJCQliID0gdHdvOwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gbWF0Y2hGaWx0ZXIod2Fsa2VyKSA8PSAwOwpAQCAtMTY4LDEyICsxNjgsMTIgQEAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAlwcml2YXRlIHN0YXRpYyBjbGFzcyBMaXN0IGV4dGVuZHMgT3JUcmVlRmlsdGVyIHsKIAkJcHJpdmF0ZSBmaW5hbCBUcmVlRmlsdGVyW10gc3ViZmlsdGVyczsKIAotCQlMaXN0KGZpbmFsIFRyZWVGaWx0ZXJbXSBsaXN0KSB7CisJCUxpc3QoVHJlZUZpbHRlcltdIGxpc3QpIHsKIAkJCXN1YmZpbHRlcnMgPSBsaXN0OwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKQorCQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikKIAkJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCQlJT0V4Y2VwdGlvbiB7CiAJCQlyZXR1cm4gbWF0Y2hGaWx0ZXIod2Fsa2VyKSA8PSAwOwpAQCAtMTg0LDcgKzE4NCw3IEBAIHB1YmxpYyBpbnQgbWF0Y2hGaWx0ZXIoVHJlZVdhbGsgd2Fsa2VyKQogCQkJCXRocm93cyBNaXNzaW5nT2JqZWN0RXhjZXB0aW9uLCBJbmNvcnJlY3RPYmplY3RUeXBlRXhjZXB0aW9uLAogCQkJCUlPRXhjZXB0aW9uIHsKIAkJCWludCBtID0gMTsKLQkJCWZvciAoZmluYWwgVHJlZUZpbHRlciBmIDogc3ViZmlsdGVycykgeworCQkJZm9yIChUcmVlRmlsdGVyIGYgOiBzdWJmaWx0ZXJzKSB7CiAJCQkJaW50IHIgPSBmLm1hdGNoRmlsdGVyKHdhbGtlcik7CiAJCQkJaWYgKHIgPT0gMCkgewogCQkJCQlyZXR1cm4gMDsKQEAgLTE5OCw3ICsxOTgsNyBAQCBwdWJsaWMgaW50IG1hdGNoRmlsdGVyKFRyZWVXYWxrIHdhbGtlcikKIAogCQlAT3ZlcnJpZGUKIAkJcHVibGljIGJvb2xlYW4gc2hvdWxkQmVSZWN1cnNpdmUoKSB7Ci0JCQlmb3IgKGZpbmFsIFRyZWVGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpCisJCQlmb3IgKFRyZWVGaWx0ZXIgZiA6IHN1YmZpbHRlcnMpCiAJCQkJaWYgKGYuc2hvdWxkQmVSZWN1cnNpdmUoKSkKIAkJCQkJcmV0dXJuIHRydWU7CiAJCQlyZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyLmphdmEKaW5kZXggMmY3ZjVjZC4uOTI2N2ZiNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aEZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXIuamF2YQpAQCAtODYsNyArODYsNyBAQCBwdWJsaWMgc3RhdGljIFBhdGhGaWx0ZXIgY3JlYXRlKFN0cmluZyBwYXRoKSB7CiAKIAlmaW5hbCBieXRlW10gcGF0aFJhdzsKIAotCXByaXZhdGUgUGF0aEZpbHRlcihmaW5hbCBTdHJpbmcgcykgeworCXByaXZhdGUgUGF0aEZpbHRlcihTdHJpbmcgcykgewogCQlwYXRoU3RyID0gczsKIAkJcGF0aFJhdyA9IENvbnN0YW50cy5lbmNvZGUocGF0aFN0cik7CiAJfQpAQCAtMTAyLDIwICsxMDIsMjAgQEAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCXJldHVybiBtYXRjaEZpbHRlcih3YWxrZXIpIDw9IDA7CiAJfQogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgaW50IG1hdGNoRmlsdGVyKGZpbmFsIFRyZWVXYWxrIHdhbGtlcikgeworCXB1YmxpYyBpbnQgbWF0Y2hGaWx0ZXIoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCXJldHVybiB3YWxrZXIuaXNQYXRoTWF0Y2gocGF0aFJhdywgcGF0aFJhdy5sZW5ndGgpOwogCX0KIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCiAJcHVibGljIGJvb2xlYW4gc2hvdWxkQmVSZWN1cnNpdmUoKSB7Ci0JCWZvciAoZmluYWwgYnl0ZSBiIDogcGF0aFJhdykKKwkJZm9yIChieXRlIGIgOiBwYXRoUmF3KQogCQkJaWYgKGIgPT0gJy8nKQogCQkJCXJldHVybiB0cnVlOwogCQlyZXR1cm4gZmFsc2U7CkBAIC0xNDMsNyArMTQzLDcgQEAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKIAkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcGF0aCBsZW5ndGggb2YgdGhpcyBmaWx0ZXIgbWF0Y2hlcyB0aGUgbGVuZ3RoCiAJICogICAgICAgICBvZiB0aGUgY3VycmVudCBwYXRoIG9mIHRoZSBzdXBwbGllZCBUcmVlV2Fsay4KIAkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RvbmUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJcHVibGljIGJvb2xlYW4gaXNEb25lKFRyZWVXYWxrIHdhbGtlcikgewogCQlyZXR1cm4gcGF0aFJhdy5sZW5ndGggPT0gd2Fsa2VyLmdldFBhdGhMZW5ndGgoKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoRmlsdGVyR3JvdXAuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXJHcm91cC5qYXZhCmluZGV4IDA2NTIyODguLjVjZjU3NTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXJHcm91cC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhGaWx0ZXJHcm91cC5qYXZhCkBAIC04MiwxMyArODIsMTMgQEAgcHVibGljIGNsYXNzIFBhdGhGaWx0ZXJHcm91cCB7CiAJICogICAgICAgICAgICB0aGUgcGF0aHMgdG8gdGVzdCBhZ2FpbnN0LiBNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGVudHJ5LgogCSAqIEByZXR1cm4gYSBuZXcgZmlsdGVyIGZvciB0aGUgbGlzdCBvZiBwYXRocyBzdXBwbGllZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlRnJvbVN0cmluZ3MoZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHBhdGhzKSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZUZyb21TdHJpbmdzKENvbGxlY3Rpb248U3RyaW5nPiBwYXRocykgewogCQlpZiAocGF0aHMuaXNFbXB0eSgpKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJSkdpdFRleHQuZ2V0KCkuYXRMZWFzdE9uZVBhdGhJc1JlcXVpcmVkKTsKIAkJZmluYWwgUGF0aEZpbHRlcltdIHAgPSBuZXcgUGF0aEZpbHRlcltwYXRocy5zaXplKCldOwogCQlpbnQgaSA9IDA7Ci0JCWZvciAoZmluYWwgU3RyaW5nIHMgOiBwYXRocykKKwkJZm9yIChTdHJpbmcgcyA6IHBhdGhzKQogCQkJcFtpKytdID0gUGF0aEZpbHRlci5jcmVhdGUocyk7CiAJCXJldHVybiBjcmVhdGUocCk7CiAJfQpAQCAtMTA5LDcgKzEwOSw3IEBAIHB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGVGcm9tU3RyaW5ncyhmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gcGF0aHMpIHsKIAkgKiAgICAgICAgICAgIHRoZSBwYXRocyB0byB0ZXN0IGFnYWluc3QuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZW50cnkuCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgZm9yIHRoZSBwYXRocyBzdXBwbGllZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlRnJvbVN0cmluZ3MoZmluYWwgU3RyaW5nLi4uIHBhdGhzKSB7CisJcHVibGljIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZUZyb21TdHJpbmdzKFN0cmluZy4uLiBwYXRocykgewogCQlpZiAocGF0aHMubGVuZ3RoID09IDApCiAJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAogCQkJCQlKR2l0VGV4dC5nZXQoKS5hdExlYXN0T25lUGF0aElzUmVxdWlyZWQpOwpAQCAtMTMxLDcgKzEzMSw3IEBAIHB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGVGcm9tU3RyaW5ncyhmaW5hbCBTdHJpbmcuLi4gcGF0aHMpIHsKIAkgKiAgICAgICAgICAgIHRoZSBwYXRocyB0byB0ZXN0IGFnYWluc3QuIE11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZW50cnkuCiAJICogQHJldHVybiBhIG5ldyBmaWx0ZXIgZm9yIHRoZSBsaXN0IG9mIHBhdGhzIHN1cHBsaWVkLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoZmluYWwgQ29sbGVjdGlvbjxQYXRoRmlsdGVyPiBwYXRocykgeworCXB1YmxpYyBzdGF0aWMgVHJlZUZpbHRlciBjcmVhdGUoQ29sbGVjdGlvbjxQYXRoRmlsdGVyPiBwYXRocykgewogCQlpZiAocGF0aHMuaXNFbXB0eSgpKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKIAkJCQkJSkdpdFRleHQuZ2V0KCkuYXRMZWFzdE9uZVBhdGhJc1JlcXVpcmVkKTsKQEAgLTE0MCw3ICsxNDAsNyBAQCBwdWJsaWMgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKGZpbmFsIENvbGxlY3Rpb248UGF0aEZpbHRlcj4gcGF0aHMpIHsKIAkJcmV0dXJuIGNyZWF0ZShwKTsKIAl9CiAKLQlwcml2YXRlIHN0YXRpYyBUcmVlRmlsdGVyIGNyZWF0ZShmaW5hbCBQYXRoRmlsdGVyW10gcCkgeworCXByaXZhdGUgc3RhdGljIFRyZWVGaWx0ZXIgY3JlYXRlKFBhdGhGaWx0ZXJbXSBwKSB7CiAJCWlmIChwLmxlbmd0aCA9PSAxKQogCQkJcmV0dXJuIG5ldyBTaW5nbGUocFswXSk7CiAJCXJldHVybiBuZXcgR3JvdXAocCk7CkBAIC0xNTEsMTMgKzE1MSwxMyBAQCBzdGF0aWMgY2xhc3MgU2luZ2xlIGV4dGVuZHMgVHJlZUZpbHRlciB7CiAKIAkJcHJpdmF0ZSBmaW5hbCBieXRlW10gcmF3OwogCi0JCXByaXZhdGUgU2luZ2xlKGZpbmFsIFBhdGhGaWx0ZXIgcCkgeworCQlwcml2YXRlIFNpbmdsZShQYXRoRmlsdGVyIHApIHsKIAkJCXBhdGggPSBwOwogCQkJcmF3ID0gcGF0aC5wYXRoUmF3OwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCQlmaW5hbCBpbnQgY21wID0gd2Fsa2VyLmlzUGF0aFByZWZpeChyYXcsIHJhdy5sZW5ndGgpOwogCQkJaWYgKGNtcCA+IDApCiAJCQkJdGhyb3cgU3RvcFdhbGtFeGNlcHRpb24uSU5TVEFOQ0U7CkBAIC0xODgsNyArMTg4LDcgQEAgc3RhdGljIGNsYXNzIEdyb3VwIGV4dGVuZHMgVHJlZUZpbHRlciB7CiAKIAkJcHJpdmF0ZSBieXRlW10gbWF4OwogCi0JCXByaXZhdGUgR3JvdXAoZmluYWwgUGF0aEZpbHRlcltdIHBhdGhGaWx0ZXJzKSB7CisJCXByaXZhdGUgR3JvdXAoUGF0aEZpbHRlcltdIHBhdGhGaWx0ZXJzKSB7CiAJCQlmdWxscGF0aHMgPSBuZXcgQnl0ZUFycmF5U2V0KHBhdGhGaWx0ZXJzLmxlbmd0aCk7CiAJCQlwcmVmaXhlcyA9IG5ldyBCeXRlQXJyYXlTZXQocGF0aEZpbHRlcnMubGVuZ3RoIC8gNSk7CiAJCQkvLyA1IGlzIGFuIGVtcGlyaWNhbGx5IGRlcml2ZWQgcmF0aW8gb2YgI3BhdGhzLyNwcmVmaXhlcyBmcm9tOgpAQCAtMjM5LDcgKzIzOSw3IEBAIHByaXZhdGUgc3RhdGljIGludCBjb21wYXJlKGJ5dGVbXSBhLCBieXRlW10gYikgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAKIAkJCWJ5dGVbXSBycCA9IHdhbGtlci5nZXRSYXdQYXRoKCk7CiAJCQlIYXNoZXIgaGFzaGVyID0gbmV3IEhhc2hlcihycCwgd2Fsa2VyLmdldFBhdGhMZW5ndGgoKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoU3VmZml4RmlsdGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9QYXRoU3VmZml4RmlsdGVyLmphdmEKaW5kZXggNTUzZTZiZC4uM2Q5Zjg3NSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvUGF0aFN1ZmZpeEZpbHRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1BhdGhTdWZmaXhGaWx0ZXIuamF2YQpAQCAtODQsNyArODQsNyBAQCBwdWJsaWMgc3RhdGljIFBhdGhTdWZmaXhGaWx0ZXIgY3JlYXRlKFN0cmluZyBwYXRoKSB7CiAJZmluYWwgU3RyaW5nIHBhdGhTdHI7CiAJZmluYWwgYnl0ZVtdIHBhdGhSYXc7CiAKLQlwcml2YXRlIFBhdGhTdWZmaXhGaWx0ZXIoZmluYWwgU3RyaW5nIHMpIHsKKwlwcml2YXRlIFBhdGhTdWZmaXhGaWx0ZXIoU3RyaW5nIHMpIHsKIAkJcGF0aFN0ciA9IHM7CiAJCXBhdGhSYXcgPSBDb25zdGFudHMuZW5jb2RlKHBhdGhTdHIpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXIuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdHJlZXdhbGsvZmlsdGVyL1RyZWVGaWx0ZXIuamF2YQppbmRleCBmMGE3NjMyLi4xMWFkNDY1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3RyZWV3YWxrL2ZpbHRlci9UcmVlRmlsdGVyLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC90cmVld2Fsay9maWx0ZXIvVHJlZUZpbHRlci5qYXZhCkBAIC05MSw3ICs5MSw3IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUcmVlRmlsdGVyIHsKIAogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEFsbEZpbHRlciBleHRlbmRzIFRyZWVGaWx0ZXIgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShmaW5hbCBUcmVlV2FsayB3YWxrZXIpIHsKKwkJcHVibGljIGJvb2xlYW4gaW5jbHVkZShUcmVlV2FsayB3YWxrZXIpIHsKIAkJCXJldHVybiB0cnVlOwogCQl9CiAKQEAgLTEzMyw3ICsxMzMsNyBAQCBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBbnlEaWZmRmlsdGVyIGV4dGVuZHMgVHJlZUZpbHRlciB7CiAJCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBiYXNlVHJlZSA9IDA7CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoZmluYWwgVHJlZVdhbGsgd2Fsa2VyKSB7CisJCXB1YmxpYyBib29sZWFuIGluY2x1ZGUoVHJlZVdhbGsgd2Fsa2VyKSB7CiAJCQlmaW5hbCBpbnQgbiA9IHdhbGtlci5nZXRUcmVlQ291bnQoKTsKIAkJCWlmIChuID09IDEpIC8vIEFzc3VtZSB0aGV5IG1lYW50IGRpZmZlcmVuY2UgdG8gZW1wdHkgdHJlZS4KIAkJCQlyZXR1cm4gdHJ1ZTsKQEAgLTIyMSw3ICsyMjEsNyBAQCBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpbmNsdWRlKFRyZWVXYWxrIHdhbGtlcikKIAkgKiAgICAgICAgICAgICBhcyB0aHJvd24gYnkge0BsaW5rICNpbmNsdWRlKFRyZWVXYWxrKX0KIAkgKiBAc2luY2UgNC43CiAJICovCi0JcHVibGljIGludCBtYXRjaEZpbHRlcihmaW5hbCBUcmVlV2FsayB3YWxrZXIpCisJcHVibGljIGludCBtYXRjaEZpbHRlcihUcmVlV2FsayB3YWxrZXIpCiAJCQl0aHJvd3MgTWlzc2luZ09iamVjdEV4Y2VwdGlvbiwgSW5jb3JyZWN0T2JqZWN0VHlwZUV4Y2VwdGlvbiwKIAkJCUlPRXhjZXB0aW9uCiAJewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0Jhc2U2NC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0Jhc2U2NC5qYXZhCmluZGV4IDBjMjdjZWQuLjQ0MmYwNzkgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9CYXNlNjQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQmFzZTY0LmphdmEKQEAgLTYsOSArNiw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsOwogCi1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CiAKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIApAQCAtNTUsNyArNTQsNyBAQCBwdWJsaWMgY2xhc3MgQmFzZTY0IHsKIAkJCQkrICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIgLy8gLy8kTk9OLU5MUy0xJAogCQkJCSsgIjAxMjM0NTY3ODkiIC8vIC8vJE5PTi1OTFMtMSQKIAkJCQkrICIrLyIgLy8gLy8kTk9OLU5MUy0xJAotCQkpLmdldEJ5dGVzKFVURl84KTsKKwkJKS5nZXRCeXRlcyhDSEFSU0VUKTsKIAogCQlERUMgPSBuZXcgYnl0ZVsxMjhdOwogCQlBcnJheXMuZmlsbChERUMsIElOVkFMSURfREVDKTsKQEAgLTE3OCw3ICsxNzcsNyBAQCBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGVCeXRlcyhieXRlW10gc291cmNlLCBpbnQgb2ZmLCBpbnQgbGVuKSB7CiAJCQllICs9IDQ7CiAJCX0KIAotCQlyZXR1cm4gbmV3IFN0cmluZyhvdXRCdWZmLCAwLCBlLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKwkJcmV0dXJuIG5ldyBTdHJpbmcob3V0QnVmZiwgMCwgZSwgQ0hBUlNFVCk7CiAJfQogCiAJLyoqCkBAIC0yOTQsNyArMjkzLDcgQEAgZWxzZSBpZiAoc291cmNlW3NyY09mZnNldCArIDNdID09IEVRVUFMU19TSUdOKSB7CiAJICogQHJldHVybiB0aGUgZGVjb2RlZCBkYXRhCiAJICovCiAJcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlKFN0cmluZyBzKSB7Ci0JCWJ5dGVbXSBieXRlcyA9IHMuZ2V0Qnl0ZXMoVVRGXzgpOworCQlieXRlW10gYnl0ZXMgPSBzLmdldEJ5dGVzKENIQVJTRVQpOwogCQlyZXR1cm4gZGVjb2RlKGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwogCX0KIH0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9DYWNoZWRBdXRoZW50aWNhdG9yLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvQ2FjaGVkQXV0aGVudGljYXRvci5qYXZhCmluZGV4IDk5MTViZGYuLjZiNTg3OTAgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9DYWNoZWRBdXRoZW50aWNhdG9yLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0NhY2hlZEF1dGhlbnRpY2F0b3IuamF2YQpAQCAtNjEsNyArNjEsNyBAQCBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2FjaGVkQXV0aGVudGljYXRvciBleHRlbmRzIEF1dGhlbnRpY2F0b3IgewogCSAqIEBwYXJhbSBjYQogCSAqICAgICAgICAgICAgdGhlIGluZm9ybWF0aW9uIHdlIHNob3VsZCByZW1lbWJlci4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkKGZpbmFsIENhY2hlZEF1dGhlbnRpY2F0aW9uIGNhKSB7CisJcHVibGljIHN0YXRpYyB2b2lkIGFkZChDYWNoZWRBdXRoZW50aWNhdGlvbiBjYSkgewogCQljYWNoZWQuYWRkKGNhKTsKIAl9CiAKQEAgLTcwLDcgKzcwLDcgQEAgcHVibGljIHN0YXRpYyB2b2lkIGFkZChmaW5hbCBDYWNoZWRBdXRoZW50aWNhdGlvbiBjYSkgewogCXByb3RlY3RlZCBmaW5hbCBQYXNzd29yZEF1dGhlbnRpY2F0aW9uIGdldFBhc3N3b3JkQXV0aGVudGljYXRpb24oKSB7CiAJCWZpbmFsIFN0cmluZyBob3N0ID0gZ2V0UmVxdWVzdGluZ0hvc3QoKTsKIAkJZmluYWwgaW50IHBvcnQgPSBnZXRSZXF1ZXN0aW5nUG9ydCgpOwotCQlmb3IgKGZpbmFsIENhY2hlZEF1dGhlbnRpY2F0aW9uIGNhIDogY2FjaGVkKSB7CisJCWZvciAoQ2FjaGVkQXV0aGVudGljYXRpb24gY2EgOiBjYWNoZWQpIHsKIAkJCWlmIChjYS5ob3N0LmVxdWFscyhob3N0KSAmJiBjYS5wb3J0ID09IHBvcnQpCiAJCQkJcmV0dXJuIGNhLnRvUGFzc3dvcmRBdXRoZW50aWNhdGlvbigpOwogCQl9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GUy5qYXZhCmluZGV4IGNmZmNiNTUuLmQwOTM4MTggMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GUy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GUy5qYXZhCkBAIC03Niw2ICs3Niw5IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5saWIuUmVwb3NpdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyZWV3YWxrLkZpbGVUcmVlSXRlcmF0b3IuRmlsZUVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuRmlsZVRyZWVJdGVyYXRvci5GaWxlTW9kZVN0cmF0ZWd5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuV29ya2luZ1RyZWVJdGVyYXRvci5FbnRyeTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuUHJvY2Vzc1Jlc3VsdC5TdGF0dXM7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKQEAgLTg3LDYgKzkwLDE0IEBAIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGUyB7CiAJcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEZTLmNsYXNzKTsKIAogCS8qKgorCSAqIEFuIGVtcHR5IGFycmF5IG9mIGVudHJpZXMsIHN1aXRhYmxlIGFzIGEgcmV0dXJuIHZhbHVlIGZvcgorCSAqIHtAbGluayAjbGlzdChGaWxlLCBGaWxlTW9kZVN0cmF0ZWd5KX0uCisJICoKKwkgKiBAc2luY2UgNS4wCisJICovCisJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBFbnRyeVtdIE5PX0VOVFJJRVMgPSB7fTsKKworCS8qKgogCSAqIFRoaXMgY2xhc3MgY3JlYXRlcyBGUyBpbnN0YW5jZXMuIEl0IHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBhIEphdmE3IHZhcmlhbnQKIAkgKiBpZiBzdWNoIGNhbiBiZSBkZXRlY3RlZCBpbiB7QGxpbmsgI2RldGVjdChCb29sZWFuKX0uCiAJICoKQEAgLTM4NCw3ICszOTUsNyBAQCBwdWJsaWMgdm9pZCBkZWxldGUoRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqIEByZXR1cm4gdGhlIHRyYW5zbGF0ZWQgcGF0aC4gPGNvZGU+bmV3IEZpbGUoZGlyLG5hbWUpPC9jb2RlPiBpZiB0aGlzCiAJICogICAgICAgICBwbGF0Zm9ybSBkb2VzIG5vdCByZXF1aXJlIHBhdGggbmFtZSB0cmFuc2xhdGlvbi4KIAkgKi8KLQlwdWJsaWMgRmlsZSByZXNvbHZlKGZpbmFsIEZpbGUgZGlyLCBmaW5hbCBTdHJpbmcgbmFtZSkgeworCXB1YmxpYyBGaWxlIHJlc29sdmUoRmlsZSBkaXIsIFN0cmluZyBuYW1lKSB7CiAJCWZpbmFsIEZpbGUgYWJzcG4gPSBuZXcgRmlsZShuYW1lKTsKIAkJaWYgKGFic3BuLmlzQWJzb2x1dGUoKSkKIAkJCXJldHVybiBhYnNwbjsKQEAgLTQ3MywxMSArNDg0LDExIEBAIHB1YmxpYyBTdHJpbmcgcnVuKCkgewogCSAqIEByZXR1cm4gdGhlIGZpcnN0IG1hdGNoIGZvdW5kLCBvciBudWxsCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgRmlsZSBzZWFyY2hQYXRoKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBTdHJpbmcuLi4gbG9va0ZvcikgeworCXByb3RlY3RlZCBzdGF0aWMgRmlsZSBzZWFyY2hQYXRoKFN0cmluZyBwYXRoLCBTdHJpbmcuLi4gbG9va0ZvcikgewogCQlpZiAocGF0aCA9PSBudWxsKQogCQkJcmV0dXJuIG51bGw7CiAKLQkJZm9yIChmaW5hbCBTdHJpbmcgcCA6IHBhdGguc3BsaXQoRmlsZS5wYXRoU2VwYXJhdG9yKSkgeworCQlmb3IgKFN0cmluZyBwIDogcGF0aC5zcGxpdChGaWxlLnBhdGhTZXBhcmF0b3IpKSB7CiAJCQlmb3IgKFN0cmluZyBjb21tYW5kIDogbG9va0ZvcikgewogCQkJCWZpbmFsIEZpbGUgZSA9IG5ldyBGaWxlKHAsIGNvbW1hbmQpOwogCQkJCWlmIChlLmlzRmlsZSgpKQpAQCAtOTc1LDYgKzk4NiwyOSBAQCBwdWJsaWMgU3RyaW5nIHJlbGF0aXZpemUoU3RyaW5nIGJhc2UsIFN0cmluZyBvdGhlcikgewogCX0KIAogCS8qKgorCSAqIEVudW1lcmF0ZXMgY2hpbGRyZW4gb2YgYSBkaXJlY3RvcnkuCisJICoKKwkgKiBAcGFyYW0gZGlyZWN0b3J5CisJICogICAgICAgICAgICB0byBnZXQgdGhlIGNoaWxkcmVuIG9mCisJICogQHBhcmFtIGZpbGVNb2RlU3RyYXRlZ3kKKwkgKiAgICAgICAgICAgIHRvIHVzZSB0byBjYWxjdWxhdGUgdGhlIGdpdCBtb2RlIG9mIGEgY2hpbGQKKwkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGVudHJpZXMgZm9yIHRoZSBjaGlsZHJlbgorCSAqCisJICogQHNpbmNlIDUuMAorCSAqLworCXB1YmxpYyBFbnRyeVtdIGxpc3QoRmlsZSBkaXJlY3RvcnksIEZpbGVNb2RlU3RyYXRlZ3kgZmlsZU1vZGVTdHJhdGVneSkgeworCQlmaW5hbCBGaWxlW10gYWxsID0gZGlyZWN0b3J5Lmxpc3RGaWxlcygpOworCQlpZiAoYWxsID09IG51bGwpIHsKKwkJCXJldHVybiBOT19FTlRSSUVTOworCQl9CisJCWZpbmFsIEVudHJ5W10gcmVzdWx0ID0gbmV3IEVudHJ5W2FsbC5sZW5ndGhdOworCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgeworCQkJcmVzdWx0W2ldID0gbmV3IEZpbGVFbnRyeShhbGxbaV0sIHRoaXMsIGZpbGVNb2RlU3RyYXRlZ3kpOworCQl9CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJLyoqCiAJICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGhvb2sgaXMgZGVmaW5lZCBmb3IgdGhlIGdpdmVuIHJlcG9zaXRvcnksIHRoZW4KIAkgKiBydW5zIGl0IHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KIAkgKiA8cD4KQEAgLTExMTEsNyArMTE0NSw3IEBAIHByb3RlY3RlZCBQcm9jZXNzUmVzdWx0IGludGVybmFsUnVuSG9va0lmUHJlc2VudChSZXBvc2l0b3J5IHJlcG9zaXRvcnksCiAJICogICAgICAgICBleGlzdHMgaW4gdGhlIGdpdmVuIHJlcG9zaXRvcnksIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KIAkgKiBAc2luY2UgNC4wCiAJICovCi0JcHVibGljIEZpbGUgZmluZEhvb2soUmVwb3NpdG9yeSByZXBvc2l0b3J5LCBmaW5hbCBTdHJpbmcgaG9va05hbWUpIHsKKwlwdWJsaWMgRmlsZSBmaW5kSG9vayhSZXBvc2l0b3J5IHJlcG9zaXRvcnksIFN0cmluZyBob29rTmFtZSkgewogCQlGaWxlIGdpdERpciA9IHJlcG9zaXRvcnkuZ2V0RGlyZWN0b3J5KCk7CiAJCWlmIChnaXREaXIgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwpAQCAtMTE5NiwxOSArMTIzMCwyMyBAQCBwdWJsaWMgaW50IHJ1blByb2Nlc3MoUHJvY2Vzc0J1aWxkZXIgcHJvY2Vzc0J1aWxkZXIsCiAJCQkJCW5ldyBTdHJlYW1Hb2JibGVyKHByb2Nlc3MuZ2V0RXJyb3JTdHJlYW0oKSwgZXJyUmVkaXJlY3QpKTsKIAkJCWV4ZWN1dG9yLmV4ZWN1dGUoCiAJCQkJCW5ldyBTdHJlYW1Hb2JibGVyKHByb2Nlc3MuZ2V0SW5wdXRTdHJlYW0oKSwgb3V0UmVkaXJlY3QpKTsKKwkJCUBTdXBwcmVzc1dhcm5pbmdzKCJyZXNvdXJjZSIpIC8vIENsb3NlZCBpbiB0aGUgZmluYWxseSBibG9jawogCQkJT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IHByb2Nlc3MuZ2V0T3V0cHV0U3RyZWFtKCk7Ci0JCQlpZiAoaW5SZWRpcmVjdCAhPSBudWxsKSB7Ci0JCQkJbmV3IFN0cmVhbUdvYmJsZXIoaW5SZWRpcmVjdCwgb3V0cHV0U3RyZWFtKS5jb3B5KCk7Ci0JCQl9CiAJCQl0cnkgewotCQkJCW91dHB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIFdoZW4gdGhlIHByb2Nlc3MgZXhpdHMgYmVmb3JlIGNvbnN1bWluZyB0aGUgaW5wdXQsIHRoZSBPdXRwdXRTdHJlYW0KLQkJCQkvLyBpcyByZXBsYWNlZCB3aXRoIHRoZSBudWxsIG91dHB1dCBzdHJlYW0uIFRoaXMgbnVsbCBvdXRwdXQgc3RyZWFtCi0JCQkJLy8gdGhyb3dzIElPRXhjZXB0aW9uIGZvciBhbGwgd3JpdGUgY2FsbHMuIFdoZW4gU3RyZWFtR29iYmxlciBmYWlscyB0bwotCQkJCS8vIGZsdXNoIHRoZSBidWZmZXIgYmVjYXVzZSBvZiB0aGlzLCB0aGlzIGNsb3NlIGNhbGwgdHJpZXMgdG8gZmx1c2ggaXQKLQkJCQkvLyBhZ2Fpbi4gVGhpcyBjYXVzZXMgYW5vdGhlciBJT0V4Y2VwdGlvbi4gU2luY2Ugd2UgaWdub3JlIHRoZQotCQkJCS8vIElPRXhjZXB0aW9uIGluIFN0cmVhbUdvYmJsZXIsIHdlIGFsc28gaWdub3JlIHRoZSBleGNlcHRpb24gaGVyZS4KKwkJCQlpZiAoaW5SZWRpcmVjdCAhPSBudWxsKSB7CisJCQkJCW5ldyBTdHJlYW1Hb2JibGVyKGluUmVkaXJlY3QsIG91dHB1dFN0cmVhbSkuY29weSgpOworCQkJCX0KKwkJCX0gZmluYWxseSB7CisJCQkJdHJ5IHsKKwkJCQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7CisJCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJCQkvLyBXaGVuIHRoZSBwcm9jZXNzIGV4aXRzIGJlZm9yZSBjb25zdW1pbmcgdGhlIGlucHV0LCB0aGUgT3V0cHV0U3RyZWFtCisJCQkJCS8vIGlzIHJlcGxhY2VkIHdpdGggdGhlIG51bGwgb3V0cHV0IHN0cmVhbS4gVGhpcyBudWxsIG91dHB1dCBzdHJlYW0KKwkJCQkJLy8gdGhyb3dzIElPRXhjZXB0aW9uIGZvciBhbGwgd3JpdGUgY2FsbHMuIFdoZW4gU3RyZWFtR29iYmxlciBmYWlscyB0bworCQkJCQkvLyBmbHVzaCB0aGUgYnVmZmVyIGJlY2F1c2Ugb2YgdGhpcywgdGhpcyBjbG9zZSBjYWxsIHRyaWVzIHRvIGZsdXNoIGl0CisJCQkJCS8vIGFnYWluLiBUaGlzIGNhdXNlcyBhbm90aGVyIElPRXhjZXB0aW9uLiBTaW5jZSB3ZSBpZ25vcmUgdGhlCisJCQkJCS8vIElPRXhjZXB0aW9uIGluIFN0cmVhbUdvYmJsZXIsIHdlIGFsc28gaWdub3JlIHRoZSBleGNlcHRpb24gaGVyZS4KKwkJCQl9CiAJCQl9CiAJCQlyZXR1cm4gcHJvY2Vzcy53YWl0Rm9yKCk7CiAJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19QT1NJWC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1BPU0lYLmphdmEKaW5kZXggNDUyMzdjNC4uODc5NTMyOSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1BPU0lYLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1BPU0lYLmphdmEKQEAgLTM5OSw3ICszOTksNyBAQCBwdWJsaWMgYm9vbGVhbiBjcmVhdGVOZXdGaWxlKEZpbGUgbG9jaykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCUludGVnZXIgbmxpbmsgPSAoSW50ZWdlcikgKEZpbGVzLmdldEF0dHJpYnV0ZShsb2NrUGF0aCwKIAkJCQkJInVuaXg6bmxpbmsiKSk7IC8vJE5PTi1OTFMtMSQKIAkJCWlmIChubGluayA+IDIpIHsKLQkJCQlMT0cud2Fybigibmxpbmsgb2YgbGluayB0byBsb2NrIGZpbGUgezB9IHdhcyBub3QgMiBidXQgezF9IiwgLy8kTk9OLU5MUy0xJAorCQkJCUxPRy53YXJuKCJubGluayBvZiBsaW5rIHRvIGxvY2sgZmlsZSB7fSB3YXMgbm90IDIgYnV0IHt9IiwgLy8kTk9OLU5MUy0xJAogCQkJCQkJbG9jay5nZXRQYXRoKCksIG5saW5rKTsKIAkJCQlyZXR1cm4gZmFsc2U7CiAJCQl9IGVsc2UgaWYgKG5saW5rIDwgMikgewpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzIuamF2YQppbmRleCAyOWZlNWRjLi45Zjk5ZTI4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzIuamF2YQpAQCAtNDcsMTEgKzQ3LDIxIEBACiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVZpc2l0T3B0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZVZpc2l0UmVzdWx0OworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEubmlvLmZpbGUuU2ltcGxlRmlsZVZpc2l0b3I7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUuQmFzaWNGaWxlQXR0cmlidXRlczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5Db21tYW5kRmFpbGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJlZXdhbGsuRmlsZVRyZWVJdGVyYXRvci5GaWxlRW50cnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5GaWxlVHJlZUl0ZXJhdG9yLkZpbGVNb2RlU3RyYXRlZ3k7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmVld2Fsay5Xb3JraW5nVHJlZUl0ZXJhdG9yLkVudHJ5OwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKQEAgLTk3LDEzICsxMDcsMTMgQEAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNFeGVjdXRlKCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKGZpbmFsIEZpbGUgZikgeworCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoRmlsZSBmKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBib29sZWFuIHNldEV4ZWN1dGUoZmluYWwgRmlsZSBmLCBmaW5hbCBib29sZWFuIGNhbkV4ZWMpIHsKKwlwdWJsaWMgYm9vbGVhbiBzZXRFeGVjdXRlKEZpbGUgZiwgYm9vbGVhbiBjYW5FeGVjKSB7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAKQEAgLTEyMSw2ICsxMzEsNDkgQEAgcHVibGljIGJvb2xlYW4gcmV0cnlGYWlsZWRMb2NrRmlsZUNvbW1pdCgpIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCisJcHVibGljIEVudHJ5W10gbGlzdChGaWxlIGRpcmVjdG9yeSwgRmlsZU1vZGVTdHJhdGVneSBmaWxlTW9kZVN0cmF0ZWd5KSB7CisJCUxpc3Q8RW50cnk+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworCQlGUyBmcyA9IHRoaXM7CisJCWJvb2xlYW4gY2hlY2tFeGVjdXRhYmxlID0gZnMuc3VwcG9ydHNFeGVjdXRlKCk7CisJCXRyeSB7CisJCQlGaWxlcy53YWxrRmlsZVRyZWUoZGlyZWN0b3J5LnRvUGF0aCgpLAorCQkJCQlFbnVtU2V0Lm5vbmVPZihGaWxlVmlzaXRPcHRpb24uY2xhc3MpLCAxLAorCQkJCQluZXcgU2ltcGxlRmlsZVZpc2l0b3I8UGF0aD4oKSB7CisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgdmlzaXRGaWxlKFBhdGggZmlsZSwKKwkJCQkJCQkJQmFzaWNGaWxlQXR0cmlidXRlcyBhdHRycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwkJCQkJCQlGaWxlIGYgPSBmaWxlLnRvRmlsZSgpOworCQkJCQkJCUZTLkF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9IG5ldyBGUy5BdHRyaWJ1dGVzKGZzLCBmLAorCQkJCQkJCQkJdHJ1ZSwgYXR0cnMuaXNEaXJlY3RvcnkoKSwKKwkJCQkJCQkJCWNoZWNrRXhlY3V0YWJsZSAmJiBmLmNhbkV4ZWN1dGUoKSwKKwkJCQkJCQkJCWF0dHJzLmlzU3ltYm9saWNMaW5rKCksCisJCQkJCQkJCQlhdHRycy5pc1JlZ3VsYXJGaWxlKCksCisJCQkJCQkJCQlhdHRycy5jcmVhdGlvblRpbWUoKS50b01pbGxpcygpLAorCQkJCQkJCQkJYXR0cnMubGFzdE1vZGlmaWVkVGltZSgpLnRvTWlsbGlzKCksCisJCQkJCQkJCQlhdHRycy5zaXplKCkpOworCQkJCQkJCXJlc3VsdC5hZGQobmV3IEZpbGVFbnRyeShmLCBmcywgYXR0cmlidXRlcywKKwkJCQkJCQkJCWZpbGVNb2RlU3RyYXRlZ3kpKTsKKwkJCQkJCQlyZXR1cm4gRmlsZVZpc2l0UmVzdWx0LkNPTlRJTlVFOworCQkJCQkJfQorCisJCQkJCQlAT3ZlcnJpZGUKKwkJCQkJCXB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgdmlzaXRGaWxlRmFpbGVkKFBhdGggZmlsZSwKKwkJCQkJCQkJSU9FeGNlcHRpb24gZXhjKSB0aHJvd3MgSU9FeGNlcHRpb24geworCQkJCQkJCS8vIEp1c3QgaWdub3JlIGl0CisJCQkJCQkJcmV0dXJuIEZpbGVWaXNpdFJlc3VsdC5DT05USU5VRTsKKwkJCQkJCX0KKwkJCQkJfSk7CisJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKwkJCS8vIElnbm9yZQorCQl9CisJCWlmIChyZXN1bHQuaXNFbXB0eSgpKSB7CisJCQlyZXR1cm4gTk9fRU5UUklFUzsKKwkJfQorCQlyZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IEVudHJ5W3Jlc3VsdC5zaXplKCldKTsKKwl9CisKKwkvKioge0Bpbmhlcml0RG9jfSAqLworCUBPdmVycmlkZQogCXByb3RlY3RlZCBGaWxlIGRpc2NvdmVyR2l0RXhlKCkgewogCQlTdHJpbmcgcGF0aCA9IFN5c3RlbVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldGVudigiUEFUSCIpOyAvLyROT04tTkxTLTEkCiAJCUZpbGUgZ2l0RXhlID0gc2VhcmNoUGF0aChwYXRoLCAiZ2l0LmV4ZSIsICJnaXQuY21kIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyX0N5Z3dpbi5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZTX1dpbjMyX0N5Z3dpbi5qYXZhCmluZGV4IDY0Y2RjYzMuLjMzOTNmYmYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GU19XaW4zMl9DeWd3aW4uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRlNfV2luMzJfQ3lnd2luLmphdmEKQEAgLTQzLDYgKzQzLDggQEAKIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qZ2l0LnV0aWw7CiAKK2ltcG9ydCBzdGF0aWMgb3JnLmVjbGlwc2UuamdpdC5saWIuQ29uc3RhbnRzLkNIQVJTRVQ7CisKIGltcG9ydCBqYXZhLmlvLkZpbGU7CiBpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKIGltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOwpAQCAtMTE3LDE0ICsxMTksMTQgQEAgcHVibGljIEZTIG5ld0luc3RhbmNlKCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgRmlsZSByZXNvbHZlKGZpbmFsIEZpbGUgZGlyLCBmaW5hbCBTdHJpbmcgcG4pIHsKKwlwdWJsaWMgRmlsZSByZXNvbHZlKEZpbGUgZGlyLCBTdHJpbmcgcG4pIHsKIAkJU3RyaW5nIHVzZUN5Z1BhdGggPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImpnaXQudXNlY3lncGF0aCIpOyAvLyROT04tTkxTLTEkCiAJCWlmICh1c2VDeWdQYXRoICE9IG51bGwgJiYgdXNlQ3lnUGF0aC5lcXVhbHMoInRydWUiKSkgeyAvLyROT04tTkxTLTEkCiAJCQlTdHJpbmcgdzsKIAkJCXRyeSB7CiAJCQkJdyA9IHJlYWRQaXBlKGRpciwgLy8KIAkJCQkJbmV3IFN0cmluZ1tdIHsgY3lncGF0aCwgIi0td2luZG93cyIsICItLWFic29sdXRlIiwgcG4gfSwgLy8gLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSJVVEYtOCIpOyAvLyROT04tTkxTLTEkCisJCQkJCUNIQVJTRVQubmFtZSgpKTsKIAkJCX0gY2F0Y2ggKENvbW1hbmRGYWlsZWRFeGNlcHRpb24gZSkgewogCQkJCUxPRy53YXJuKGUuZ2V0TWVzc2FnZSgpKTsKIAkJCQlyZXR1cm4gbnVsbDsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWxlVXRpbC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZpbGVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZjIxNzUuLjAwMDAwMDAKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZpbGVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiwgUm9iaW4gUm9zZW5iZXJnIDxyb2Jpbi5yb3NlbmJlcmdAZGV3aXJlLmNvbT4KLSAqIGFuZCBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHByb2plY3QncyBJUCBsb2cuCi0gKgotICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKLSAqIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2MS4wIHdoaWNoCi0gKiBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgaXMgcmVwcm9kdWNlZCBiZWxvdywgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwCi0gKgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yCi0gKiB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcKLSAqIGNvbmRpdGlvbnMgYXJlIG1ldDoKLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAtIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqICAgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcKLSAqICAgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkCi0gKiAgIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlCi0gKiAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlCi0gKiAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKLSAqICAgd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORAotICogQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKLSAqIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCi0gKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUgotICogQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQKLSAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwotICogTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgotICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwKLSAqIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKLSAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCi0gKiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZTLkF0dHJpYnV0ZXM7Ci0KLS8qKgotICogRmlsZSB1dGlsaXRpZXMgdXNpbmcgSmF2YSA3IE5JTzIKLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBGaWxlVXRpbCB7Ci0KLQkvKioKLQkgKiBSZWFkIHRhcmdldCBwYXRoIG9mIGEgc3ltbGluay4KLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9LgotCSAqIEByZXR1cm4gdGFyZ2V0IHBhdGggb2YgdGhlIHN5bWxpbmsuCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI3JlYWRTeW1MaW5rKEZpbGUpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRTeW1saW5rKEZpbGUgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5yZWFkU3ltTGluayhwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBzeW1saW5rCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgcGF0aCBvZiB0aGUgc3ltbGluayB0byBiZSBjcmVhdGVkCi0JICogQHBhcmFtIHRhcmdldAotCSAqICAgICAgICAgICAgdGFyZ2V0IG9mIHRoZSBzeW1saW5rIHRvIGJlIGNyZWF0ZWQKLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCB1c2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNjcmVhdGVTeW1MaW5rKEZpbGUsIFN0cmluZyl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVN5bUxpbmsoRmlsZSBwYXRoLCBTdHJpbmcgdGFyZ2V0KQotCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVV0aWxzLmNyZWF0ZVN5bUxpbmsocGF0aCwgdGFyZ2V0KTsKLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoZSBwYXNzZWQgZmlsZSBpcyBhIHN5bWxpbmsKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9IG9iamVjdC4KLQkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcGFzc2VkIHBhdGggaXMgYSBzeW1saW5rCi0JICogQGRlcHJlY2F0ZWQgVXNlCi0JICogICAgICAgICAgICAge0BsaW5rIGphdmEubmlvLmZpbGUuRmlsZXMjaXNTeW1ib2xpY0xpbmsoamF2YS5uaW8uZmlsZS5QYXRoKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTeW1saW5rKEZpbGUgcGF0aCkgewotCQlyZXR1cm4gRmlsZVV0aWxzLmlzU3ltbGluayhwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGFzdE1vZGlmaWVkIGF0dHJpYnV0ZSBmb3IgZ2l2ZW4gcGF0aAotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0uCi0JICogQHJldHVybiBsYXN0TW9kaWZpZWQgYXR0cmlidXRlIGZvciBnaXZlbiBwYXRoCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgVXNlCi0JICogICAgICAgICAgICAge0BsaW5rIGphdmEubmlvLmZpbGUuRmlsZXMjZ2V0TGFzdE1vZGlmaWVkVGltZShqYXZhLm5pby5maWxlLlBhdGgsIGphdmEubmlvLmZpbGUuTGlua09wdGlvbi4uLil9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBsb25nIGxhc3RNb2RpZmllZChGaWxlIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBGaWxlVXRpbHMubGFzdE1vZGlmaWVkKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFNldCBsYXN0TW9kaWZpZWQgYXR0cmlidXRlIGZvciBnaXZlbiBwYXRoCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcGFyYW0gdGltZQotCSAqICAgICAgICAgICAgYSBsb25nLgotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBqYXZhLm5pby5maWxlLkZpbGVzI3NldExhc3RNb2RpZmllZFRpbWUoamF2YS5uaW8uZmlsZS5QYXRoLCBqYXZhLm5pby5maWxlLmF0dHJpYnV0ZS5GaWxlVGltZSl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldExhc3RNb2RpZmllZChGaWxlIHBhdGgsIGxvbmcgdGltZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJRmlsZVV0aWxzLnNldExhc3RNb2RpZmllZChwYXRoLCB0aW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoaXMgZmlsZSBleGlzdHMKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9LgotCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBwYXRoIGV4aXN0cwotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBqYXZhLm5pby5maWxlLkZpbGVzI2V4aXN0cyhqYXZhLm5pby5maWxlLlBhdGgsIGphdmEubmlvLmZpbGUuTGlua09wdGlvbi4uLil9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGV4aXN0cyhGaWxlIHBhdGgpIHsKLQkJcmV0dXJuIEZpbGVVdGlscy5leGlzdHMocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciB0aGlzIGZpbGUgaXMgaGlkZGVuCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gcGF0aCBpcyBoaWRkZW4KLQkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIGphdmEubmlvLmZpbGUuRmlsZXMjaXNIaWRkZW4oamF2YS5uaW8uZmlsZS5QYXRoKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIaWRkZW4oRmlsZSBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gRmlsZVV0aWxzLmlzSGlkZGVuKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGlzIGZpbGUgaGlkZGVuCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcGFyYW0gaGlkZGVuCi0JICogICAgICAgICAgICBhIGJvb2xlYW4uCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgVXNlCi0JICogICAgICAgICAgICAge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjc2V0SGlkZGVuKEZpbGUsYm9vbGVhbil9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhpZGRlbihGaWxlIHBhdGgsIGJvb2xlYW4gaGlkZGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlVXRpbHMuc2V0SGlkZGVuKHBhdGgsIGhpZGRlbik7Ci0JfQotCi0JLyoqCi0JICogR2V0IGZpbGUgbGVuZ3RoCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfS4KLQkgKiBAcmV0dXJuIGxlbmd0aCBvZiB0aGUgZ2l2ZW4gZmlsZQotCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNnZXRMZW5ndGgoRmlsZSl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBsb25nIGdldExlbmd0aChGaWxlIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBGaWxlVXRpbHMuZ2V0TGVuZ3RoKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIFdoZXRoZXIgdGhlIGdpdmVuIEZpbGUgaXMgYSBkaXJlY3RvcnkKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9IG9iamVjdC4KLQkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhIGRpcmVjdG9yeQotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBqYXZhLm5pby5maWxlLkZpbGVzI2lzRGlyZWN0b3J5KGphdmEubmlvLmZpbGUuUGF0aCwgamF2YS5uaW8uZmlsZS5MaW5rT3B0aW9uLi4uKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoRmlsZSBwYXRoKSB7Ci0JCXJldHVybiBGaWxlVXRpbHMuaXNEaXJlY3RvcnkocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogV2hldGhlciB0aGUgZ2l2ZW4gRmlsZSBpcyBhIGZpbGUKLQkgKgotCSAqIEBwYXJhbSBwYXRoCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9IG9iamVjdC4KLQkgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gZmlsZSBpcyBhIGZpbGUKLQkgKiBAZGVwcmVjYXRlZCBVc2UKLQkgKiAgICAgICAgICAgICB7QGxpbmsgamF2YS5uaW8uZmlsZS5GaWxlcyNpc1JlZ3VsYXJGaWxlKGphdmEubmlvLmZpbGUuUGF0aCwgamF2YS5uaW8uZmlsZS5MaW5rT3B0aW9uLi4uKX0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNGaWxlKEZpbGUgcGF0aCkgewotCQlyZXR1cm4gRmlsZVV0aWxzLmlzRmlsZShwYXRoKTsKLQl9Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoZSBnaXZlbiBmaWxlIGNhbiBiZSBleGVjdXRlZAotCSAqCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEuaW8uRmlsZX0gb2JqZWN0LgotCSAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBmaWxlIGNhbiBiZSBleGVjdXRlZAotCSAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNjYW5FeGVjdXRlKEZpbGUpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBjYW5FeGVjdXRlKEZpbGUgcGF0aCkgewotCQlyZXR1cm4gRmlsZVV0aWxzLmNhbkV4ZWN1dGUocGF0aCk7Ci0JfQotCi0JLyoqCi0JICogRGVsZXRlIHRoZSBnaXZlbiBmaWxlCi0JICoKLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfSBvYmplY3QuCi0JICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0JICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI2RlbGV0ZShGaWxlKX0KLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGUoRmlsZSBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlGaWxlVXRpbHMuZGVsZXRlKHBhdGgpOwotCX0KLQotCS8qKgotCSAqIEdldCBmaWxlIHN5c3RlbSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZmlsZQotCSAqCi0JICogQHBhcmFtIGZzCi0JICogICAgICAgICAgICBhIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRlN9IG9iamVjdC4KLQkgKiBAcGFyYW0gcGF0aAotCSAqICAgICAgICAgICAgYSB7QGxpbmsgamF2YS5pby5GaWxlfSBvYmplY3QuCi0JICogQHJldHVybiBmaWxlIHN5c3RlbSBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gZmlsZQotCSAqIEBkZXByZWNhdGVkIFVzZQotCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI2dldEZpbGVBdHRyaWJ1dGVzUG9zaXgoRlMsRmlsZSl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZAotCSAqLwotCUBEZXByZWNhdGVkCi0JcHVibGljIHN0YXRpYyBBdHRyaWJ1dGVzIGdldEZpbGVBdHRyaWJ1dGVzUG9zaXgoRlMgZnMsIEZpbGUgcGF0aCkgewotCQlyZXR1cm4gRmlsZVV0aWxzLmdldEZpbGVBdHRyaWJ1dGVzUG9zaXgoZnMsIHBhdGgpOwotCX0KLQotCS8qKgotCSAqIE5GQyBub3JtYWxpemUgRmlsZSAob24gTWFjKSwgb3RoZXJ3aXNlIGRvIG5vdGhpbmcKLQkgKgotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhIHtAbGluayBqYXZhLmlvLkZpbGV9LgotCSAqIEByZXR1cm4gb24gTWFjOiBORkMgbm9ybWFsaXplZCB7QGxpbmsgamF2YS5pby5GaWxlfSwgb3RoZXJ3aXNlIHRoZSBwYXNzZWQKLQkgKiAgICAgICAgIGZpbGUKLQkgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIG9yZy5lY2xpcHNlLmpnaXQudXRpbC5GaWxlVXRpbHMjbm9ybWFsaXplKEZpbGUpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgRmlsZSBub3JtYWxpemUoRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBGaWxlVXRpbHMubm9ybWFsaXplKGZpbGUpOwotCX0KLQotCS8qKgotCSAqIE5GQyBub3JtYWxpemUgZmlsZSBuYW1lIChvbiBNYWMpLCBvdGhlcndpc2UgZG8gbm90aGluZwotCSAqCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGEge0BsaW5rIGphdmEubGFuZy5TdHJpbmd9IG9iamVjdC4KLQkgKiBAcmV0dXJuIG9uIE1hYzogTkZDIG5vcm1hbGl6ZWQgZm9ybSBvZiBnaXZlbiBuYW1lCi0JICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI25vcm1hbGl6ZShTdHJpbmcpfQotCSAqICAgICAgICAgICAgIGluc3RlYWQKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gRmlsZVV0aWxzLm5vcm1hbGl6ZShuYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWxlVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9GaWxlVXRpbHMuamF2YQppbmRleCA3NmE3ZWI2Li5mMWUwNWU1IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvRmlsZVV0aWxzLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ZpbGVVdGlscy5qYXZhCkBAIC0xMjIsNyArMTIyLDcgQEAgcHVibGljIGNsYXNzIEZpbGVVdGlscyB7CiAJICogICAgICAgICAgICAge0BsaW5rIGphdmEubmlvLmZpbGUuSW52YWxpZFBhdGhFeGNlcHRpb259KQogCSAqIEBzaW5jZSA0LjEwCiAJICovCi0JcHVibGljIHN0YXRpYyBQYXRoIHRvUGF0aChmaW5hbCBGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyBQYXRoIHRvUGF0aChGaWxlIGYpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gZi50b1BhdGgoKTsKIAkJfSBjYXRjaCAoSW52YWxpZFBhdGhFeGNlcHRpb24gZXgpIHsKQEAgLTE0MSw3ICsxNDEsNyBAQCBwdWJsaWMgc3RhdGljIFBhdGggdG9QYXRoKGZpbmFsIEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgICBjYXVzZSBqYXZhLmlvLklPRXhjZXB0aW9ucyBkdXJpbmcgcmFjZSBjb25kaXRpb25zIHdoZW4KIAkgKiAgICAgICAgICAgICBtdWx0aXBsZSBjb25jdXJyZW50IHRocmVhZHMgYWxsIHRyeSB0byBkZWxldGUgdGhlIHNhbWUgZmlsZS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKGZpbmFsIEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKEZpbGUgZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZGVsZXRlKGYsIE5PTkUpOwogCX0KIApAQCAtMTYyLDcgKzE2Miw3IEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGUoZmluYWwgRmlsZSBmKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCSAqICAgICAgICAgICAgIG11bHRpcGxlIGNvbmN1cnJlbnQgdGhyZWFkcyBhbGwgdHJ5IHRvIGRlbGV0ZSB0aGUgc2FtZSBmaWxlLgogCSAqICAgICAgICAgICAgIFRoaXMgZXhjZXB0aW9uIGlzIG5vdCB0aHJvd24gd2hlbiBJR05PUkVfRVJST1JTIGlzIHNldC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKGZpbmFsIEZpbGUgZiwgaW50IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZShGaWxlIGYsIGludCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlGUyBmcyA9IEZTLkRFVEVDVEVEOwogCQlpZiAoKG9wdGlvbnMgJiBTS0lQX01JU1NJTkcpICE9IDAgJiYgIWZzLmV4aXN0cyhmKSkKIAkJCXJldHVybjsKQEAgLTI0MSw3ICsyNDEsNyBAQCBwdWJsaWMgc3RhdGljIHZvaWQgZGVsZXRlKGZpbmFsIEZpbGUgZiwgaW50IG9wdGlvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogICAgICAgICAgICAgaWYgdGhlIHJlbmFtZSBoYXMgZmFpbGVkCiAJICogQHNpbmNlIDMuMAogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW5hbWUoZmluYWwgRmlsZSBzcmMsIGZpbmFsIEZpbGUgZHN0KQorCXB1YmxpYyBzdGF0aWMgdm9pZCByZW5hbWUoRmlsZSBzcmMsIEZpbGUgZHN0KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJcmVuYW1lKHNyYywgZHN0LCBTdGFuZGFyZENvcHlPcHRpb24uUkVQTEFDRV9FWElTVElORyk7CiAJfQpAQCAtMzIxLDcgKzMyMSw3IEBAIHB1YmxpYyBzdGF0aWMgdm9pZCByZW5hbWUoZmluYWwgRmlsZSBzcmMsIGZpbmFsIEZpbGUgZHN0LAogCSAqICAgICAgICAgICAgIG11bHRpcGxlIGNvbmN1cnJlbnQgdGhyZWFkcyBhbGwgdHJ5IHRvIGNyZWF0ZSB0aGUgc2FtZQogCSAqICAgICAgICAgICAgIGRpcmVjdG9yeS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXIoZmluYWwgRmlsZSBkKQorCXB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcihGaWxlIGQpCiAJCQl0aHJvd3MgSU9FeGNlcHRpb24gewogCQlta2RpcihkLCBmYWxzZSk7CiAJfQpAQCAtMzQxLDcgKzM0MSw3IEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcihmaW5hbCBGaWxlIGQpCiAJICogICAgICAgICAgICAgbXVsdGlwbGUgY29uY3VycmVudCB0aHJlYWRzIGFsbCB0cnkgdG8gY3JlYXRlIHRoZSBzYW1lCiAJICogICAgICAgICAgICAgZGlyZWN0b3J5LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcihmaW5hbCBGaWxlIGQsIGJvb2xlYW4gc2tpcEV4aXN0aW5nKQorCXB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcihGaWxlIGQsIGJvb2xlYW4gc2tpcEV4aXN0aW5nKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKCFkLm1rZGlyKCkpIHsKIAkJCWlmIChza2lwRXhpc3RpbmcgJiYgZC5pc0RpcmVjdG9yeSgpKQpAQCAtMzY2LDcgKzM2Niw3IEBAIHB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcihmaW5hbCBGaWxlIGQsIGJvb2xlYW4gc2tpcEV4aXN0aW5nKQogCSAqICAgICAgICAgICAgIG11bHRpcGxlIGNvbmN1cnJlbnQgdGhyZWFkcyBhbGwgdHJ5IHRvIGNyZWF0ZSB0aGUgc2FtZQogCSAqICAgICAgICAgICAgIGRpcmVjdG9yeS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXJzKGZpbmFsIEZpbGUgZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXJzKEZpbGUgZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJbWtkaXJzKGQsIGZhbHNlKTsKIAl9CiAKQEAgLTM4OCw3ICszODgsNyBAQCBwdWJsaWMgc3RhdGljIHZvaWQgbWtkaXJzKGZpbmFsIEZpbGUgZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgICBtdWx0aXBsZSBjb25jdXJyZW50IHRocmVhZHMgYWxsIHRyeSB0byBjcmVhdGUgdGhlIHNhbWUKIAkgKiAgICAgICAgICAgICBkaXJlY3RvcnkuCiAJICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1rZGlycyhmaW5hbCBGaWxlIGQsIGJvb2xlYW4gc2tpcEV4aXN0aW5nKQorCXB1YmxpYyBzdGF0aWMgdm9pZCBta2RpcnMoRmlsZSBkLCBib29sZWFuIHNraXBFeGlzdGluZykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmICghZC5ta2RpcnMoKSkgewogCQkJaWYgKHNraXBFeGlzdGluZyAmJiBkLmlzRGlyZWN0b3J5KCkpCkBAIC00OTgsMzMgKzQ5OCw2IEBAIHB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVUZW1wRGlyKFN0cmluZyBwcmVmaXgsIFN0cmluZyBzdWZmaXgsIEZpbGUgZGlyKQogCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuY2Fubm90Q3JlYXRlVGVtcERpcik7CiAJfQogCi0KLQkvKioKLQkgKiBSZWxhdGl2aXplIGEgcGF0aAotCSAqCi0JICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBtb3JlLWNsZWFybHktbmFtZWQKLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNyZWxhdGl2aXplTmF0aXZlUGF0aChTdHJpbmcsIFN0cmluZyl9Ci0JICogICAgICAgICAgICAgaW5zdGVhZCwgb3IgZGlyZWN0bHkgY2FsbAotCSAqICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuRmlsZVV0aWxzI3JlbGF0aXZpemVQYXRoKFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIGJvb2xlYW4pfQotCSAqCi0JICogICAgICAgICAgICAgRXhwcmVzc2VzIDxjb2RlPm90aGVyPC9jb2RlPiBhcyBhIHJlbGF0aXZlIGZpbGUgcGF0aCBmcm9tCi0JICogICAgICAgICAgICAgPGNvZGU+YmFzZTwvY29kZT4uIEZpbGUtc2VwYXJhdG9yIGFuZCBjYXNlIHNlbnNpdGl2aXR5IGFyZQotCSAqICAgICAgICAgICAgIGJhc2VkIG9uIHRoZSBjdXJyZW50IGZpbGUgc3lzdGVtLgotCSAqCi0JICogICAgICAgICAgICAgU2VlIGFsc28KLQkgKiAgICAgICAgICAgICB7QGxpbmsgb3JnLmVjbGlwc2UuamdpdC51dGlsLkZpbGVVdGlscyNyZWxhdGl2aXplUGF0aChTdHJpbmcsIFN0cmluZywgU3RyaW5nLCBib29sZWFuKX0uCi0JICogQHBhcmFtIGJhc2UKLQkgKiAgICAgICAgICAgIEJhc2UgcGF0aAotCSAqIEBwYXJhbSBvdGhlcgotCSAqICAgICAgICAgICAgRGVzdGluYXRpb24gcGF0aAotCSAqIEByZXR1cm4gUmVsYXRpdmUgcGF0aCBmcm9tIDxjb2RlPmJhc2U8L2NvZGU+IHRvIDxjb2RlPm90aGVyPC9jb2RlPgotCSAqIEBzaW5jZSAzLjcKLQkgKi8KLQlARGVwcmVjYXRlZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlbGF0aXZpemUoU3RyaW5nIGJhc2UsIFN0cmluZyBvdGhlcikgewotCQlyZXR1cm4gcmVsYXRpdml6ZU5hdGl2ZVBhdGgoYmFzZSwgb3RoZXIpOwotCX0KLQogCS8qKgogCSAqIEV4cHJlc3NlcyA8Y29kZT5vdGhlcjwvY29kZT4gYXMgYSByZWxhdGl2ZSBmaWxlIHBhdGggZnJvbQogCSAqIDxjb2RlPmJhc2U8L2NvZGU+LiBGaWxlLXNlcGFyYXRvciBhbmQgY2FzZSBzZW5zaXRpdml0eSBhcmUgYmFzZWQgb24gdGhlCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSHR0cFN1cHBvcnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9IdHRwU3VwcG9ydC5qYXZhCmluZGV4IGE1YTg1OGYuLjZmOTJiMzcgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9IdHRwU3VwcG9ydC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9IdHRwU3VwcG9ydC5qYXZhCkBAIC00NCw2ICs0NCw4IEBACiAKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsOwogCitpbXBvcnQgc3RhdGljIG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50cy5DSEFSQUNURVJfRU5DT0RJTkc7CisKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOwpAQCAtMTc1LDExICsxNzcsMTEgQEAgcHVibGljIGNsYXNzIEh0dHBTdXBwb3J0IHsKIAkgKiBAcGFyYW0ga2V5CiAJICogICAgICAgICAgICB2YWx1ZSB3aGljaCBtdXN0IGJlIGVuY29kZWQgdG8gcHJvdGVjdGVkIHNwZWNpYWwgY2hhcmFjdGVycy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5jb2RlKGZpbmFsIFN0cmluZ0J1aWxkZXIgdXJsc3RyLCBmaW5hbCBTdHJpbmcga2V5KSB7CisJcHVibGljIHN0YXRpYyB2b2lkIGVuY29kZShTdHJpbmdCdWlsZGVyIHVybHN0ciwgU3RyaW5nIGtleSkgewogCQlpZiAoa2V5ID09IG51bGwgfHwga2V5Lmxlbmd0aCgpID09IDApCiAJCQlyZXR1cm47CiAJCXRyeSB7Ci0JCQl1cmxzdHIuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKGtleSwgIlVURi04IikpOyAvLyROT04tTkxTLTEkCisJCQl1cmxzdHIuYXBwZW5kKFVSTEVuY29kZXIuZW5jb2RlKGtleSwgQ0hBUkFDVEVSX0VOQ09ESU5HKSk7CiAJCX0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oSkdpdFRleHQuZ2V0KCkuY291bGROb3RVUkxFbmNvZGVUb1VURjgsIGUpOwogCQl9CkBAIC0yMDAsNyArMjAyLDcgQEAgcHVibGljIHN0YXRpYyB2b2lkIGVuY29kZShmaW5hbCBTdHJpbmdCdWlsZGVyIHVybHN0ciwgZmluYWwgU3RyaW5nIGtleSkgewogCSAqICAgICAgICAgICAgIGNvbW11bmljYXRpb25zIGVycm9yIHByZXZlbnRlZCBvYnRhaW5pbmcgdGhlIHJlc3BvbnNlIGNvZGUuCiAJICogQHNpbmNlIDMuMwogCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHJlc3BvbnNlKGZpbmFsIEh0dHBDb25uZWN0aW9uIGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisJcHVibGljIHN0YXRpYyBpbnQgcmVzcG9uc2UoSHR0cENvbm5lY3Rpb24gYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJdHJ5IHsKIAkJCXJldHVybiBjLmdldFJlc3BvbnNlQ29kZSgpOwogCQl9IGNhdGNoIChDb25uZWN0RXhjZXB0aW9uIGNlKSB7CkBAIC0yMjgsNyArMjMwLDcgQEAgcHVibGljIHN0YXRpYyBpbnQgcmVzcG9uc2UoZmluYWwgSHR0cENvbm5lY3Rpb24gYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICBjb21tdW5pY2F0aW9ucyBlcnJvciBwcmV2ZW50ZWQgb2J0YWluaW5nIHRoZSByZXNwb25zZSBjb2RlLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IHJlc3BvbnNlKGZpbmFsIGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uIGMpCisJcHVibGljIHN0YXRpYyBpbnQgcmVzcG9uc2UoamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb24gYykKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gYy5nZXRSZXNwb25zZUNvZGUoKTsKQEAgLTI3Myw3ICsyNzUsNyBAQCBwdWJsaWMgc3RhdGljIFN0cmluZyByZXNwb25zZUhlYWRlcihmaW5hbCBIdHRwQ29ubmVjdGlvbiBjLAogCSAqICAgICAgICAgICAgIHRoZSBwcm94eSBjb3VsZCBub3QgYmUgY29tcHV0ZWQgYXMgdGhlIHN1cHBsaWVkIFVSTCBjb3VsZCBub3QKIAkgKiAgICAgICAgICAgICBiZSByZWFkLiBUaGlzIGZhaWx1cmUgc2hvdWxkIG5ldmVyIG9jY3VyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJveHkgcHJveHlGb3IoZmluYWwgUHJveHlTZWxlY3RvciBwcm94eVNlbGVjdG9yLCBmaW5hbCBVUkwgdSkKKwlwdWJsaWMgc3RhdGljIFByb3h5IHByb3h5Rm9yKFByb3h5U2VsZWN0b3IgcHJveHlTZWxlY3RvciwgVVJMIHUpCiAJCQl0aHJvd3MgQ29ubmVjdEV4Y2VwdGlvbiB7CiAJCXRyeSB7CiAJCQlyZXR1cm4gcHJveHlTZWxlY3Rvci5zZWxlY3QodS50b1VSSSgpKS5nZXQoMCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSU8uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9JTy5qYXZhCmluZGV4IGYzOWQyMTcuLmU4OGU3YTMgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9JTy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9JTy5qYXZhCkBAIC00Nyw3ICs0Nyw2IEBACiAKIGltcG9ydCBqYXZhLmlvLkVPRkV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwpAQCAtNTksNiArNTgsNyBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uU2lsZW50RmlsZUlucHV0U3RyZWFtOwogCiAvKioKICAqIElucHV0L091dHB1dCB1dGlsaXRpZXMKQEAgLTc2LDcgKzc2LDcgQEAgcHVibGljIGNsYXNzIElPIHsKIAkgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgZmlsZSBleGlzdHMsIGJ1dCBpdHMgY29udGVudHMgY2Fubm90IGJlIHJlYWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlW10gcmVhZEZ1bGx5KGZpbmFsIEZpbGUgcGF0aCkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSByZWFkRnVsbHkoRmlsZSBwYXRoKQogCQkJdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewogCQlyZXR1cm4gSU8ucmVhZEZ1bGx5KHBhdGgsIEludGVnZXIuTUFYX1ZBTFVFKTsKIAl9CkBAIC05NiwxMCArOTYsOSBAQCBwdWJsaWMgY2xhc3MgSU8gewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGV4aXN0cywgYnV0IGl0cyBjb250ZW50cyBjYW5ub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSByZWFkU29tZShmaW5hbCBGaWxlIHBhdGgsIGZpbmFsIGludCBsaW1pdCkKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSByZWFkU29tZShGaWxlIHBhdGgsIGludCBsaW1pdCkKIAkJCXRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKTsKLQkJdHJ5IHsKKwkJdHJ5IChTaWxlbnRGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgU2lsZW50RmlsZUlucHV0U3RyZWFtKHBhdGgpKSB7CiAJCQlieXRlW10gYnVmID0gbmV3IGJ5dGVbbGltaXRdOwogCQkJaW50IGNudCA9IDA7CiAJCQlmb3IgKDs7KSB7CkBAIC0xMTMsMTIgKzExMiw2IEBAIHB1YmxpYyBjbGFzcyBJTyB7CiAJCQlieXRlW10gcmVzID0gbmV3IGJ5dGVbY250XTsKIAkJCVN5c3RlbS5hcnJheWNvcHkoYnVmLCAwLCByZXMsIDAsIGNudCk7CiAJCQlyZXR1cm4gcmVzOwotCQl9IGZpbmFsbHkgewotCQkJdHJ5IHsKLQkJCQlpbi5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KIAkJfQogCX0KIApAQCAtMTM2LDEwICsxMjksOSBAQCBwdWJsaWMgY2xhc3MgSU8gewogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBmaWxlIGV4aXN0cywgYnV0IGl0cyBjb250ZW50cyBjYW5ub3QgYmUgcmVhZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSByZWFkRnVsbHkoZmluYWwgRmlsZSBwYXRoLCBmaW5hbCBpbnQgbWF4KQorCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIHJlYWRGdWxseShGaWxlIHBhdGgsIGludCBtYXgpCiAJCQl0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocGF0aCk7Ci0JCXRyeSB7CisJCXRyeSAoU2lsZW50RmlsZUlucHV0U3RyZWFtIGluID0gbmV3IFNpbGVudEZpbGVJbnB1dFN0cmVhbShwYXRoKSkgewogCQkJbG9uZyBzeiA9IE1hdGgubWF4KHBhdGgubGVuZ3RoKCksIDEpOwogCQkJaWYgKHN6ID4gbWF4KQogCQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKQEAgLTE3MywxMiArMTY1LDYgQEAgcHVibGljIGNsYXNzIElPIHsKIAkJCQlidWYgPSBuYjsKIAkJCX0KIAkJCXJldHVybiBidWY7Ci0JCX0gZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWluLmNsb3NlKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0JCQkJLy8gaWdub3JlIGFueSBjbG9zZSBlcnJvcnMsIHRoaXMgd2FzIGEgcmVhZCBvbmx5IHN0cmVhbQotCQkJfQogCQl9CiAJfQogCkBAIC0zMjUsNyArMzExLDcgQEAgcHVibGljIHN0YXRpYyBpbnQgcmVhZEZ1bGx5KElucHV0U3RyZWFtIGZkLCBieXRlW10gZHN0LCBpbnQgb2ZmKQogCSAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZXJlIHdhcyBhbiBlcnJvciByZWFkaW5nIGZyb20gdGhlIHN0cmVhbS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2tpcEZ1bGx5KGZpbmFsIElucHV0U3RyZWFtIGZkLCBsb25nIHRvU2tpcCkKKwlwdWJsaWMgc3RhdGljIHZvaWQgc2tpcEZ1bGx5KElucHV0U3RyZWFtIGZkLCBsb25nIHRvU2tpcCkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCXdoaWxlICh0b1NraXAgPiAwKSB7CiAJCQlmaW5hbCBsb25nIHIgPSBmZC5za2lwKHRvU2tpcCk7CkBAIC0zNDMsNyArMzI5LDcgQEAgcHVibGljIHN0YXRpYyB2b2lkIHNraXBGdWxseShmaW5hbCBJbnB1dFN0cmVhbSBmZCwgbG9uZyB0b1NraXApCiAJICogQHJldHVybiB0aGUgc3RyaW5nIGRpdmlkZWQgaW50byBsaW5lcwogCSAqIEBzaW5jZSAyLjAKIAkgKi8KLQlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiByZWFkTGluZXMoZmluYWwgU3RyaW5nIHMpIHsKKwlwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiByZWFkTGluZXMoU3RyaW5nIHMpIHsKIAkJTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAkJU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSW50TGlzdC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0ludExpc3QuamF2YQppbmRleCAyNDAzOGYwLi43NDQxZDUwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvSW50TGlzdC5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9JbnRMaXN0LmphdmEKQEAgLTY1LDcgKzY1LDcgQEAgcHVibGljIEludExpc3QoKSB7CiAJICogQHBhcmFtIGNhcGFjaXR5CiAJICogICAgICAgICAgICBudW1iZXIgb2YgZW50cmllcyB0aGUgbGlzdCBjYW4gaW5pdGlhbGx5IGhvbGQuCiAJICovCi0JcHVibGljIEludExpc3QoZmluYWwgaW50IGNhcGFjaXR5KSB7CisJcHVibGljIEludExpc3QoaW50IGNhcGFjaXR5KSB7CiAJCWVudHJpZXMgPSBuZXcgaW50W2NhcGFjaXR5XTsKIAl9CiAKQEAgLTEwMiw3ICsxMDIsNyBAQCBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgdmFsdWUpIHsKIAkgKiBAdGhyb3dzIGphdmEubGFuZy5BcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24KIAkgKiAgICAgICAgICAgICB0aGUgaW5kZXggb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UKIAkgKi8KLQlwdWJsaWMgaW50IGdldChmaW5hbCBpbnQgaSkgeworCXB1YmxpYyBpbnQgZ2V0KGludCBpKSB7CiAJCWlmIChjb3VudCA8PSBpKQogCQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihpKTsKIAkJcmV0dXJuIGVudHJpZXNbaV07CkBAIC0xMjEsNyArMTIxLDcgQEAgcHVibGljIHZvaWQgY2xlYXIoKSB7CiAJICogQHBhcmFtIG4KIAkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgdG8gYWRkLgogCSAqLwotCXB1YmxpYyB2b2lkIGFkZChmaW5hbCBpbnQgbikgeworCXB1YmxpYyB2b2lkIGFkZChpbnQgbikgewogCQlpZiAoY291bnQgPT0gZW50cmllcy5sZW5ndGgpCiAJCQlncm93KCk7CiAJCWVudHJpZXNbY291bnQrK10gPSBuOwpAQCAtMTM1LDcgKzEzNSw3IEBAIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBpbnQgbikgewogCSAqIEBwYXJhbSBuCiAJICogICAgICAgICAgICB2YWx1ZSB0byBzdG9yZSBhdCB0aGUgcG9zaXRpb24uCiAJICovCi0JcHVibGljIHZvaWQgc2V0KGZpbmFsIGludCBpbmRleCwgZmluYWwgaW50IG4pIHsKKwlwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBpbnQgbikgewogCQlpZiAoY291bnQgPCBpbmRleCkKIAkJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oaW5kZXgpOwogCQllbHNlIGlmIChjb3VudCA9PSBpbmRleCkKQEAgLTE1NCw3ICsxNTQsNyBAQCBlbHNlIGlmIChjb3VudCA9PSBpbmRleCkKIAkgKiBAcGFyYW0gdmFsCiAJICogICAgICAgICAgICB2YWx1ZSB0byBpbnNlcnQgaW50byBwYWRkZWQgcG9zaXRpb25zLgogCSAqLwotCXB1YmxpYyB2b2lkIGZpbGxUbyhpbnQgdG9JbmRleCwgZmluYWwgaW50IHZhbCkgeworCXB1YmxpYyB2b2lkIGZpbGxUbyhpbnQgdG9JbmRleCwgaW50IHZhbCkgewogCQl3aGlsZSAoY291bnQgPCB0b0luZGV4KQogCQkJYWRkKHZhbCk7CiAJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0xvbmdMaXN0LmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTG9uZ0xpc3QuamF2YQppbmRleCA0MDQ1OTRjLi4zYmQ2ZTE4IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTG9uZ0xpc3QuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTG9uZ0xpc3QuamF2YQpAQCAtNjcsNyArNjcsNyBAQCBwdWJsaWMgTG9uZ0xpc3QoKSB7CiAJICogQHBhcmFtIGNhcGFjaXR5CiAJICogICAgICAgICAgICBudW1iZXIgb2YgZW50cmllcyB0aGUgbGlzdCBjYW4gaW5pdGlhbGx5IGhvbGQuCiAJICovCi0JcHVibGljIExvbmdMaXN0KGZpbmFsIGludCBjYXBhY2l0eSkgeworCXB1YmxpYyBMb25nTGlzdChpbnQgY2FwYWNpdHkpIHsKIAkJZW50cmllcyA9IG5ldyBsb25nW2NhcGFjaXR5XTsKIAl9CiAKQEAgLTg5LDcgKzg5LDcgQEAgcHVibGljIGludCBzaXplKCkgewogCSAqIEB0aHJvd3MgamF2YS5sYW5nLkFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbgogCSAqICAgICAgICAgICAgIHRoZSBpbmRleCBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZQogCSAqLwotCXB1YmxpYyBsb25nIGdldChmaW5hbCBpbnQgaSkgeworCXB1YmxpYyBsb25nIGdldChpbnQgaSkgewogCQlpZiAoY291bnQgPD0gaSkKIAkJCXRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oaSk7CiAJCXJldHVybiBlbnRyaWVzW2ldOwpAQCAtMTAyLDcgKzEwMiw3IEBAIHB1YmxpYyBsb25nIGdldChmaW5hbCBpbnQgaSkgewogCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCiAJICogQHJldHVybiB0cnVlIG9mIHtAY29kZSB2YWx1ZX0gYXBwZWFycyBpbiB0aGlzIGxpc3QuCiAJICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgbG9uZyB2YWx1ZSkgeworCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGxvbmcgdmFsdWUpIHsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQogCQkJaWYgKGVudHJpZXNbaV0gPT0gdmFsdWUpCiAJCQkJcmV0dXJuIHRydWU7CkBAIC0xMjIsNyArMTIyLDcgQEAgcHVibGljIHZvaWQgY2xlYXIoKSB7CiAJICogQHBhcmFtIG4KIAkgKiAgICAgICAgICAgIHRoZSBudW1iZXIgdG8gYWRkLgogCSAqLwotCXB1YmxpYyB2b2lkIGFkZChmaW5hbCBsb25nIG4pIHsKKwlwdWJsaWMgdm9pZCBhZGQobG9uZyBuKSB7CiAJCWlmIChjb3VudCA9PSBlbnRyaWVzLmxlbmd0aCkKIAkJCWdyb3coKTsKIAkJZW50cmllc1tjb3VudCsrXSA9IG47CkBAIC0xMzYsNyArMTM2LDcgQEAgcHVibGljIHZvaWQgYWRkKGZpbmFsIGxvbmcgbikgewogCSAqIEBwYXJhbSBuCiAJICogICAgICAgICAgICB2YWx1ZSB0byBzdG9yZSBhdCB0aGUgcG9zaXRpb24uCiAJICovCi0JcHVibGljIHZvaWQgc2V0KGZpbmFsIGludCBpbmRleCwgZmluYWwgbG9uZyBuKSB7CisJcHVibGljIHZvaWQgc2V0KGludCBpbmRleCwgbG9uZyBuKSB7CiAJCWlmIChjb3VudCA8IGluZGV4KQogCQkJdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihpbmRleCk7CiAJCWVsc2UgaWYgKGNvdW50ID09IGluZGV4KQpAQCAtMTU1LDcgKzE1NSw3IEBAIGVsc2UgaWYgKGNvdW50ID09IGluZGV4KQogCSAqIEBwYXJhbSB2YWwKIAkgKiAgICAgICAgICAgIHZhbHVlIHRvIGluc2VydCBpbnRvIHBhZGRlZCBwb3NpdGlvbnMuCiAJICovCi0JcHVibGljIHZvaWQgZmlsbFRvKGludCB0b0luZGV4LCBmaW5hbCBsb25nIHZhbCkgeworCXB1YmxpYyB2b2lkIGZpbGxUbyhpbnQgdG9JbmRleCwgbG9uZyB2YWwpIHsKIAkJd2hpbGUgKGNvdW50IDwgdG9JbmRleCkKIAkJCWFkZCh2YWwpOwogCX0KZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Mb25nTWFwLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvTG9uZ01hcC5qYXZhCmluZGV4IDA5ZWVlNDIuLjhjN2Y2NzIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Mb25nTWFwLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL0xvbmdNYXAuamF2YQpAQCAtMTQ0LDcgKzE0NCw3IEBAIHB1YmxpYyBWIHB1dChsb25nIGtleSwgViB2YWx1ZSkgewogCQlyZXR1cm4gbnVsbDsKIAl9CiAKLQlwcml2YXRlIHZvaWQgaW5zZXJ0KGZpbmFsIE5vZGU8Vj4gbikgeworCXByaXZhdGUgdm9pZCBpbnNlcnQoTm9kZTxWPiBuKSB7CiAJCWZpbmFsIGludCBpZHggPSBpbmRleChuLmtleSk7CiAJCW4ubmV4dCA9IHRhYmxlW2lkeF07CiAJCXRhYmxlW2lkeF0gPSBuOwpAQCAtMTY2LDE0ICsxNjYsMTQgQEAgcHJpdmF0ZSB2b2lkIGdyb3coKSB7CiAJCX0KIAl9CiAKLQlwcml2YXRlIGZpbmFsIGludCBpbmRleChmaW5hbCBsb25nIGtleSkgeworCXByaXZhdGUgZmluYWwgaW50IGluZGV4KGxvbmcga2V5KSB7CiAJCWludCBoID0gKChpbnQpIGtleSkgPj4+IDE7CiAJCWggXj0gKGggPj4+IDIwKSBeIChoID4+PiAxMik7CiAJCXJldHVybiBoICYgKHRhYmxlLmxlbmd0aCAtIDEpOwogCX0KIAogCUBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIDxWPiBOb2RlPFY+W10gY3JlYXRlQXJyYXkoZmluYWwgaW50IHN6KSB7CisJcHJpdmF0ZSBzdGF0aWMgZmluYWwgPFY+IE5vZGU8Vj5bXSBjcmVhdGVBcnJheShpbnQgc3opIHsKIAkJcmV0dXJuIG5ldyBOb2RlW3N6XTsKIAl9CiAKQEAgLTE4Miw3ICsxODIsNyBAQCBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb2RlPFY+IHsKIAkJViB2YWx1ZTsKIAkJTm9kZTxWPiBuZXh0OwogCi0JCU5vZGUoZmluYWwgbG9uZyBrLCBmaW5hbCBWIHYpIHsKKwkJTm9kZShsb25nIGssIFYgdikgewogCQkJa2V5ID0gazsKIAkJCXZhbHVlID0gdjsKIAkJfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1F1b3RlZFN0cmluZy5qYXZhCmluZGV4IDc3YmMyNDkuLjRkNThkMDYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9RdW90ZWRTdHJpbmcuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUXVvdGVkU3RyaW5nLmphdmEKQEAgLTk5LDcgKzk5LDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIFF1b3RlZFN0cmluZyB7CiAJICogQHJldHVybiB0aGUgY2xlYW5lZCBzdHJpbmcuCiAJICogQHNlZSAjZGVxdW90ZShieXRlW10sIGludCwgaW50KQogCSAqLwotCXB1YmxpYyBTdHJpbmcgZGVxdW90ZShmaW5hbCBTdHJpbmcgaW4pIHsKKwlwdWJsaWMgU3RyaW5nIGRlcXVvdGUoU3RyaW5nIGluKSB7CiAJCWZpbmFsIGJ5dGVbXSBiID0gQ29uc3RhbnRzLmVuY29kZShpbik7CiAJCXJldHVybiBkZXF1b3RlKGIsIDAsIGIubGVuZ3RoKTsKIAl9CkBAIC0xMzcsNyArMTM3LDcgQEAgcHVibGljIFN0cmluZyBkZXF1b3RlKGZpbmFsIFN0cmluZyBpbikgewogCSAqLwogCXB1YmxpYyBzdGF0aWMgY2xhc3MgQm91cm5lU3R5bGUgZXh0ZW5kcyBRdW90ZWRTdHJpbmcgewogCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBxdW90ZShmaW5hbCBTdHJpbmcgaW4pIHsKKwkJcHVibGljIFN0cmluZyBxdW90ZShTdHJpbmcgaW4pIHsKIAkJCWZpbmFsIFN0cmluZ0J1aWxkZXIgciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CiAJCQlyLmFwcGVuZCgnXCcnKTsKIAkJCWludCBzdGFydCA9IDAsIGkgPSAwOwpAQCAtMTYwLDcgKzE2MCw3IEBAIHB1YmxpYyBTdHJpbmcgcXVvdGUoZmluYWwgU3RyaW5nIGluKSB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBkZXF1b3RlKGZpbmFsIGJ5dGVbXSBpbiwgaW50IGlwLCBmaW5hbCBpbnQgaWUpIHsKKwkJcHVibGljIFN0cmluZyBkZXF1b3RlKGJ5dGVbXSBpbiwgaW50IGlwLCBpbnQgaWUpIHsKIAkJCWJvb2xlYW4gaW5xdW90ZSA9IGZhbHNlOwogCQkJZmluYWwgYnl0ZVtdIHIgPSBuZXcgYnl0ZVtpZSAtIGlwXTsKIAkJCWludCByUHRyID0gMDsKQEAgLTE4OCw3ICsxODgsNyBAQCBwdWJsaWMgU3RyaW5nIGRlcXVvdGUoZmluYWwgYnl0ZVtdIGluLCBpbnQgaXAsIGZpbmFsIGludCBpZSkgewogCS8qKiBCb3VybmUgc3R5bGUsIGJ1dCBwZXJtaXRzIDxjb2RlPn51c2VyPC9jb2RlPiBhdCB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZy4gKi8KIAlwdWJsaWMgc3RhdGljIGNsYXNzIEJvdXJuZVVzZXJQYXRoU3R5bGUgZXh0ZW5kcyBCb3VybmVTdHlsZSB7CiAJCUBPdmVycmlkZQotCQlwdWJsaWMgU3RyaW5nIHF1b3RlKGZpbmFsIFN0cmluZyBpbikgeworCQlwdWJsaWMgU3RyaW5nIHF1b3RlKFN0cmluZyBpbikgewogCQkJaWYgKGluLm1hdGNoZXMoIl5+W0EtWmEtejAtOV8tXSskIikpIHsgLy8kTk9OLU5MUy0xJAogCQkJCS8vIElmIHRoZSBzdHJpbmcgaXMganVzdCAifnVzZXIiIHdlIGNhbiBhc3N1bWUgdGhleQogCQkJCS8vIG1lYW4gIn51c2VyLyIuCkBAIC0yNTUsNyArMjU1LDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHaXRQYXRoU3R5bGUgZXh0ZW5kcyBRdW90ZWRTdHJpbmcgewogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyBTdHJpbmcgcXVvdGUoZmluYWwgU3RyaW5nIGluc3RyKSB7CisJCXB1YmxpYyBTdHJpbmcgcXVvdGUoU3RyaW5nIGluc3RyKSB7CiAJCQlpZiAoaW5zdHIubGVuZ3RoKCkgPT0gMCkKIAkJCQlyZXR1cm4gIlwiXCIiOyAvLyROT04tTkxTLTEkCiAJCQlib29sZWFuIHJldXNlID0gdHJ1ZTsKQEAgLTI5MSwxMyArMjkxLDEzIEBAIHB1YmxpYyBTdHJpbmcgcXVvdGUoZmluYWwgU3RyaW5nIGluc3RyKSB7CiAJCX0KIAogCQlAT3ZlcnJpZGUKLQkJcHVibGljIFN0cmluZyBkZXF1b3RlKGZpbmFsIGJ5dGVbXSBpbiwgZmluYWwgaW50IGluUHRyLCBmaW5hbCBpbnQgaW5FbmQpIHsKKwkJcHVibGljIFN0cmluZyBkZXF1b3RlKGJ5dGVbXSBpbiwgaW50IGluUHRyLCBpbnQgaW5FbmQpIHsKIAkJCWlmICgyIDw9IGluRW5kIC0gaW5QdHIgJiYgaW5baW5QdHJdID09ICciJyAmJiBpbltpbkVuZCAtIDFdID09ICciJykKIAkJCQlyZXR1cm4gZHEoaW4sIGluUHRyICsgMSwgaW5FbmQgLSAxKTsKIAkJCXJldHVybiBSYXdQYXJzZVV0aWxzLmRlY29kZShDb25zdGFudHMuQ0hBUlNFVCwgaW4sIGluUHRyLCBpbkVuZCk7CiAJCX0KIAotCQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZHEoZmluYWwgYnl0ZVtdIGluLCBpbnQgaW5QdHIsIGZpbmFsIGludCBpbkVuZCkgeworCQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZHEoYnl0ZVtdIGluLCBpbnQgaW5QdHIsIGludCBpbkVuZCkgewogCQkJZmluYWwgYnl0ZVtdIHIgPSBuZXcgYnl0ZVtpbkVuZCAtIGluUHRyXTsKIAkJCWludCByUHRyID0gMDsKIAkJCXdoaWxlIChpblB0ciA8IGluRW5kKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3Q2hhclNlcXVlbmNlLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3Q2hhclNlcXVlbmNlLmphdmEKaW5kZXggMjNlZTlkMC4uNDIwNjBjNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd0NoYXJTZXF1ZW5jZS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdDaGFyU2VxdWVuY2UuamF2YQpAQCAtNjgsNyArNjgsNyBAQCBwdWJsaWMgZmluYWwgY2xhc3MgUmF3Q2hhclNlcXVlbmNlIGltcGxlbWVudHMgQ2hhclNlcXVlbmNlIHsKIAkgKiBAcGFyYW0gZW5kCiAJICogICAgICAgICAgICBlbmRpbmcgcG9zaXRpb24gZm9yIHRoZSBzZXF1ZW5jZS4KIAkgKi8KLQlwdWJsaWMgUmF3Q2hhclNlcXVlbmNlKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBzdGFydCwgZmluYWwgaW50IGVuZCkgeworCXB1YmxpYyBSYXdDaGFyU2VxdWVuY2UoYnl0ZVtdIGJ1ZiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CiAJCWJ1ZmZlciA9IGJ1ZjsKIAkJc3RhcnRQdHIgPSBzdGFydDsKIAkJZW5kUHRyID0gZW5kOwpAQCAtNzYsNyArNzYsNyBAQCBwdWJsaWMgUmF3Q2hhclNlcXVlbmNlKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBzdGFydCwgZmluYWwgaW50IGVuZCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgY2hhciBjaGFyQXQoZmluYWwgaW50IGluZGV4KSB7CisJcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgewogCQlyZXR1cm4gKGNoYXIpIChidWZmZXJbc3RhcnRQdHIgKyBpbmRleF0gJiAweGZmKTsKIAl9CiAKQEAgLTg4LDcgKzg4LDcgQEAgcHVibGljIGludCBsZW5ndGgoKSB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBDaGFyU2VxdWVuY2Ugc3ViU2VxdWVuY2UoZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgZW5kKSB7CisJcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKIAkJcmV0dXJuIG5ldyBSYXdDaGFyU2VxdWVuY2UoYnVmZmVyLCBzdGFydFB0ciArIHN0YXJ0LCBzdGFydFB0ciArIGVuZCk7CiAJfQogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlscy5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1BhcnNlVXRpbHMuamF2YQppbmRleCAwMTRjNzcyLi5jMjJjOGRlIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3UGFyc2VVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdQYXJzZVV0aWxzLmphdmEKQEAgLTYzLDYgKzYzLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5hbm5vdGF0aW9ucy5OdWxsYWJsZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmVycm9ycy5CaW5hcnlCbG9iRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQubGliLkNvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmxpYi5QZXJzb25JZGVudDsKIApAQCAtMTI1LDcgKzEyNiw3IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBSYXdQYXJzZVV0aWxzIHsKIAkgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gdGVzdCBmb3IgZXF1YWxpdHkgd2l0aCBiLgogCSAqIEByZXR1cm4gcHRyICsgc3JjLmxlbmd0aCBpZiBiW3B0ci4uc3JjLmxlbmd0aF0gPT0gc3JjOyBlbHNlIC0xLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG1hdGNoKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyLCBmaW5hbCBieXRlW10gc3JjKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbWF0Y2goYnl0ZVtdIGIsIGludCBwdHIsIGJ5dGVbXSBzcmMpIHsKIAkJaWYgKHB0ciArIHNyYy5sZW5ndGggPiBiLmxlbmd0aCkKIAkJCXJldHVybiAtMTsKIAkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyssIHB0cisrKQpAQCAtNDYxLDcgKzQ2Miw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhcnNlSGV4SW50NChmaW5hbCBieXRlIGRpZ2l0KSB7CiAJICogICAgICAgICAgICBwb3NpdGlvbiB3aXRoaW4gYnVmZmVyIHRvIHN0YXJ0IHBhcnNpbmcgZGlnaXRzIGF0LgogCSAqIEByZXR1cm4gdGhlIHRpbWV6b25lIGF0IHRoaXMgbG9jYXRpb24sIGV4cHJlc3NlZCBpbiBtaW51dGVzLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHBhcnNlVGltZVpvbmVPZmZzZXQoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBwYXJzZVRpbWVab25lT2Zmc2V0KGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCXJldHVybiBwYXJzZVRpbWVab25lT2Zmc2V0KGIsIHB0ciwgbnVsbCk7CiAJfQogCkBAIC01MDAsNyArNTAxLDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcGFyc2VUaW1lWm9uZU9mZnNldChmaW5hbCBieXRlW10gYiwgaW50IHB0ciwKIAkgKiAgICAgICAgICAgIGNoYXJhY3RlciB0byBmaW5kLgogCSAqIEByZXR1cm4gbmV3IHBvc2l0aW9uIGp1c3QgYWZ0ZXIgY2hyQS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0KGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyLCBmaW5hbCBjaGFyIGNockEpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0KGJ5dGVbXSBiLCBpbnQgcHRyLCBjaGFyIGNockEpIHsKIAkJZmluYWwgaW50IHN6ID0gYi5sZW5ndGg7CiAJCXdoaWxlIChwdHIgPCBzeikgewogCQkJaWYgKGJbcHRyKytdID09IGNockEpCkBAIC01MjAsNyArNTIxLDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgbmV4dChmaW5hbCBieXRlW10gYiwgaW50IHB0ciwgZmluYWwgY2hhciBjaHJBKSB7CiAJICogICAgICAgICAgICBwb3NpdGlvbiB3aXRoaW4gYnVmZmVyIHRvIHN0YXJ0IGxvb2tpbmcgZm9yIExGIGF0LgogCSAqIEByZXR1cm4gbmV3IHBvc2l0aW9uIGp1c3QgYWZ0ZXIgdGhlIGZpcnN0IExGIGZvdW5kLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHRMRihmaW5hbCBieXRlW10gYiwgaW50IHB0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHRMRihieXRlW10gYiwgaW50IHB0cikgewogCQlyZXR1cm4gbmV4dChiLCBwdHIsICdcbicpOwogCX0KIApAQCAtNTM3LDcgKzUzOCw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHRMRihmaW5hbCBieXRlW10gYiwgaW50IHB0cikgewogCSAqICAgICAgICAgICAgY2hhcmFjdGVyIHRvIGZpbmQuCiAJICogQHJldHVybiBuZXcgcG9zaXRpb24ganVzdCBhZnRlciB0aGUgZmlyc3QgY2hyQSBvciBMRiB0byBiZSBmb3VuZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBuZXh0TEYoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIsIGZpbmFsIGNoYXIgY2hyQSkgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHRMRihieXRlW10gYiwgaW50IHB0ciwgY2hhciBjaHJBKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQl3aGlsZSAocHRyIDwgc3opIHsKIAkJCWZpbmFsIGJ5dGUgYyA9IGJbcHRyKytdOwpAQCAtNTU4LDcgKzU1OSw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IG5leHRMRihmaW5hbCBieXRlW10gYiwgaW50IHB0ciwgZmluYWwgY2hhciBjaHJBKSB7CiAJICogICAgICAgICAgICBjaGFyYWN0ZXIgdG8gZmluZC4KIAkgKiBAcmV0dXJuIG5ldyBwb3NpdGlvbiBqdXN0IGJlZm9yZSBjaHJBLCAtMSBmb3Igbm90IGZvdW5kCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJldihmaW5hbCBieXRlW10gYiwgaW50IHB0ciwgZmluYWwgY2hhciBjaHJBKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJldihieXRlW10gYiwgaW50IHB0ciwgY2hhciBjaHJBKSB7CiAJCWlmIChwdHIgPT0gYi5sZW5ndGgpCiAJCQktLXB0cjsKIAkJd2hpbGUgKHB0ciA+PSAwKSB7CkBAIC01NzksNyArNTgwLDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJldihmaW5hbCBieXRlW10gYiwgaW50IHB0ciwgZmluYWwgY2hhciBjaHJBKSB7CiAJICogICAgICAgICAgICBwb3NpdGlvbiB3aXRoaW4gYnVmZmVyIHRvIHN0YXJ0IGxvb2tpbmcgZm9yIExGIGF0LgogCSAqIEByZXR1cm4gbmV3IHBvc2l0aW9uIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBMRiBmb3VuZCwgLTEgZm9yIG5vdCBmb3VuZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXZMRihmaW5hbCBieXRlW10gYiwgaW50IHB0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXZMRihieXRlW10gYiwgaW50IHB0cikgewogCQlyZXR1cm4gcHJldihiLCBwdHIsICdcbicpOwogCX0KIApAQCAtNTk3LDcgKzU5OCw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXZMRihmaW5hbCBieXRlW10gYiwgaW50IHB0cikgewogCSAqIEByZXR1cm4gbmV3IHBvc2l0aW9uIGp1c3QgYmVmb3JlIHRoZSBmaXJzdCBjaHJBIG9yIExGIHRvIGJlIGZvdW5kLCAtMSBmb3IKIAkgKiAgICAgICAgIG5vdCBmb3VuZAogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXZMRihmaW5hbCBieXRlW10gYiwgaW50IHB0ciwgZmluYWwgY2hhciBjaHJBKSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgcHJldkxGKGJ5dGVbXSBiLCBpbnQgcHRyLCBjaGFyIGNockEpIHsKIAkJaWYgKHB0ciA9PSBiLmxlbmd0aCkKIAkJCS0tcHRyOwogCQl3aGlsZSAocHRyID49IDApIHsKQEAgLTYzMiwxMSArNjMzLDQ3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHByZXZMRihmaW5hbCBieXRlW10gYiwgaW50IHB0ciwgZmluYWwgY2hhciBjaHJBKSB7CiAJICogICAgICAgICAgICBsaW5lIDEuCiAJICogQHBhcmFtIGVuZAogCSAqICAgICAgICAgICAgMSBwYXN0IHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQgd2l0aGluIDxjb2RlPmJ1ZjwvY29kZT4uCi0JICogQHJldHVybiBhIGxpbmUgbWFwIGluZGV4aW5nIHRoZSBzdGFydCBwb3NpdGlvbiBvZiBlYWNoIGxpbmUuCisJICogQHJldHVybiBhIGxpbmUgbWFwIGluZGljYXRpbmcgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIGVhY2ggbGluZSwgb3IgYQorCSAqICAgICAgICAgbWFwIHJlcHJlc2VudGluZyB0aGUgZW50aXJlIGJ1ZmZlciBhcyBhIHNpbmdsZSBsaW5lIGlmCisJICogICAgICAgICA8Y29kZT5idWY8L2NvZGU+IGNvbnRhaW5zIGEgTlVMIGJ5dGUuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBJbnRMaXN0IGxpbmVNYXAoZmluYWwgYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgaW50IGVuZCkgewotCQlpbnQgc3RhcnQgPSBwdHI7CisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRMaXN0IGxpbmVNYXAoYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgaW50IGVuZCkgeworCQlJbnRMaXN0IG1hcCA9IGxpbmVNYXBPck51bGwoYnVmLCBwdHIsIGVuZCk7CisJCWlmIChtYXAgPT0gbnVsbCkgeworCQkJbWFwID0gbmV3IEludExpc3QoMyk7CisJCQltYXAuYWRkKEludGVnZXIuTUlOX1ZBTFVFKTsKKwkJCW1hcC5hZGQocHRyKTsKKwkJCW1hcC5hZGQoZW5kKTsKKwkJfQorCQlyZXR1cm4gbWFwOworCX0KIAorCS8qKgorCSAqIExpa2Uge0BsaW5rICNsaW5lTWFwKGJ5dGVbXSwgaW50LCBpbnQpfSBidXQgdGhyb3cKKwkgKiB7QGxpbmsgQmluYXJ5QmxvYkV4Y2VwdGlvbn0gaWYgYSBOVUwgYnl0ZSBpcyBlbmNvdW50ZXJlZC4KKwkgKgorCSAqIEBwYXJhbSBidWYKKwkgKiAgICAgICAgICAgIGJ1ZmZlciB0byBzY2FuLgorCSAqIEBwYXJhbSBwdHIKKwkgKiAgICAgICAgICAgIHBvc2l0aW9uIHdpdGhpbiB0aGUgYnVmZmVyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpcnN0IGJ5dGUgb2YKKwkgKiAgICAgICAgICAgIGxpbmUgMS4KKwkgKiBAcGFyYW0gZW5kCisJICogICAgICAgICAgICAxIHBhc3QgdGhlIGVuZCBvZiB0aGUgY29udGVudCB3aXRoaW4gPGNvZGU+YnVmPC9jb2RlPi4KKwkgKiBAcmV0dXJuIGEgbGluZSBtYXAgaW5kaWNhdGluZyB0aGUgc3RhcnRpbmcgcG9zaXRpb24gb2YgZWFjaCBsaW5lLgorCSAqIEB0aHJvd3MgQmluYXJ5QmxvYkV4Y2VwdGlvbgorCSAqICAgICAgICAgICAgaWYgYSBOVUwgYnl0ZSBpcyBmb3VuZC4KKwkgKiBAc2luY2UgNS4wCisJICovCisJcHVibGljIHN0YXRpYyBmaW5hbCBJbnRMaXN0IGxpbmVNYXBPckJpbmFyeShieXRlW10gYnVmLCBpbnQgcHRyLCBpbnQgZW5kKQorCQkJdGhyb3dzIEJpbmFyeUJsb2JFeGNlcHRpb24geworCQlJbnRMaXN0IG1hcCA9IGxpbmVNYXBPck51bGwoYnVmLCBwdHIsIGVuZCk7CisJCWlmIChtYXAgPT0gbnVsbCkgeworCQkJdGhyb3cgbmV3IEJpbmFyeUJsb2JFeGNlcHRpb24oKTsKKwkJfQorCQlyZXR1cm4gbWFwOworCX0KKworCXByaXZhdGUgc3RhdGljIEBOdWxsYWJsZSBJbnRMaXN0IGxpbmVNYXBPck51bGwoYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgaW50IGVuZCkgewogCQkvLyBFeHBlcmltZW50YWxseSBkZXJpdmVkIGZyb20gbXVsdGlwbGUgc291cmNlIHJlcG9zaXRvcmllcwogCQkvLyB0aGUgYXZlcmFnZSBudW1iZXIgb2YgYnl0ZXMvbGluZSBpcyAzNi4gSXRzIGEgcm91Z2ggZ3Vlc3MKIAkJLy8gdG8gaW5pdGlhbGx5IHNpemUgb3VyIG1hcCBjbG9zZSB0byB0aGUgdGFyZ2V0LgpAQCAtNjQ5LDExICs2ODYsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIEludExpc3QgbGluZU1hcChmaW5hbCBieXRlW10gYnVmLCBpbnQgcHRyLCBpbnQgZW5kKSB7CiAJCQl9CiAKIAkJCWlmIChidWZbcHRyXSA9PSAnXDAnKSB7Ci0JCQkJLy8gYmluYXJ5IGRhdGEuCi0JCQkJbWFwID0gbmV3IEludExpc3QoMyk7Ci0JCQkJbWFwLmFkZChJbnRlZ2VyLk1JTl9WQUxVRSk7Ci0JCQkJbWFwLmFkZChzdGFydCk7Ci0JCQkJYnJlYWs7CisJCQkJcmV0dXJuIG51bGw7CiAJCQl9CiAKIAkJCWZvdW5kTEYgPSAoYnVmW3B0cl0gPT0gJ1xuJyk7CkBAIC02NzUsNyArNzA4LDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBJbnRMaXN0IGxpbmVNYXAoZmluYWwgYnl0ZVtdIGJ1ZiwgaW50IHB0ciwgaW50IGVuZCkgewogCSAqICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSBhdXRob3IncyBuYW1lLiBJZiBubyBhdXRob3IgaGVhZGVyIGNhbiBiZQogCSAqICAgICAgICAgbG9jYXRlZCAtMSBpcyByZXR1cm5lZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhdXRob3IoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBhdXRob3IoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJZmluYWwgaW50IHN6ID0gYi5sZW5ndGg7CiAJCWlmIChwdHIgPT0gMCkKIAkJCXB0ciArPSA0NjsgLy8gc2tpcCB0aGUgInRyZWUgLi4uIiBsaW5lLgpAQCAtNjk3LDcgKzczMCw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGF1dGhvcihmaW5hbCBieXRlW10gYiwgaW50IHB0cikgewogCSAqICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSBjb21taXR0ZXIncyBuYW1lLiBJZiBubyBjb21taXR0ZXIgaGVhZGVyIGNhbiBiZQogCSAqICAgICAgICAgbG9jYXRlZCAtMSBpcyByZXR1cm5lZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21taXR0ZXIoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21taXR0ZXIoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJZmluYWwgaW50IHN6ID0gYi5sZW5ndGg7CiAJCWlmIChwdHIgPT0gMCkKIAkJCXB0ciArPSA0NjsgLy8gc2tpcCB0aGUgInRyZWUgLi4uIiBsaW5lLgpAQCAtNzIxLDcgKzc1NCw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbW1pdHRlcihmaW5hbCBieXRlW10gYiwgaW50IHB0cikgewogCSAqICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSB0YWdnZXIncyBuYW1lLiBJZiBubyB0YWdnZXIgaGVhZGVyIGNhbiBiZQogCSAqICAgICAgICAgbG9jYXRlZCAtMSBpcyByZXR1cm5lZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWdnZXIoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWdnZXIoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJZmluYWwgaW50IHN6ID0gYi5sZW5ndGg7CiAJCWlmIChwdHIgPT0gMCkKIAkJCXB0ciArPSA0ODsgLy8gc2tpcCB0aGUgIm9iamVjdCAuLi4iIGxpbmUuCkBAIC03NDksNyArNzgyLDcgQEAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFnZ2VyKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJICogICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIGVuY29kaW5nJ3MgbmFtZS4gSWYgbm8gZW5jb2RpbmcgaGVhZGVyIGNhbiBiZQogCSAqICAgICAgICAgbG9jYXRlZCAtMSBpcyByZXR1cm5lZCAoYW5kIFVURi04IHNob3VsZCBiZSBhc3N1bWVkKS4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbmNvZGluZyhmaW5hbCBieXRlW10gYiwgaW50IHB0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGVuY29kaW5nKGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQl3aGlsZSAocHRyIDwgc3opIHsKIAkJCWlmIChiW3B0cl0gPT0gJ1xuJykKQEAgLTc3Myw3ICs4MDYsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbmNvZGluZyhmaW5hbCBieXRlW10gYiwgaW50IHB0cikgewogCSAqIEBzaW5jZSA0LjIKIAkgKi8KIAlATnVsbGFibGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXJzZUVuY29kaW5nTmFtZShmaW5hbCBieXRlW10gYikgeworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlRW5jb2RpbmdOYW1lKGJ5dGVbXSBiKSB7CiAJCWludCBlbmMgPSBlbmNvZGluZyhiLCAwKTsKIAkJaWYgKGVuYyA8IDApIHsKIAkJCXJldHVybiBudWxsOwpAQCAtODAxLDcgKzgzNCw3IEBAIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhcnNlRW5jb2RpbmdOYW1lKGZpbmFsIGJ5dGVbXSBiKSB7CiAJICogICAgICAgICAgICAgaWYgdGhlIEpSRSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjaGFyYWN0ZXIgc2V0IHJlcXVlc3RlZCBieQogCSAqICAgICAgICAgICAgIHRoZSBlbmNvZGluZyBoZWFkZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBDaGFyc2V0IHBhcnNlRW5jb2RpbmcoZmluYWwgYnl0ZVtdIGIpIHsKKwlwdWJsaWMgc3RhdGljIENoYXJzZXQgcGFyc2VFbmNvZGluZyhieXRlW10gYikgewogCQlTdHJpbmcgZW5jID0gcGFyc2VFbmNvZGluZ05hbWUoYik7CiAJCWlmIChlbmMgPT0gbnVsbCkgewogCQkJcmV0dXJuIFVURl84OwpAQCAtODMxLDcgKzg2NCw3IEBAIHB1YmxpYyBzdGF0aWMgQ2hhcnNldCBwYXJzZUVuY29kaW5nKGZpbmFsIGJ5dGVbXSBiKSB7CiAJICogQHJldHVybiB0aGUgcGFyc2VkIGlkZW50aXR5IG9yIG51bGwgaW4gY2FzZSB0aGUgaWRlbnRpdHkgY291bGQgbm90IGJlCiAJICogICAgICAgICBwYXJzZWQuCiAJICovCi0JcHVibGljIHN0YXRpYyBQZXJzb25JZGVudCBwYXJzZVBlcnNvbklkZW50KGZpbmFsIFN0cmluZyBpbikgeworCXB1YmxpYyBzdGF0aWMgUGVyc29uSWRlbnQgcGFyc2VQZXJzb25JZGVudChTdHJpbmcgaW4pIHsKIAkJcmV0dXJuIHBhcnNlUGVyc29uSWRlbnQoQ29uc3RhbnRzLmVuY29kZShpbiksIDApOwogCX0KIApAQCAtODUzLDcgKzg4Niw3IEBAIHB1YmxpYyBzdGF0aWMgUGVyc29uSWRlbnQgcGFyc2VQZXJzb25JZGVudChmaW5hbCBTdHJpbmcgaW4pIHsKIAkgKiBAcmV0dXJuIHRoZSBwYXJzZWQgaWRlbnRpdHkgb3IgbnVsbCBpbiBjYXNlIHRoZSBpZGVudGl0eSBjb3VsZCBub3QgYmUKIAkgKiAgICAgICAgIHBhcnNlZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIFBlcnNvbklkZW50IHBhcnNlUGVyc29uSWRlbnQoZmluYWwgYnl0ZVtdIHJhdywgZmluYWwgaW50IG5hbWVCKSB7CisJcHVibGljIHN0YXRpYyBQZXJzb25JZGVudCBwYXJzZVBlcnNvbklkZW50KGJ5dGVbXSByYXcsIGludCBuYW1lQikgewogCQlDaGFyc2V0IGNzOwogCQl0cnkgewogCQkJY3MgPSBwYXJzZUVuY29kaW5nKHJhdyk7CkBAIC05NjEsNyArOTk0LDcgQEAgcHVibGljIHN0YXRpYyBQZXJzb25JZGVudCBwYXJzZVBlcnNvbklkZW50T25seShmaW5hbCBieXRlW10gcmF3LAogCSAqIEByZXR1cm4gcG9zaXRpb24gb2YgdGhlICc6JyB3aGljaCB0ZXJtaW5hdGVzIHRoZSBmb290ZXIgbGluZSBrZXkgaWYgdGhpcwogCSAqICAgICAgICAgaXMgb3RoZXJ3aXNlIGEgdmFsaWQgZm9vdGVyIGxpbmUga2V5OyBvdGhlcndpc2UgLTEuCiAJICovCi0JcHVibGljIHN0YXRpYyBpbnQgZW5kT2ZGb290ZXJMaW5lS2V5KGZpbmFsIGJ5dGVbXSByYXcsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGludCBlbmRPZkZvb3RlckxpbmVLZXkoYnl0ZVtdIHJhdywgaW50IHB0cikgewogCQl0cnkgewogCQkJZm9yICg7OykgewogCQkJCWZpbmFsIGJ5dGUgYyA9IHJhd1twdHJdOwpAQCAtOTg4LDcgKzEwMjEsNyBAQCBwdWJsaWMgc3RhdGljIGludCBlbmRPZkZvb3RlckxpbmVLZXkoZmluYWwgYnl0ZVtdIHJhdywgaW50IHB0cikgewogCSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJhbmdlIDxjb2RlPltzdGFydCxlbmQpPC9jb2RlPiwKIAkgKiAgICAgICAgIGFmdGVyIGRlY29kaW5nIHRoZSByZWdpb24gdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBzZXQuCiAJICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKGZpbmFsIGJ5dGVbXSBidWZmZXIpIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoYnl0ZVtdIGJ1ZmZlcikgewogCQlyZXR1cm4gZGVjb2RlKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCk7CiAJfQogCkBAIC0xMDI2LDcgKzEwNTksNyBAQCBwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoZmluYWwgYnl0ZVtdIGJ1ZmZlciwgZmluYWwgaW50IHN0YXJ0LAogCSAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJhbmdlIDxjb2RlPltzdGFydCxlbmQpPC9jb2RlPiwKIAkgKiAgICAgICAgIGFmdGVyIGRlY29kaW5nIHRoZSByZWdpb24gdGhyb3VnaCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlciBzZXQuCiAJICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlKGZpbmFsIENoYXJzZXQgY3MsIGZpbmFsIGJ5dGVbXSBidWZmZXIpIHsKKwlwdWJsaWMgc3RhdGljIFN0cmluZyBkZWNvZGUoQ2hhcnNldCBjcywgYnl0ZVtdIGJ1ZmZlcikgewogCQlyZXR1cm4gZGVjb2RlKGNzLCBidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgpOwogCX0KIApAQCAtMTE0Myw3ICsxMTc2LDcgQEAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdEJpbmFyeVN0cmluZyhmaW5hbCBieXRlW10gYnVmZmVyLAogCQlyZXR1cm4gci50b1N0cmluZygpOwogCX0KIAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBkZWNvZGUoZmluYWwgQnl0ZUJ1ZmZlciBiLCBmaW5hbCBDaGFyc2V0IGNoYXJzZXQpCisJcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZShCeXRlQnVmZmVyIGIsIENoYXJzZXQgY2hhcnNldCkKIAkJCXRocm93cyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewogCQlmaW5hbCBDaGFyc2V0RGVjb2RlciBkID0gY2hhcnNldC5uZXdEZWNvZGVyKCk7CiAJCWQub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwpAQCAtMTE2Miw3ICsxMTk1LDcgQEAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZShmaW5hbCBCeXRlQnVmZmVyIGIsIGZpbmFsIENoYXJzZXQgY2hhcnNldCkKIAkgKiAgICAgICAgICAgIGNvbW1pdCBidWZmZXIuCiAJICogQHJldHVybiBwb3NpdGlvbiBvZiB0aGUgdXNlcidzIG1lc3NhZ2UgYnVmZmVyLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbW1pdE1lc3NhZ2UoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKKwlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBjb21taXRNZXNzYWdlKGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQlpZiAocHRyID09IDApCiAJCQlwdHIgKz0gNDY7IC8vIHNraXAgdGhlICJ0cmVlIC4uLiIgbGluZS4KQEAgLTExODYsNyArMTIxOSw3IEBAIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IGNvbW1pdE1lc3NhZ2UoZmluYWwgYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkgKiAgICAgICAgICAgIGJ1ZmZlci4KIAkgKiBAcmV0dXJuIHBvc2l0aW9uIG9mIHRoZSB1c2VyJ3MgbWVzc2FnZSBidWZmZXIuCiAJICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgdGFnTWVzc2FnZShmaW5hbCBieXRlW10gYiwgaW50IHB0cikgeworCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IHRhZ01lc3NhZ2UoYnl0ZVtdIGIsIGludCBwdHIpIHsKIAkJZmluYWwgaW50IHN6ID0gYi5sZW5ndGg7CiAJCWlmIChwdHIgPT0gMCkKIAkJCXB0ciArPSA0ODsgLy8gc2tpcCB0aGUgIm9iamVjdCAuLi4iIGxpbmUuCkBAIC0xMjExLDcgKzEyNDQsNyBAQCBwdWJsaWMgc3RhdGljIGZpbmFsIGludCB0YWdNZXNzYWdlKGZpbmFsIGJ5dGVbXSBiLCBpbnQgcHRyKSB7CiAJICogQHJldHVybiBwb3NpdGlvbiBvZiB0aGUgTEYgYXQgdGhlIGVuZCBvZiB0aGUgcGFyYWdyYXBoOwogCSAqICAgICAgICAgPGNvZGU+Yi5sZW5ndGg8L2NvZGU+IGlmIG5vIHBhcmFncmFwaCBlbmQgY291bGQgYmUgbG9jYXRlZC4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBlbmRPZlBhcmFncmFwaChmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IHN0YXJ0KSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgZW5kT2ZQYXJhZ3JhcGgoYnl0ZVtdIGIsIGludCBzdGFydCkgewogCQlpbnQgcHRyID0gc3RhcnQ7CiAJCWZpbmFsIGludCBzeiA9IGIubGVuZ3RoOwogCQl3aGlsZSAocHRyIDwgc3ogJiYgKGJbcHRyXSAhPSAnXG4nICYmIGJbcHRyXSAhPSAnXHInKSkKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdTdWJTdHJpbmdQYXR0ZXJuLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmF3U3ViU3RyaW5nUGF0dGVybi5qYXZhCmluZGV4IGE4ZjliYzcuLjA0MGI1Y2IgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SYXdTdWJTdHJpbmdQYXR0ZXJuLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1Jhd1N1YlN0cmluZ1BhdHRlcm4uamF2YQpAQCAtNjYsNyArNjYsNyBAQCBwdWJsaWMgY2xhc3MgUmF3U3ViU3RyaW5nUGF0dGVybiB7CiAJICogICAgICAgICAgICBtZXRhLWNoYXJhY3RlcnMgYXJlIHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uLiBUaGUKIAkgKiAgICAgICAgICAgIHN0cmluZyBtYXkgbm90IGJlIHRoZSBlbXB0eSBzdHJpbmcuCiAJICovCi0JcHVibGljIFJhd1N1YlN0cmluZ1BhdHRlcm4oZmluYWwgU3RyaW5nIHBhdHRlcm5UZXh0KSB7CisJcHVibGljIFJhd1N1YlN0cmluZ1BhdHRlcm4oU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJCWlmIChwYXR0ZXJuVGV4dC5sZW5ndGgoKSA9PSAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihKR2l0VGV4dC5nZXQoKS5jYW5ub3RNYXRjaE9uRW1wdHlTdHJpbmcpOwogCQluZWVkbGVTdHJpbmcgPSBwYXR0ZXJuVGV4dDsKQEAgLTg3LDcgKzg3LDcgQEAgcHVibGljIFJhd1N1YlN0cmluZ1BhdHRlcm4oZmluYWwgU3RyaW5nIHBhdHRlcm5UZXh0KSB7CiAJICogICAgICAgICBwYXR0ZXJuOyAtMSBpZiB0aGlzIHBhdHRlcm4gZG9lcyBub3QgYXBwZWFyIGF0IGFueSBwb3NpdGlvbiBvZgogCSAqICAgICAgICAgPGNvZGU+cmNzPC9jb2RlPi4KIAkgKi8KLQlwdWJsaWMgaW50IG1hdGNoKGZpbmFsIFJhd0NoYXJTZXF1ZW5jZSByY3MpIHsKKwlwdWJsaWMgaW50IG1hdGNoKFJhd0NoYXJTZXF1ZW5jZSByY3MpIHsKIAkJZmluYWwgaW50IG5lZWRsZUxlbiA9IG5lZWRsZS5sZW5ndGg7CiAJCWZpbmFsIGJ5dGUgZmlyc3QgPSBuZWVkbGVbMF07CiAKQEAgLTExNCwxMSArMTE0LDExIEBAIHB1YmxpYyBpbnQgbWF0Y2goZmluYWwgUmF3Q2hhclNlcXVlbmNlIHJjcykgewogCQlyZXR1cm4gLTE7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBuZXEoZmluYWwgYnl0ZSBhLCBmaW5hbCBieXRlIGIpIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIG5lcShieXRlIGEsIGJ5dGUgYikgewogCQlyZXR1cm4gYSAhPSBiICYmIGEgIT0gbGMoYik7CiAJfQogCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBsYyhmaW5hbCBieXRlIHEpIHsKKwlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGxjKGJ5dGUgcSkgewogCQlyZXR1cm4gKGJ5dGUpIFN0cmluZ1V0aWxzLnRvTG93ZXJDYXNlKChjaGFyKSAocSAmIDB4ZmYpKTsKIAl9CiAKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SZWZNYXAuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9SZWZNYXAuamF2YQppbmRleCBjMWFhZWNmLi5hM2Y5NzMwIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvUmVmTWFwLmphdmEKKysrIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1JlZk1hcC5qYXZhCkBAIC0xNjksNyArMTY5LDcgQEAgcHVibGljIFJlZiBnZXQoT2JqZWN0IGtleSkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgUmVmIHB1dChmaW5hbCBTdHJpbmcga2V5TmFtZSwgUmVmIHZhbHVlKSB7CisJcHVibGljIFJlZiBwdXQoU3RyaW5nIGtleU5hbWUsIFJlZiB2YWx1ZSkgewogCQlTdHJpbmcgbmFtZSA9IHRvUmVmTmFtZShrZXlOYW1lKTsKIAogCQlpZiAoIW5hbWUuZXF1YWxzKHZhbHVlLmdldE5hbWUoKSkpCkBAIC0zNTUsNyArMzU1LDcgQEAgcHVibGljIEVudHJ5PFN0cmluZywgUmVmPiBwZWVrKCkgewogCQkJcmV0dXJuIG51bGw7CiAJCX0KIAotCQlwcml2YXRlIFJlZiByZXNvbHZlTG9vc2UoZmluYWwgUmVmIGwpIHsKKwkJcHJpdmF0ZSBSZWYgcmVzb2x2ZUxvb3NlKFJlZiBsKSB7CiAJCQlpZiAocmVzb2x2ZWRJZHggPCByZXNvbHZlZC5zaXplKCkpIHsKIAkJCQlSZWYgciA9IHJlc29sdmVkLmdldChyZXNvbHZlZElkeCk7CiAJCQkJaW50IGNtcCA9IFJlZkNvbXBhcmF0b3IuY29tcGFyZVRvKGwsIHIpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1NzaFN1cHBvcnQuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Tc2hTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEzYWE3MgotLS0gL2Rldi9udWxsCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9Tc2hTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTgsIE1hcmt1cyBEdWZ0IDxtYXJrdXMuZHVmdEBzc2ktc2NoYWVmZXIuY29tPgorICogYW5kIG90aGVyIGNvcHlyaWdodCBvd25lcnMgYXMgZG9jdW1lbnRlZCBpbiB0aGUgcHJvamVjdCdzIElQIGxvZy4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZQorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYxLjAgd2hpY2gKKyAqIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBpcyByZXByb2R1Y2VkIGJlbG93LCBhbmQgaXMKKyAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAKKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKKyAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZworICogY29uZGl0aW9ucyBhcmUgbWV0OgorICoKKyAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICoKKyAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZworICogICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKKyAqICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCBJbmMuIG5vciB0aGUKKyAqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgorICogICB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECisgKiBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAorICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKKyAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCisgKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAorICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7CisgKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCisgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAorICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKKyAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIG9yZy5lY2xpcHNlLmpnaXQudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LmFubm90YXRpb25zLk51bGxhYmxlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQuZXJyb3JzLkNvbW1hbmRGYWlsZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC5pbnRlcm5hbC5KR2l0VGV4dDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZ2l0LnRyYW5zcG9ydC5DcmVkZW50aWFsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudHJhbnNwb3J0LlJlbW90ZVNlc3Npb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuU3NoU2Vzc2lvbkZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UuamdpdC50cmFuc3BvcnQuVVJJaXNoOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5NZXNzYWdlV3JpdGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpnaXQudXRpbC5pby5TdHJlYW1Db3B5VGhyZWFkOworCisvKioKKyAqIEV4dHJhIHV0aWxpdGllcyB0byBzdXBwb3J0IHVzYWdlIG9mIFNTSC4KKyAqCisgKiBAc2luY2UgNS4wCisgKi8KK3B1YmxpYyBjbGFzcyBTc2hTdXBwb3J0IHsKKworCS8qKgorCSAqIFV0aWxpdHkgdG8gZXhlY3V0ZSBhIHJlbW90ZSBTU0ggY29tbWFuZCBhbmQgcmVhZCB0aGUgZmlyc3QgbGluZSBvZgorCSAqIG91dHB1dC4KKwkgKgorCSAqIEBwYXJhbSBzc2hVcmkKKwkgKiAgICAgICAgICAgIHRoZSBTU0ggcmVtb3RlIFVSSQorCSAqIEBwYXJhbSBwcm92aWRlcgorCSAqICAgICAgICAgICAgdGhlIHtAbGluayBDcmVkZW50aWFsc1Byb3ZpZGVyfSBvciA8Y29kZT5udWxsPC9jb2RlPi4KKwkgKiBAcGFyYW0gZnMKKwkgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgRlN9IGltcGxlbWVudGF0aW9uIHBhc3NlZCB0bworCSAqICAgICAgICAgICAge0BsaW5rIFNzaFNlc3Npb25GYWN0b3J5fQorCSAqIEBwYXJhbSBjb21tYW5kCisJICogICAgICAgICAgICB0aGUgcmVtb3RlIGNvbW1hbmQgdG8gZXhlY3V0ZS4KKwkgKiBAcGFyYW0gdGltZW91dAorCSAqICAgICAgICAgICAgYSB0aW1lb3V0IGluIHNlY29uZHMuIFRoZSB0aW1lb3V0IG1heSBiZSBleGNlZWRlZCBpbiBjb3JuZXIKKwkgKiAgICAgICAgICAgIGNhc2VzLgorCSAqIEByZXR1cm4gVGhlIGVudGlyZSBvdXRwdXQgcmVhZCBmcm9tIHN0ZG91dC4KKwkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisJICogQHRocm93cyBDb21tYW5kRmFpbGVkRXhjZXB0aW9uCisJICogICAgICAgICAgICAgaWYgdGhlIHNzaCBjb21tYW5kIGV4ZWN1dGlvbiBmYWlsZWQsIGVycm9yIG1lc3NhZ2UgY29udGFpbnMKKwkgKiAgICAgICAgICAgICB0aGUgY29udGVudCBvZiBzdGRlcnIuCisJICovCisJcHVibGljIHN0YXRpYyBTdHJpbmcgcnVuU3NoQ29tbWFuZChVUklpc2ggc3NoVXJpLAorCQkJQE51bGxhYmxlIENyZWRlbnRpYWxzUHJvdmlkZXIgcHJvdmlkZXIsIEZTIGZzLCBTdHJpbmcgY29tbWFuZCwKKwkJCWludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvbW1hbmRGYWlsZWRFeGNlcHRpb24geworCQlSZW1vdGVTZXNzaW9uIHNlc3Npb24gPSBudWxsOworCQlQcm9jZXNzIHByb2Nlc3MgPSBudWxsOworCQlTdHJlYW1Db3B5VGhyZWFkIGVycm9yVGhyZWFkID0gbnVsbDsKKwkJU3RyZWFtQ29weVRocmVhZCBvdXRUaHJlYWQgPSBudWxsOworCQlDb21tYW5kRmFpbGVkRXhjZXB0aW9uIGZhaWx1cmUgPSBudWxsOworCQlAU3VwcHJlc3NXYXJuaW5ncygicmVzb3VyY2UiKQorCQlNZXNzYWdlV3JpdGVyIHN0ZGVyciA9IG5ldyBNZXNzYWdlV3JpdGVyKCk7CisJCXRyeSAoTWVzc2FnZVdyaXRlciBzdGRvdXQgPSBuZXcgTWVzc2FnZVdyaXRlcigpKSB7CisJCQlzZXNzaW9uID0gU3NoU2Vzc2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTZXNzaW9uKHNzaFVyaSwKKwkJCQkJcHJvdmlkZXIsIGZzLCAxMDAwICogdGltZW91dCk7CisJCQlwcm9jZXNzID0gc2Vzc2lvbi5leGVjKGNvbW1hbmQsIDApOworCQkJZXJyb3JUaHJlYWQgPSBuZXcgU3RyZWFtQ29weVRocmVhZChwcm9jZXNzLmdldEVycm9yU3RyZWFtKCksCisJCQkJCXN0ZGVyci5nZXRSYXdTdHJlYW0oKSk7CisJCQllcnJvclRocmVhZC5zdGFydCgpOworCQkJb3V0VGhyZWFkID0gbmV3IFN0cmVhbUNvcHlUaHJlYWQocHJvY2Vzcy5nZXRJbnB1dFN0cmVhbSgpLAorCQkJCQlzdGRvdXQuZ2V0UmF3U3RyZWFtKCkpOworCQkJb3V0VGhyZWFkLnN0YXJ0KCk7CisJCQl0cnkgeworCQkJCS8vIHdhaXRGb3Igd2l0aCB0aW1lb3V0IGhhcyBhIGJ1ZyAtIEpTY2gnIGV4aXRWYWx1ZSgpIHRocm93cyB0aGUKKwkJCQkvLyB3cm9uZyBleGNlcHRpb24gdHlwZSA6KAorCQkJCWlmIChwcm9jZXNzLndhaXRGb3IoKSA9PSAwKSB7CisJCQkJCXJldHVybiBzdGRvdXQudG9TdHJpbmcoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlyZXR1cm4gbnVsbDsgLy8gc3RpbGwgcnVubmluZyBhZnRlciB0aW1lb3V0CisJCQkJfQorCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgorCQkJfQorCQl9IGZpbmFsbHkgeworCQkJaWYgKGVycm9yVGhyZWFkICE9IG51bGwpIHsKKwkJCQl0cnkgeworCQkJCQllcnJvclRocmVhZC5oYWx0KCk7CisJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJCQkvLyBTdG9wIHdhaXRpbmcgYW5kIHJldHVybiBhbnl3YXkuCisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJZXJyb3JUaHJlYWQgPSBudWxsOworCQkJCX0KKwkJCX0KKwkJCWlmIChvdXRUaHJlYWQgIT0gbnVsbCkgeworCQkJCXRyeSB7CisJCQkJCW91dFRocmVhZC5oYWx0KCk7CisJCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworCQkJCQkvLyBTdG9wIHdhaXRpbmcgYW5kIHJldHVybiBhbnl3YXkuCisJCQkJfSBmaW5hbGx5IHsKKwkJCQkJb3V0VGhyZWFkID0gbnVsbDsKKwkJCQl9CisJCQl9CisJCQlpZiAocHJvY2VzcyAhPSBudWxsKSB7CisJCQkJaWYgKHByb2Nlc3MuZXhpdFZhbHVlKCkgIT0gMCkgeworCQkJCQlmYWlsdXJlID0gbmV3IENvbW1hbmRGYWlsZWRFeGNlcHRpb24ocHJvY2Vzcy5leGl0VmFsdWUoKSwKKwkJCQkJCQlNZXNzYWdlRm9ybWF0LmZvcm1hdCgKKwkJCQkJCQlKR2l0VGV4dC5nZXQoKS5zc2hDb21tYW5kRmFpbGVkLCBjb21tYW5kLAorCQkJCQkJCXN0ZGVyci50b1N0cmluZygpKSk7CisJCQkJfQorCQkJCXByb2Nlc3MuZGVzdHJveSgpOworCQkJfQorCQkJc3RkZXJyLmNsb3NlKCk7CisJCQlpZiAoc2Vzc2lvbiAhPSBudWxsKSB7CisJCQkJU3NoU2Vzc2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5yZWxlYXNlU2Vzc2lvbihzZXNzaW9uKTsKKwkJCX0KKwkJCWlmIChmYWlsdXJlICE9IG51bGwpIHsKKwkJCQl0aHJvdyBmYWlsdXJlOworCQkJfQorCQl9CisJfQorCit9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3RyaW5nVXRpbHMuamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TdHJpbmdVdGlscy5qYXZhCmluZGV4IGI0NzM2ZDMuLjM4NjhlNTYgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TdHJpbmdVdGlscy5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TdHJpbmdVdGlscy5qYXZhCkBAIC03NCw3ICs3NCw3IEBAIHB1YmxpYyBmaW5hbCBjbGFzcyBTdHJpbmdVdGlscyB7CiAJICogICAgICAgICAgICB0aGUgaW5wdXQgY2hhcmFjdGVyLgogCSAqIEByZXR1cm4gbG93ZXJjYXNlIHZlcnNpb24gb2YgdGhlIGlucHV0LgogCSAqLwotCXB1YmxpYyBzdGF0aWMgY2hhciB0b0xvd2VyQ2FzZShmaW5hbCBjaGFyIGMpIHsKKwlwdWJsaWMgc3RhdGljIGNoYXIgdG9Mb3dlckNhc2UoY2hhciBjKSB7CiAJCXJldHVybiBjIDw9ICdaJyA/IExDW2NdIDogYzsKIAl9CiAKQEAgLTkxLDcgKzkxLDcgQEAgcHVibGljIHN0YXRpYyBjaGFyIHRvTG93ZXJDYXNlKGZpbmFsIGNoYXIgYykgewogCSAqIEByZXR1cm4gYSBjb3B5IG9mIHRoZSBpbnB1dCBzdHJpbmcsIGFmdGVyIGNvbnZlcnRpbmcgY2hhcmFjdGVycyBpbiB0aGUKIAkgKiAgICAgICAgIHJhbmdlICdBJy4uJ1onIHRvICdhJy4uJ3onLgogCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvTG93ZXJDYXNlKGZpbmFsIFN0cmluZyBpbikgeworCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvTG93ZXJDYXNlKFN0cmluZyBpbikgewogCQlmaW5hbCBTdHJpbmdCdWlsZGVyIHIgPSBuZXcgU3RyaW5nQnVpbGRlcihpbi5sZW5ndGgoKSk7CiAJCWZvciAoaW50IGkgPSAwOyBpIDwgaW4ubGVuZ3RoKCk7IGkrKykKIAkJCXIuYXBwZW5kKHRvTG93ZXJDYXNlKGluLmNoYXJBdChpKSkpOwpAQCAtMTM4LDcgKzEzOCw3IEBAIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNhcGl0YWxpemUoU3RyaW5nIHN0cikgewogCSAqICAgICAgICAgICAgc2Vjb25kIHN0cmluZyB0byBjb21wYXJlLgogCSAqIEByZXR1cm4gdHJ1ZSBpZiBhIGVxdWFscyBiCiAJICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsc0lnbm9yZUNhc2UoZmluYWwgU3RyaW5nIGEsIGZpbmFsIFN0cmluZyBiKSB7CisJcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsc0lnbm9yZUNhc2UoU3RyaW5nIGEsIFN0cmluZyBiKSB7CiAJCWlmIChhID09IGIpCiAJCQlyZXR1cm4gdHJ1ZTsKIAkJaWYgKGEubGVuZ3RoKCkgIT0gYi5sZW5ndGgoKSkKQEAgLTIwNSw3ICsyMDUsNyBAQCBwdWJsaWMgc3RhdGljIGludCBjb21wYXJlV2l0aENhc2UoU3RyaW5nIGEsIFN0cmluZyBiKSB7CiAJICogICAgICAgICAgICAgaWYge0Bjb2RlIHZhbHVlfSBpcyBub3QgcmVjb2duaXplZCBhcyBvbmUgb2YgdGhlIHN0YW5kYXJkCiAJICogICAgICAgICAgICAgYm9vbGVhbiBuYW1lcy4KIAkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdG9Cb29sZWFuKGZpbmFsIFN0cmluZyBzdHJpbmdWYWx1ZSkgeworCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0b0Jvb2xlYW4oU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CiAJCWlmIChzdHJpbmdWYWx1ZSA9PSBudWxsKQogCQkJdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLmV4cGVjdGVkQm9vbGVhblN0cmluZ1ZhbHVlKTsKIApAQCAtMjMyLDcgKzIzMiw3IEBAIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB0b0Jvb2xlYW4oZmluYWwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB7CiAJICogQHJldHVybiB0aGUgYm9vbGVhbiBpbnRlcnByZXRhdGlvbiBvZiB7QGNvZGUgdmFsdWV9IG9yIG51bGwgaW4gY2FzZSB0aGUKIAkgKiAgICAgICAgIHN0cmluZyBkb2VzIG5vdCByZXByZXNlbnQgYSBib29sZWFuIHZhbHVlCiAJICovCi0JcHVibGljIHN0YXRpYyBCb29sZWFuIHRvQm9vbGVhbk9yTnVsbChmaW5hbCBTdHJpbmcgc3RyaW5nVmFsdWUpIHsKKwlwdWJsaWMgc3RhdGljIEJvb2xlYW4gdG9Cb29sZWFuT3JOdWxsKFN0cmluZyBzdHJpbmdWYWx1ZSkgewogCQlpZiAoc3RyaW5nVmFsdWUgPT0gbnVsbCkKIAkJCXJldHVybiBudWxsOwogCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3lzdGVtUmVhZGVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvU3lzdGVtUmVhZGVyLmphdmEKaW5kZXggOTZhNzk2Yy4uOTUzYzk3NiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1N5c3RlbVJlYWRlci5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9TeXN0ZW1SZWFkZXIuamF2YQpAQCAtMjM3LDcgKzIzNyw3IEBAIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldFBsYXRmb3JtQ2hlY2tlcigpIHsKIAlwdWJsaWMgYWJzdHJhY3QgRmlsZUJhc2VkQ29uZmlnIG9wZW5Vc2VyQ29uZmlnKENvbmZpZyBwYXJlbnQsIEZTIGZzKTsKIAogCS8qKgotCSAqIE9wZW4gdGhlIGdpdG9uZmlnIGNvbmZpZ3VyYXRpb24gZm91bmQgaW4gdGhlIHN5c3RlbS13aWRlICJldGMiIGRpcmVjdG9yeQorCSAqIE9wZW4gdGhlIGdpdGNvbmZpZyBjb25maWd1cmF0aW9uIGZvdW5kIGluIHRoZSBzeXN0ZW0td2lkZSAiZXRjIiBkaXJlY3RvcnkKIAkgKgogCSAqIEBwYXJhbSBwYXJlbnQKIAkgKiAgICAgICAgICAgIGEgY29uZmlnIHdpdGggdmFsdWVzIG5vdCBmb3VuZCBkaXJlY3RseSBpbiB0aGUgcmV0dXJuZWQKQEAgLTI0NSw3ICsyNDUsNyBAQCBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRQbGF0Zm9ybUNoZWNrZXIoKSB7CiAJICogQHBhcmFtIGZzCiAJICogICAgICAgICAgICB0aGUgZmlsZSBzeXN0ZW0gYWJzdHJhY3Rpb24gd2hpY2ggd2lsbCBiZSBuZWNlc3NhcnkgdG8gcGVyZm9ybQogCSAqICAgICAgICAgICAgY2VydGFpbiBmaWxlIHN5c3RlbSBvcGVyYXRpb25zLgotCSAqIEByZXR1cm4gdGhlIGdpdG9uZmlnIGNvbmZpZ3VyYXRpb24gZm91bmQgaW4gdGhlIHN5c3RlbS13aWRlICJldGMiCisJICogQHJldHVybiB0aGUgZ2l0Y29uZmlnIGNvbmZpZ3VyYXRpb24gZm91bmQgaW4gdGhlIHN5c3RlbS13aWRlICJldGMiCiAJICogICAgICAgICBkaXJlY3RvcnkKIAkgKi8KIAlwdWJsaWMgYWJzdHJhY3QgRmlsZUJhc2VkQ29uZmlnIG9wZW5TeXN0ZW1Db25maWcoQ29uZmlnIHBhcmVudCwgRlMgZnMpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlci5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL1RlbXBvcmFyeUJ1ZmZlci5qYXZhCmluZGV4IGRkOTMzYTAuLjNlZDdhZWIgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9UZW1wb3JhcnlCdWZmZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvVGVtcG9yYXJ5QnVmZmVyLmphdmEKQEAgLTkxLDcgKzkxLDcgQEAgcHVibGljIGFic3RyYWN0IGNsYXNzIFRlbXBvcmFyeUJ1ZmZlciBleHRlbmRzIE91dHB1dFN0cmVhbSB7CiAJICogICAgICAgICAgICBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byBzdG9yZSBpbiBtZW1vcnkgYmVmb3JlIGVudGVyaW5nIHRoZQogCSAqICAgICAgICAgICAgb3ZlcmZsb3cgb3V0cHV0IHBhdGg7IGFsc28gdXNlZCBhcyB0aGUgZXN0aW1hdGVkIHNpemUuCiAJICovCi0JcHJvdGVjdGVkIFRlbXBvcmFyeUJ1ZmZlcihmaW5hbCBpbnQgbGltaXQpIHsKKwlwcm90ZWN0ZWQgVGVtcG9yYXJ5QnVmZmVyKGludCBsaW1pdCkgewogCQl0aGlzKGxpbWl0LCBsaW1pdCk7CiAJfQogCkBAIC0xMDYsNyArMTA2LDcgQEAgcHJvdGVjdGVkIFRlbXBvcmFyeUJ1ZmZlcihmaW5hbCBpbnQgbGltaXQpIHsKIAkgKiAgICAgICAgICAgIG92ZXJmbG93IG91dHB1dCBwYXRoLgogCSAqIEBzaW5jZSA0LjAKIAkgKi8KLQlwcm90ZWN0ZWQgVGVtcG9yYXJ5QnVmZmVyKGZpbmFsIGludCBlc3RpbWF0ZWRTaXplLCBmaW5hbCBpbnQgbGltaXQpIHsKKwlwcm90ZWN0ZWQgVGVtcG9yYXJ5QnVmZmVyKGludCBlc3RpbWF0ZWRTaXplLCBpbnQgbGltaXQpIHsKIAkJaWYgKGVzdGltYXRlZFNpemUgPiBsaW1pdCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKIAkJdGhpcy5pbkNvcmVMaW1pdCA9IGxpbWl0OwpAQCAtMTE2LDcgKzExNiw3IEBAIHByb3RlY3RlZCBUZW1wb3JhcnlCdWZmZXIoZmluYWwgaW50IGVzdGltYXRlZFNpemUsIGZpbmFsIGludCBsaW1pdCkgewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKG92ZXJmbG93ICE9IG51bGwpIHsKIAkJCW92ZXJmbG93LndyaXRlKGIpOwogCQkJcmV0dXJuOwpAQCAtMTM3LDcgKzEzNyw3IEBAIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKG92ZXJmbG93ID09IG51bGwpIHsKIAkJCXdoaWxlIChsZW4gPiAwKSB7CiAJCQkJQmxvY2sgcyA9IGxhc3QoKTsKQEAgLTE4Myw3ICsxODMsNyBAQCBwcm90ZWN0ZWQgdm9pZCBkb0ZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkgKiAgICAgICAgICAgICBhbiBlcnJvciBvY2N1cnJlZCByZWFkaW5nIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgb3Igd2hpbGUKIAkgKiAgICAgICAgICAgICB3cml0aW5nIHRvIGEgbG9jYWwgdGVtcG9yYXJ5IGZpbGUuCiAJICovCi0JcHVibGljIHZvaWQgY29weShmaW5hbCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgdm9pZCBjb3B5KElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAoYmxvY2tzICE9IG51bGwpIHsKIAkJCWZvciAoOzspIHsKIAkJCQlCbG9jayBzID0gbGFzdCgpOwpAQCAtMjM4LDcgKzIzOCw3IEBAIHByaXZhdGUgbG9uZyBpbkNvcmVMZW5ndGgoKSB7CiAJCQl0aHJvdyBuZXcgT3V0T2ZNZW1vcnlFcnJvcihKR2l0VGV4dC5nZXQoKS5sZW5ndGhFeGNlZWRzTWF4aW11bUFycmF5U2l6ZSk7CiAJCWZpbmFsIGJ5dGVbXSBvdXQgPSBuZXcgYnl0ZVsoaW50KSBsZW5dOwogCQlpbnQgb3V0UHRyID0gMDsKLQkJZm9yIChmaW5hbCBCbG9jayBiIDogYmxvY2tzKSB7CisJCWZvciAoQmxvY2sgYiA6IGJsb2NrcykgewogCQkJU3lzdGVtLmFycmF5Y29weShiLmJ1ZmZlciwgMCwgb3V0LCBvdXRQdHIsIGIuY291bnQpOwogCQkJb3V0UHRyICs9IGIuY291bnQ7CiAJCX0KQEAgLTI2NSw3ICsyNjUsNyBAQCBwcml2YXRlIGxvbmcgaW5Db3JlTGVuZ3RoKCkgewogCQkJCQlKR2l0VGV4dC5nZXQoKS5sZW5ndGhFeGNlZWRzTWF4aW11bUFycmF5U2l6ZSk7CiAJCWZpbmFsIGJ5dGVbXSBvdXQgPSBuZXcgYnl0ZVsoaW50KSBsZW5dOwogCQlpbnQgb3V0UHRyID0gMDsKLQkJZm9yIChmaW5hbCBCbG9jayBiIDogYmxvY2tzKSB7CisJCWZvciAoQmxvY2sgYiA6IGJsb2NrcykgewogCQkJU3lzdGVtLmFycmF5Y29weShiLmJ1ZmZlciwgMCwgb3V0LCBvdXRQdHIsIGIuY291bnQpOwogCQkJb3V0UHRyICs9IGIuY291bnQ7CiAJCX0KQEAgLTI4OCwxMSArMjg4LDExIEBAIHByaXZhdGUgbG9uZyBpbkNvcmVMZW5ndGgoKSB7CiAJICogICAgICAgICAgICAgYW4gZXJyb3Igb2NjdXJyZWQgcmVhZGluZyBmcm9tIGEgdGVtcG9yYXJ5IGZpbGUgb24gdGhlIGxvY2FsCiAJICogICAgICAgICAgICAgc3lzdGVtLCBvciB3cml0aW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgogCSAqLwotCXB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgT3V0cHV0U3RyZWFtIG9zLCBQcm9ncmVzc01vbml0b3IgcG0pCisJcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3MsIFByb2dyZXNzTW9uaXRvciBwbSkKIAkJCXRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWlmIChwbSA9PSBudWxsKQogCQkJcG0gPSBOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFOwotCQlmb3IgKGZpbmFsIEJsb2NrIGIgOiBibG9ja3MpIHsKKwkJZm9yIChCbG9jayBiIDogYmxvY2tzKSB7CiAJCQlvcy53cml0ZShiLmJ1ZmZlciwgMCwgYi5jb3VudCk7CiAJCQlwbS51cGRhdGUoYi5jb3VudCAvIDEwMjQpOwogCQl9CkBAIC0zNzMsNyArMzczLDcgQEAgcHJpdmF0ZSB2b2lkIHN3aXRjaFRvT3ZlcmZsb3coKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlvdmVyZmxvdyA9IG92ZXJmbG93KCk7CiAKIAkJZmluYWwgQmxvY2sgbGFzdCA9IGJsb2Nrcy5yZW1vdmUoYmxvY2tzLnNpemUoKSAtIDEpOwotCQlmb3IgKGZpbmFsIEJsb2NrIGIgOiBibG9ja3MpCisJCWZvciAoQmxvY2sgYiA6IGJsb2NrcykKIAkJCW92ZXJmbG93LndyaXRlKGIuYnVmZmVyLCAwLCBiLmNvdW50KTsKIAkJYmxvY2tzID0gbnVsbDsKIApAQCAtNDQyLDcgKzQ0Miw3IEBAIHB1YmxpYyBzdGF0aWMgY2xhc3MgTG9jYWxGaWxlIGV4dGVuZHMgVGVtcG9yYXJ5QnVmZmVyIHsKIAkJICogICAgICAgICAgICBzeXN0ZW0gZGVmYXVsdCB0ZW1wb3JhcnkgZGlyZWN0b3J5IChmb3IgZXhhbXBsZSAvdG1wKSB3aWxsCiAJCSAqICAgICAgICAgICAgYmUgdXNlZCBpbnN0ZWFkLgogCQkgKi8KLQkJcHVibGljIExvY2FsRmlsZShmaW5hbCBGaWxlIGRpcmVjdG9yeSkgeworCQlwdWJsaWMgTG9jYWxGaWxlKEZpbGUgZGlyZWN0b3J5KSB7CiAJCQl0aGlzKGRpcmVjdG9yeSwgREVGQVVMVF9JTl9DT1JFX0xJTUlUKTsKIAkJfQogCkBAIC00NTgsNyArNDU4LDcgQEAgcHVibGljIExvY2FsRmlsZShmaW5hbCBGaWxlIGRpcmVjdG9yeSkgewogCQkgKiAgICAgICAgICAgIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRvIHN0b3JlIGluIG1lbW9yeS4gU3RvcmFnZSBiZXlvbmQKIAkJICogICAgICAgICAgICB0aGlzIGxpbWl0IHdpbGwgdXNlIHRoZSBsb2NhbCBmaWxlLgogCQkgKi8KLQkJcHVibGljIExvY2FsRmlsZShmaW5hbCBGaWxlIGRpcmVjdG9yeSwgZmluYWwgaW50IGluQ29yZUxpbWl0KSB7CisJCXB1YmxpYyBMb2NhbEZpbGUoRmlsZSBkaXJlY3RvcnksIGludCBpbkNvcmVMaW1pdCkgewogCQkJc3VwZXIoaW5Db3JlTGltaXQpOwogCQkJdGhpcy5kaXJlY3RvcnkgPSBkaXJlY3Rvcnk7CiAJCX0KQEAgLTQ4NywxNyArNDg3LDE0IEBAIHB1YmxpYyBsb25nIGxlbmd0aCgpIHsKIAkJCWlmIChJbnRlZ2VyLk1BWF9WQUxVRSA8IGxlbikKIAkJCQl0aHJvdyBuZXcgT3V0T2ZNZW1vcnlFcnJvcihKR2l0VGV4dC5nZXQoKS5sZW5ndGhFeGNlZWRzTWF4aW11bUFycmF5U2l6ZSk7CiAJCQlmaW5hbCBieXRlW10gb3V0ID0gbmV3IGJ5dGVbKGludCkgbGVuXTsKLQkJCWZpbmFsIEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ob25EaXNrRmlsZSk7Ci0JCQl0cnkgeworCQkJdHJ5IChGaWxlSW5wdXRTdHJlYW0gaW4gPSBuZXcgRmlsZUlucHV0U3RyZWFtKG9uRGlza0ZpbGUpKSB7CiAJCQkJSU8ucmVhZEZ1bGx5KGluLCBvdXQsIDAsIChpbnQpIGxlbik7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWluLmNsb3NlKCk7CiAJCQl9CiAJCQlyZXR1cm4gb3V0OwogCQl9CiAKIAkJQE92ZXJyaWRlCi0JCXB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgT3V0cHV0U3RyZWFtIG9zLCBQcm9ncmVzc01vbml0b3IgcG0pCisJCXB1YmxpYyB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG9zLCBQcm9ncmVzc01vbml0b3IgcG0pCiAJCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJCWlmIChvbkRpc2tGaWxlID09IG51bGwpIHsKIAkJCQlzdXBlci53cml0ZVRvKG9zLCBwbSk7CkBAIC01MDUsMTYgKzUwMiwxMyBAQCBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvcywgUHJvZ3Jlc3NNb25pdG9yIHBtKQogCQkJfQogCQkJaWYgKHBtID09IG51bGwpCiAJCQkJcG0gPSBOdWxsUHJvZ3Jlc3NNb25pdG9yLklOU1RBTkNFOwotCQkJZmluYWwgRmlsZUlucHV0U3RyZWFtIGluID0gbmV3IEZpbGVJbnB1dFN0cmVhbShvbkRpc2tGaWxlKTsKLQkJCXRyeSB7CisJCQl0cnkgKEZpbGVJbnB1dFN0cmVhbSBpbiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ob25EaXNrRmlsZSkpIHsKIAkJCQlpbnQgY250OwogCQkJCWZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtCbG9jay5TWl07CiAJCQkJd2hpbGUgKChjbnQgPSBpbi5yZWFkKGJ1ZikpID49IDApIHsKIAkJCQkJb3Mud3JpdGUoYnVmLCAwLCBjbnQpOwogCQkJCQlwbS51cGRhdGUoY250IC8gMTAyNCk7CiAJCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpbi5jbG9zZSgpOwogCQkJfQogCQl9CiAKQEAgLTU2OSw3ICs1NjMsNyBAQCBwdWJsaWMgc3RhdGljIGNsYXNzIEhlYXAgZXh0ZW5kcyBUZW1wb3JhcnlCdWZmZXIgewogCQkgKiAgICAgICAgICAgIGFsc28gdXNlZCBhcyB0aGUgZXN0aW1hdGVkIHNpemUuIFN0b3JpbmcgYmV5b25kIHRoaXMgbWFueQogCQkgKiAgICAgICAgICAgIHdpbGwgY2F1c2UgYW4gSU9FeGNlcHRpb24gdG8gYmUgdGhyb3duIGR1cmluZyB3cml0ZS4KIAkJICovCi0JCXB1YmxpYyBIZWFwKGZpbmFsIGludCBsaW1pdCkgeworCQlwdWJsaWMgSGVhcChpbnQgbGltaXQpIHsKIAkJCXN1cGVyKGxpbWl0KTsKIAkJfQogCkBAIC01ODUsNyArNTc5LDcgQEAgcHVibGljIEhlYXAoZmluYWwgaW50IGxpbWl0KSB7CiAJCSAqICAgICAgICAgICAgdGhyb3duIGR1cmluZyB3cml0ZS4KIAkJICogQHNpbmNlIDQuMAogCQkgKi8KLQkJcHVibGljIEhlYXAoZmluYWwgaW50IGVzdGltYXRlZFNpemUsIGZpbmFsIGludCBsaW1pdCkgeworCQlwdWJsaWMgSGVhcChpbnQgZXN0aW1hdGVkU2l6ZSwgaW50IGxpbWl0KSB7CiAJCQlzdXBlcihlc3RpbWF0ZWRTaXplLCBsaW1pdCk7CiAJCX0KIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvQ1JMRklucHV0U3RyZWFtLmphdmEKaW5kZXggNDU2NjgyNS4uMDgzNzdlNiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZJbnB1dFN0cmVhbS5qYXZhCkBAIC0xMDAsNyArMTAwLDcgQEAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCByZWFkKGJ5dGVbXSBicywgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJzLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCQlpZiAobGVuID09IDApCiAJCQlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9DUkxGT3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZPdXRwdXRTdHJlYW0uamF2YQppbmRleCBlNzY0Mzg5Li5kOGNmZWU3IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZPdXRwdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0NSTEZPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTEzLDcgKzExMyw3IEBAIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgZmluYWwgaW50IHN0YXJ0T2ZmLCBmaW5hbCBpbnQgc3RhcnRMZW4pCisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBzdGFydE9mZiwgaW50IHN0YXJ0TGVuKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IG92ZXJmbG93ID0gYnVmZmVyKGIsIHN0YXJ0T2ZmLCBzdGFydExlbik7CiAJCWlmIChvdmVyZmxvdyA8IDApCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDA2ZjgzZjMuLmZmMjgxNjEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZJbnB1dFN0cmVhbS5qYXZhCkBAIC0xMzQsNyArMTM0LDcgQEAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGludCByZWFkKGJ5dGVbXSBicywgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbikKKwlwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJzLCBpbnQgb2ZmLCBpbnQgbGVuKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJaWYgKGxlbiA9PSAwKQogCQkJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGT3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vQXV0b0xGT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggMzIyMjZjNC4uOTA4ZDBhMCAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0F1dG9MRk91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9BdXRvTEZPdXRwdXRTdHJlYW0uamF2YQpAQCAtMTIwLDcgKzEyMCw3IEBAIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24gewogCiAJLyoqIHtAaW5oZXJpdERvY30gKi8KIAlAT3ZlcnJpZGUKLQlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgZmluYWwgaW50IHN0YXJ0T2ZmLCBmaW5hbCBpbnQgc3RhcnRMZW4pCisJcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBzdGFydE9mZiwgaW50IHN0YXJ0TGVuKQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJZmluYWwgaW50IG92ZXJmbG93ID0gYnVmZmVyKGIsIHN0YXJ0T2ZmLCBzdGFydExlbik7CiAJCWlmIChvdmVyZmxvdyA8IDApIHsKZGlmZiAtLWdpdCBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9Fb2xDYW5vbmljYWxpemluZ0lucHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vRW9sQ2Fub25pY2FsaXppbmdJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDlhOTUzLi4wMDAwMDAwCi0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9Fb2xDYW5vbmljYWxpemluZ0lucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCwgMjAxMyBNYXJjIFN0cmFwZXR6IDxtYXJjLnN0cmFwZXR6QHN5bnRldm8uY29tPgotICogYW5kIG90aGVyIGNvcHlyaWdodCBvd25lcnMgYXMgZG9jdW1lbnRlZCBpbiB0aGUgcHJvamVjdCdzIElQIGxvZy4KLSAqCi0gKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZQotICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYxLjAgd2hpY2gKLSAqIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBpcyByZXByb2R1Y2VkIGJlbG93LCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAKLSAqCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3IKLSAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZwotICogY29uZGl0aW9ucyBhcmUgbWV0OgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIC0gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogICBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZwotICogICBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQKLSAqICAgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotICoKLSAqIC0gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCBJbmMuIG5vciB0aGUKLSAqICAgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKLSAqICAgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvcgotICogICB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5ECi0gKiBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLAotICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKLSAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SCi0gKiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVAotICogTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7Ci0gKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSCi0gKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULAotICogU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQotICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKLSAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKioKLSAqIEFuIGlucHV0IHN0cmVhbSB3aGljaCBjYW5vbmljYWxpemVzIEVPTHMgYnl0ZXMgb24gdGhlIGZseSB0byAnXG4nLgotICoKLSAqIE9wdGlvbmFsbHksIGEgYmluYXJ5IGNoZWNrIG9uIHRoZSBmaXJzdCA4MDAwIGJ5dGVzIGlzIHBlcmZvcm1lZCBhbmQgaW4gY2FzZQotICogb2YgYmluYXJ5IGZpbGVzLCBjYW5vbmljYWxpemF0aW9uIGlzIHR1cm5lZCBvZmYgKGZvciB0aGUgY29tcGxldGUgZmlsZSkuCi0gKgotICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayBvcmcuZWNsaXBzZS5qZ2l0LnV0aWwuaW8uQXV0b0xGSW5wdXRTdHJlYW19IGluc3RlYWQKLSAqLwotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBFb2xDYW5vbmljYWxpemluZ0lucHV0U3RyZWFtIGV4dGVuZHMgQXV0b0xGSW5wdXRTdHJlYW0gewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBJbnB1dFN0cmVhbSwgd3JhcHBpbmcgdGhlIHNwZWNpZmllZCBzdHJlYW0KLQkgKgotCSAqIEBwYXJhbSBpbgotCSAqICAgICAgICAgICAgcmF3IGlucHV0IHN0cmVhbQotCSAqIEBwYXJhbSBkZXRlY3RCaW5hcnkKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgYmluYXJpZXMgc2hvdWxkIGJlIGRldGVjdGVkCi0JICovCi0JcHVibGljIEVvbENhbm9uaWNhbGl6aW5nSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGJvb2xlYW4gZGV0ZWN0QmluYXJ5KSB7Ci0JCXN1cGVyKGluLCBkZXRlY3RCaW5hcnkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgSW5wdXRTdHJlYW0sIHdyYXBwaW5nIHRoZSBzcGVjaWZpZWQgc3RyZWFtCi0JICoKLQkgKiBAcGFyYW0gaW4KLQkgKiAgICAgICAgICAgIHJhdyBpbnB1dCBzdHJlYW0KLQkgKiBAcGFyYW0gZGV0ZWN0QmluYXJ5Ci0JICogICAgICAgICAgICB3aGV0aGVyIGJpbmFyaWVzIHNob3VsZCBiZSBkZXRlY3RlZAotCSAqIEBwYXJhbSBhYm9ydElmQmluYXJ5Ci0JICogICAgICAgICAgICB0aHJvdyBhbiBJT0V4Y2VwdGlvbiBpZiB0aGUgZmlsZSBpcyBiaW5hcnkKLQkgKi8KLQlwdWJsaWMgRW9sQ2Fub25pY2FsaXppbmdJbnB1dFN0cmVhbShJbnB1dFN0cmVhbSBpbiwgYm9vbGVhbiBkZXRlY3RCaW5hcnksCi0JCQlib29sZWFuIGFib3J0SWZCaW5hcnkpIHsKLQkJc3VwZXIoaW4sIGRldGVjdEJpbmFyeSwgYWJvcnRJZkJpbmFyeSk7Ci0JfQotCi0JLyoqCi0JICogQSBzcGVjaWFsIGV4Y2VwdGlvbiB0aHJvd24gd2hlbiB7QGxpbmsgQXV0b0xGSW5wdXRTdHJlYW19IGlzIHRvbGQgdG8KLQkgKiB0aHJvdyBhbiBleGNlcHRpb24gd2hlbiBhdHRlbXB0aW5nIHRvIHJlYWQgYSBiaW5hcnkgZmlsZS4gVGhlIGV4Y2VwdGlvbgotCSAqIG1heSBiZSB0aHJvd24gYXQgYW55IHN0YWdlIGR1cmluZyByZWFkaW5nLgotCSAqCi0JICogQHNpbmNlIDMuMwotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgSXNCaW5hcnlFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCUlzQmluYXJ5RXhjZXB0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL0ludGVycnVwdFRpbWVyLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSW50ZXJydXB0VGltZXIuamF2YQppbmRleCBmNDAwZTUwLi5iN2ZlZGRkIDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSW50ZXJydXB0VGltZXIuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSW50ZXJydXB0VGltZXIuamF2YQpAQCAtMTAzLDcgKzEwMyw3IEBAIHB1YmxpYyBJbnRlcnJ1cHRUaW1lcigpIHsKIAkgKiBAcGFyYW0gdGhyZWFkTmFtZQogCSAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgdGltZXIgdGhyZWFkLgogCSAqLwotCXB1YmxpYyBJbnRlcnJ1cHRUaW1lcihmaW5hbCBTdHJpbmcgdGhyZWFkTmFtZSkgeworCXB1YmxpYyBJbnRlcnJ1cHRUaW1lcihTdHJpbmcgdGhyZWFkTmFtZSkgewogCQlzdGF0ZSA9IG5ldyBBbGFybVN0YXRlKCk7CiAJCWF1dG9LaWxsZXIgPSBuZXcgQXV0b0tpbGxlcihzdGF0ZSk7CiAJCXRocmVhZCA9IG5ldyBBbGFybVRocmVhZCh0aHJlYWROYW1lLCBzdGF0ZSk7CkBAIC0xMTcsNyArMTE3LDcgQEAgcHVibGljIEludGVycnVwdFRpbWVyKGZpbmFsIFN0cmluZyB0aHJlYWROYW1lKSB7CiAJICogICAgICAgICAgICBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGJlZm9yZSB0aGUgaW50ZXJydXB0IHNob3VsZCB0cmlnZ2VyLgogCSAqICAgICAgICAgICAgTXVzdCBiZSAmZ3Q7IDAuCiAJICovCi0JcHVibGljIHZvaWQgYmVnaW4oZmluYWwgaW50IHRpbWVvdXQpIHsKKwlwdWJsaWMgdm9pZCBiZWdpbihpbnQgdGltZW91dCkgewogCQlpZiAodGltZW91dCA8PSAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkuaW52YWxpZFRpbWVvdXQsIEludGVnZXIudmFsdWVPZih0aW1lb3V0KSkpOwpAQCAtMTQ1LDcgKzE0NSw3IEBAIHB1YmxpYyB2b2lkIHRlcm1pbmF0ZSgpIHsKIAl9CiAKIAlzdGF0aWMgZmluYWwgY2xhc3MgQWxhcm1UaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewotCQlBbGFybVRocmVhZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgQWxhcm1TdGF0ZSBxKSB7CisJCUFsYXJtVGhyZWFkKFN0cmluZyBuYW1lLCBBbGFybVN0YXRlIHEpIHsKIAkJCXN1cGVyKHEpOwogCQkJc2V0TmFtZShuYW1lKTsKIAkJCXNldERhZW1vbih0cnVlKTsKQEAgLTE2MSw3ICsxNjEsNyBAQCBzdGF0aWMgZmluYWwgY2xhc3MgQWxhcm1UaHJlYWQgZXh0ZW5kcyBUaHJlYWQgewogCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEF1dG9LaWxsZXIgewogCQlwcml2YXRlIGZpbmFsIEFsYXJtU3RhdGUgc3RhdGU7CiAKLQkJQXV0b0tpbGxlcihmaW5hbCBBbGFybVN0YXRlIHMpIHsKKwkJQXV0b0tpbGxlcihBbGFybVN0YXRlIHMpIHsKIAkJCXN0YXRlID0gczsKIAkJfQogCkBAIC0yMDMsNyArMjAzLDcgQEAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJ1bigpIHsKIAkJCX0KIAkJfQogCi0JCXN5bmNocm9uaXplZCB2b2lkIGJlZ2luKGZpbmFsIGludCB0aW1lb3V0KSB7CisJCXN5bmNocm9uaXplZCB2b2lkIGJlZ2luKGludCB0aW1lb3V0KSB7CiAJCQlpZiAodGVybWluYXRlZCkKIAkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEpHaXRUZXh0LmdldCgpLnRpbWVyQWxyZWFkeVRlcm1pbmF0ZWQpOwogCQkJY2FsbGluZ1RocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vSXNvbGF0ZWRPdXRwdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9Jc29sYXRlZE91dHB1dFN0cmVhbS5qYXZhCmluZGV4IDVlNTA5OTUuLjY1NDcwZDQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9Jc29sYXRlZE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9Jc29sYXRlZE91dHB1dFN0cmVhbS5qYXZhCkBAIC05OSw3ICs5OSw3IEBAIHB1YmxpYyB2b2lkIHdyaXRlKGludCBjaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IHBvcywgZmluYWwgaW50IGNudCkKKwlwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYnVmLCBpbnQgcG9zLCBpbnQgY250KQogCQkJdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJY2hlY2tDbG9zZWQoKTsKIAkJZXhlY3V0ZShuZXcgQ2FsbGFibGU8Vm9pZD4oKSB7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU2FmZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtLmphdmEgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU2lsZW50RmlsZUlucHV0U3RyZWFtLmphdmEKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1NhZmVCdWZmZXJlZE91dHB1dFN0cmVhbS5qYXZhCnJlbmFtZSB0byBvcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU2lsZW50RmlsZUlucHV0U3RyZWFtLmphdmEKaW5kZXggNjhiNDE3ZS4uZTU4ODAzYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1NhZmVCdWZmZXJlZE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9TaWxlbnRGaWxlSW5wdXRTdHJlYW0uamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEsIFJvYmluIFJvc2VuYmVyZworICogQ29weXJpZ2h0IChDKSAyMDE4LCBEYXZpZCBQdXJzZWhvdXNlIDxkYXZpZC5wdXJzZWhvdXNlQGdtYWlsLmNvbT4KICAqIGFuZCBvdGhlciBjb3B5cmlnaHQgb3duZXJzIGFzIGRvY3VtZW50ZWQgaW4gdGhlIHByb2plY3QncyBJUCBsb2cuCiAgKgogICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUKQEAgLTQwLDM5ICs0MCwzNiBAQAogICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKICAqIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICovCisKIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamdpdC51dGlsLmlvOwogCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIAogLyoqCi0gKiA8cD5TYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0gY2xhc3MuPC9wPgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgRmlsZUlucHV0U3RyZWFtIHRoYXQgaWdub3JlcyBhbnkgZXhjZXB0aW9ucyBvbiBjbG9zZSgpLgogICoKLSAqIEBkZXByZWNhdGVkIHVzZSBCdWZmZXJlZE91dHB1dFN0cmVhbSBpbiBKYXZhIDggYW5kIGxhdGVyLgorICogQHNpbmNlIDUuMAogICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIFNhZmVCdWZmZXJlZE91dHB1dFN0cmVhbSBleHRlbmRzIEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIHsKK3B1YmxpYyBjbGFzcyBTaWxlbnRGaWxlSW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWxlSW5wdXRTdHJlYW0gewogCS8qKgotCSAqIDxwPkNvbnN0cnVjdG9yIGZvciBTYWZlQnVmZmVyZWRPdXRwdXRTdHJlYW0uPC9wPgotCSAqCi0JICogQHNlZSBCdWZmZXJlZE91dHB1dFN0cmVhbSNCdWZmZXJlZE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0pCi0JICogQHBhcmFtIG91dAotCSAqICAgICAgICAgICAgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtCisJICogQHBhcmFtIGZpbGUKKwkgKiAgICAgICAgICAgIHRoZSBmaWxlCisJICogQHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24KKwkgKiAgICAgICAgICAgICB0aGUgZmlsZSB3YXMgbm90IGZvdW5kCiAJICovCi0JcHVibGljIFNhZmVCdWZmZXJlZE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0KSB7Ci0JCXN1cGVyKG91dCk7CisJcHVibGljIFNpbGVudEZpbGVJbnB1dFN0cmVhbShGaWxlIGZpbGUpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24geworCQlzdXBlcihmaWxlKTsKIAl9CiAKLQkvKioKLQkgKiA8cD5Db25zdHJ1Y3RvciBmb3IgU2FmZUJ1ZmZlcmVkT3V0cHV0U3RyZWFtLjwvcD4KLQkgKgotCSAqIEBzZWUgQnVmZmVyZWRPdXRwdXRTdHJlYW0jQnVmZmVyZWRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtLCBpbnQpCi0JICogQHBhcmFtIG91dAotCSAqICAgICAgICAgICAgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtCi0JICogQHBhcmFtIHNpemUKLQkgKiAgICAgICAgICAgIGJ1ZmZlciBzaXplCi0JICovCi0JcHVibGljIFNhZmVCdWZmZXJlZE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0LCBpbnQgc2l6ZSkgewotCQlzdXBlcihvdXQsIHNpemUpOworCUBPdmVycmlkZQorCXB1YmxpYyB2b2lkIGNsb3NlKCkgeworCQl0cnkgeworCQkJc3VwZXIuY2xvc2UoKTsKKwkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworCQkJLy8gSWdub3JlCisJCX0KIAl9CiB9CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU3RyZWFtQ29weVRocmVhZC5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1N0cmVhbUNvcHlUaHJlYWQuamF2YQppbmRleCA1YzFhZjllZi4uYTk5ODlhMSAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1N0cmVhbUNvcHlUaHJlYWQuamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vU3RyZWFtQ29weVRocmVhZC5qYXZhCkBAIC03Myw3ICs3Myw3IEBAIHB1YmxpYyBjbGFzcyBTdHJlYW1Db3B5VGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKIAkgKiAgICAgICAgICAgIHN0cmVhbSB0byBjb3B5IGludG8uIFRoZSBkZXN0aW5hdGlvbiBzdHJlYW0gaXMgYXV0b21hdGljYWxseQogCSAqICAgICAgICAgICAgY2xvc2VkIHdoZW4gdGhlIHRocmVhZCB0ZXJtaW5hdGVzLgogCSAqLwotCXB1YmxpYyBTdHJlYW1Db3B5VGhyZWFkKGZpbmFsIElucHV0U3RyZWFtIGksIGZpbmFsIE91dHB1dFN0cmVhbSBvKSB7CisJcHVibGljIFN0cmVhbUNvcHlUaHJlYWQoSW5wdXRTdHJlYW0gaSwgT3V0cHV0U3RyZWFtIG8pIHsKIAkJc2V0TmFtZShUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArICItU3RyZWFtQ29weSIpOyAvLyROT04tTkxTLTEkCiAJCXNyYyA9IGk7CiAJCWRzdCA9IG87CkBAIC04MSwyMCArODEsNiBAQCBwdWJsaWMgU3RyZWFtQ29weVRocmVhZChmaW5hbCBJbnB1dFN0cmVhbSBpLCBmaW5hbCBPdXRwdXRTdHJlYW0gbykgewogCX0KIAogCS8qKgotCSAqIFJlcXVlc3QgdGhlIHRocmVhZCB0byBmbHVzaCB0aGUgb3V0cHV0IHN0cmVhbSBhcyBzb29uIGFzIHBvc3NpYmxlLgotCSAqIDxwPgotCSAqIFRoaXMgaXMgYW4gYXN5bmNocm9ub3VzIHJlcXVlc3QgdG8gdGhlIHRocmVhZC4gVGhlIGFjdHVhbCBmbHVzaCB3aWxsCi0JICogaGFwcGVuIGF0IHNvbWUgZnV0dXJlIHBvaW50IGluIHRpbWUsIHdoZW4gdGhlIHRocmVhZCB3YWtlcyB1cCB0byBwcm9jZXNzCi0JICogdGhlIHJlcXVlc3QuCi0JICovCi0JQERlcHJlY2F0ZWQKLQlwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLQkJc3luY2hyb25pemVkICh3cml0ZUxvY2spIHsKLQkJCWludGVycnVwdCgpOwotCQl9Ci0JfQotCi0JLyoqCiAJICogUmVxdWVzdCB0aGF0IHRoZSB0aHJlYWQgdGVybWluYXRlLCBhbmQgd2FpdCBmb3IgaXQuCiAJICogPHA+CiAJICogVGhpcyBtZXRob2Qgc2lnbmFscyB0byB0aGUgY29weSB0aHJlYWQgdGhhdCBpdCBzaG91bGQgc3RvcCBhcyBzb29uIGFzCmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGVlSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UZWVJbnB1dFN0cmVhbS5qYXZhCmluZGV4IGRlZTRmZTkuLmU0MGE1YTQgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UZWVJbnB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UZWVJbnB1dFN0cmVhbS5qYXZhCkBAIC04OSw3ICs4OSw3IEBAIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAKIAkvKioge0Bpbmhlcml0RG9jfSAqLwogCUBPdmVycmlkZQotCXB1YmxpYyBsb25nIHNraXAoZmluYWwgbG9uZyBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKwlwdWJsaWMgbG9uZyBza2lwKGxvbmcgY291bnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJCWxvbmcgc2tpcHBlZCA9IDA7CiAJCWxvbmcgY250ID0gY291bnQ7CiAJCWZpbmFsIGJ5dGVbXSBiID0gc2tpcEJ1ZmZlcigpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RpbWVvdXRJbnB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RpbWVvdXRJbnB1dFN0cmVhbS5qYXZhCmluZGV4IDAxYjI1MTkuLjIzOTJiOGEgMTAwNjQ0Ci0tLSBhL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UaW1lb3V0SW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGltZW91dElucHV0U3RyZWFtLmphdmEKQEAgLTg5LDcgKzg5LDcgQEAgcHVibGljIGludCBnZXRUaW1lb3V0KCkgewogCSAqIEBwYXJhbSBtaWxsaXMKIAkgKiAgICAgICAgICAgIG51bWJlciBvZiBtaWxsaXNlY29uZHMgYmVmb3JlIGFib3J0aW5nIGEgcmVhZC4gTXVzdCBiZSAmZ3Q7IDAuCiAJICovCi0JcHVibGljIHZvaWQgc2V0VGltZW91dChmaW5hbCBpbnQgbWlsbGlzKSB7CisJcHVibGljIHZvaWQgc2V0VGltZW91dChpbnQgbWlsbGlzKSB7CiAJCWlmIChtaWxsaXMgPCAwKQogCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNZXNzYWdlRm9ybWF0LmZvcm1hdCgKIAkJCQkJSkdpdFRleHQuZ2V0KCkuaW52YWxpZFRpbWVvdXQsIEludGVnZXIudmFsdWVPZihtaWxsaXMpKSk7CmRpZmYgLS1naXQgYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGltZW91dE91dHB1dFN0cmVhbS5qYXZhIGIvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1RpbWVvdXRPdXRwdXRTdHJlYW0uamF2YQppbmRleCBlYTQwMTMzLi4yN2YxODc0IDEwMDY0NAotLS0gYS9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVGltZW91dE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9UaW1lb3V0T3V0cHV0U3RyZWFtLmphdmEKQEAgLTkxLDcgKzkxLDcgQEAgcHVibGljIGludCBnZXRUaW1lb3V0KCkgewogCSAqICAgICAgICAgICAgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBiZWZvcmUgYWJvcnRpbmcgYSB3cml0ZS4gTXVzdCBiZSAmZ3Q7CiAJICogICAgICAgICAgICAwLgogCSAqLwotCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoZmluYWwgaW50IG1pbGxpcykgeworCXB1YmxpYyB2b2lkIHNldFRpbWVvdXQoaW50IG1pbGxpcykgewogCQlpZiAobWlsbGlzIDwgMCkKIAkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTWVzc2FnZUZvcm1hdC5mb3JtYXQoCiAJCQkJCUpHaXRUZXh0LmdldCgpLmludmFsaWRUaW1lb3V0LCBJbnRlZ2VyLnZhbHVlT2YobWlsbGlzKSkpOwpkaWZmIC0tZ2l0IGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1VuaW9uSW5wdXRTdHJlYW0uamF2YSBiL29yZy5lY2xpcHNlLmpnaXQvc3JjL29yZy9lY2xpcHNlL2pnaXQvdXRpbC9pby9VbmlvbklucHV0U3RyZWFtLmphdmEKaW5kZXggNTFkMzEwNi4uZTE0ZWIyYiAxMDA2NDQKLS0tIGEvb3JnLmVjbGlwc2UuamdpdC9zcmMvb3JnL2VjbGlwc2UvamdpdC91dGlsL2lvL1VuaW9uSW5wdXRTdHJlYW0uamF2YQorKysgYi9vcmcuZWNsaXBzZS5qZ2l0L3NyYy9vcmcvZWNsaXBzZS9qZ2l0L3V0aWwvaW8vVW5pb25JbnB1dFN0cmVhbS5qYXZhCkBAIC0xMDcsNyArMTA3LDcgQEAgcHJpdmF0ZSB2b2lkIHBvcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAJICogQHBhcmFtIGluCiAJICogICAgICAgICAgICB0aGUgc3RyZWFtIHRvIGFkZDsgbXVzdCBub3QgYmUgbnVsbC4KIAkgKi8KLQlwdWJsaWMgdm9pZCBhZGQoZmluYWwgSW5wdXRTdHJlYW0gaW4pIHsKKwlwdWJsaWMgdm9pZCBhZGQoSW5wdXRTdHJlYW0gaW4pIHsKIAkJc3RyZWFtcy5hZGQoaW4pOwogCX0KIApAQCAtMTY0LDcgKzE2NCw3IEBAIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAogCS8qKiB7QGluaGVyaXREb2N9ICovCiAJQE92ZXJyaWRlCi0JcHVibGljIGxvbmcgc2tpcChmaW5hbCBsb25nIGNvdW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworCXB1YmxpYyBsb25nIHNraXAobG9uZyBjb3VudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAkJbG9uZyBza2lwcGVkID0gMDsKIAkJbG9uZyBjbnQgPSBjb3VudDsKIAkJd2hpbGUgKDAgPCBjbnQpIHsKZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCmluZGV4IDE2MmI2ZDguLjMzNDc4NDcgMTAwNjQ0Ci0tLSBhL3BvbS54bWwKKysrIGIvcG9tLnhtbApAQCAtNTEsNyArNTEsNyBAQAogICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZ2l0PC9ncm91cElkPgogICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5qZ2l0LXBhcmVudDwvYXJ0aWZhY3RJZD4KICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+NC4xMS44LVNOQVBTSE9UPC92ZXJzaW9uPgorICA8dmVyc2lvbj41LjAuNC1TTkFQU0hPVDwvdmVyc2lvbj4KIAogICA8bmFtZT5KR2l0IC0gUGFyZW50PC9uYW1lPgogICA8dXJsPiR7amdpdC11cmx9PC91cmw+CkBAIC0yMTMsNyArMjEzLDcgQEAKICAgICA8aHR0cGNvcmUtdmVyc2lvbj40LjQuNjwvaHR0cGNvcmUtdmVyc2lvbj4KICAgICA8c2xmNGotdmVyc2lvbj4xLjcuMjwvc2xmNGotdmVyc2lvbj4KICAgICA8bG9nNGotdmVyc2lvbj4xLjIuMTU8L2xvZzRqLXZlcnNpb24+Ci0gICAgPG1hdmVuLWphdmFkb2MtcGx1Z2luLXZlcnNpb24+My4wLjA8L21hdmVuLWphdmFkb2MtcGx1Z2luLXZlcnNpb24+CisgICAgPG1hdmVuLWphdmFkb2MtcGx1Z2luLXZlcnNpb24+My4wLjE8L21hdmVuLWphdmFkb2MtcGx1Z2luLXZlcnNpb24+CiAgICAgPHR5Y2hvLWV4dHJhcy12ZXJzaW9uPjEuMS4wPC90eWNoby1leHRyYXMtdmVyc2lvbj4KICAgICA8Z3Nvbi12ZXJzaW9uPjIuOC4yPC9nc29uLXZlcnNpb24+CiAgICAgPHNwb3RidWdzLW1hdmVuLXBsdWdpbi12ZXJzaW9uPjMuMS4yPC9zcG90YnVncy1tYXZlbi1wbHVnaW4tdmVyc2lvbj4KQEAgLTI2Nyw2MyArMjY3LDYgQEAKICAgICAgICAgPC9wbHVnaW4+CiAKICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+My43LjA8L3ZlcnNpb24+Ci0gICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8ZW5jb2Rpbmc+VVRGLTg8L2VuY29kaW5nPgotICAgICAgICAgICAgPHNvdXJjZT4xLjg8L3NvdXJjZT4KLSAgICAgICAgICAgIDx0YXJnZXQ+MS44PC90YXJnZXQ+Ci0gICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgPGlkPmRlZmF1bHQtY29tcGlsZTwvaWQ+Ci0gICAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KLSAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgIDxnb2FsPmNvbXBpbGU8L2dvYWw+Ci0gICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0luc2VjdXJlQ2lwaGVyRmFjdG9yeS5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgPGlkPmNvbXBpbGUtd2l0aC1lcnJvcnByb25lPC9pZD4KLSAgICAgICAgICAgICAgPHBoYXNlPmNvbXBpbGU8L3BoYXNlPgotICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgPGdvYWw+Y29tcGlsZTwvZ29hbD4KLSAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPGNvbXBpbGVySWQ+amF2YWMtd2l0aC1lcnJvcnByb25lPC9jb21waWxlcklkPgotICAgICAgICAgICAgICAgIDxmb3JjZUphdmFjQ29tcGlsZXJVc2U+dHJ1ZTwvZm9yY2VKYXZhY0NvbXBpbGVyVXNlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy9lY2xpcHNlL2pnaXQvdHJhbnNwb3J0L0luc2VjdXJlQ2lwaGVyRmFjdG9yeS5qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1qYXZhYzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgPHZlcnNpb24+Mi44LjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBpbGVyLWphdmFjLWVycm9ycHJvbmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDx2ZXJzaW9uPjIuOC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPCEtLSBvdmVycmlkZSBwbGV4dXMtY29tcGlsZXItamF2YWMtZXJyb3Jwcm9uZSdzIGRlcGVuZGVuY3kgb24KLSAgICAgICAgICAgICAgICAgRXJyb3IgUHJvbmUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gLS0+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5lcnJvcnByb25lPC9ncm91cElkPgotICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lcnJvcl9wcm9uZV9jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICA8dmVyc2lvbj4yLjIuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jbGVhbi1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgICAgPHZlcnNpb24+My4wLjA8L3ZlcnNpb24+CiAgICAgICAgIDwvcGx1Z2luPgpAQCAtMzQzLDcgKzI4Niw3IEBACiAgICAgICAgIDxwbHVnaW4+CiAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjMuMC4yPC92ZXJzaW9uPgorICAgICAgICAgIDx2ZXJzaW9uPjMuMS4xPC92ZXJzaW9uPgogICAgICAgICA8L3BsdWdpbj4KIAogICAgICAgICA8cGx1Z2luPgpAQCAtNTQxLDcgKzQ4NCw2IEBACiAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgPGV4ZWN1dGlvbnM+CiAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgogICAgICAgICAgICAgPGdvYWxzPgogICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+CiAgICAgICAgICAgICA8L2dvYWxzPgpAQCAtNTk2LDYgKzUzOCwyMyBAQAogICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICA8dmVyc2lvbj4ke21hdmVuLWphdmFkb2MtcGx1Z2luLXZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8cmVwb3J0U2V0cz4KKyAgICAgICAgICA8cmVwb3J0U2V0PgorICAgICAgICAgICAgPHJlcG9ydHM+CisgICAgICAgICAgICAgIDxyZXBvcnQ+amF2YWRvYzwvcmVwb3J0PgorICAgICAgICAgICAgPC9yZXBvcnRzPgorICAgICAgICAgIDwvcmVwb3J0U2V0PgorICAgICAgICAgIDxyZXBvcnRTZXQ+CisgICAgICAgICAgICA8aWQ+YWdncmVnYXRlPC9pZD4KKyAgICAgICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDxyZXBvcnRzPgorICAgICAgICAgICAgICA8cmVwb3J0PmFnZ3JlZ2F0ZTwvcmVwb3J0PgorICAgICAgICAgICAgPC9yZXBvcnRzPgorICAgICAgICAgIDwvcmVwb3J0U2V0PgorICAgICAgICA8L3JlcG9ydFNldHM+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxhZGRpdGlvbmFsSk9wdGlvbj4tWGRvY2xpbnQ6LW1pc3Npbmc8L2FkZGl0aW9uYWxKT3B0aW9uPgorICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CiAgICAgICA8L3BsdWdpbj4KICAgICAgIDxwbHVnaW4+CiAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KQEAgLTYxOSw2ICs1NzgsMjQgQEAKICAgICAgICAgICA8L3JlcG9ydHNEaXJlY3Rvcmllcz4KICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi45PC92ZXJzaW9uPgorICAgICAgICA8cmVwb3J0U2V0cz4KKyAgICAgICAgICA8cmVwb3J0U2V0PgorICAgICAgICAgICAgPHJlcG9ydHM+CisgICAgICAgICAgICAgIDxyZXBvcnQ+ZGVwZW5kZW5jaWVzPC9yZXBvcnQ+CisgICAgICAgICAgICAgIDxyZXBvcnQ+cHJvamVjdC10ZWFtPC9yZXBvcnQ+CisgICAgICAgICAgICAgIDxyZXBvcnQ+bWFpbGluZy1saXN0PC9yZXBvcnQ+CisgICAgICAgICAgICAgIDxyZXBvcnQ+Y2ltPC9yZXBvcnQ+CisgICAgICAgICAgICAgIDxyZXBvcnQ+aXNzdWUtdHJhY2tpbmc8L3JlcG9ydD4KKyAgICAgICAgICAgICAgPHJlcG9ydD5saWNlbnNlPC9yZXBvcnQ+CisgICAgICAgICAgICAgIDxyZXBvcnQ+c2NtPC9yZXBvcnQ+CisgICAgICAgICAgICA8L3JlcG9ydHM+CisgICAgICAgICAgPC9yZXBvcnRTZXQ+CisgICAgICAgIDwvcmVwb3J0U2V0cz4KKyAgICAgIDwvcGx1Z2luPgogICAgIDwvcGx1Z2lucz4KICAgPC9yZXBvcnRpbmc+CiAKQEAgLTc2Miw2ICs3MzksMTA3IEBACiAKICAgPHByb2ZpbGVzPgogICAgIDxwcm9maWxlPgorICAgICAgPGlkPmphdmFjPC9pZD4KKyAgICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjMuNy4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgIDxlbmNvZGluZz5VVEYtODwvZW5jb2Rpbmc+CisgICAgICAgICAgICAgIDxzb3VyY2U+MS44PC9zb3VyY2U+CisgICAgICAgICAgICAgIDx0YXJnZXQ+MS44PC90YXJnZXQ+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8aWQ+ZGVmYXVsdC1jb21waWxlPC9pZD4KKyAgICAgICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgPGdvYWw+Y29tcGlsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcvZWNsaXBzZS9qZ2l0L3RyYW5zcG9ydC9JbnNlY3VyZUNpcGhlckZhY3RvcnkuamF2YTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8aWQ+Y29tcGlsZS13aXRoLWVycm9ycHJvbmU8L2lkPgorICAgICAgICAgICAgICAgIDxwaGFzZT5jb21waWxlPC9waGFzZT4KKyAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICA8Z29hbD5jb21waWxlPC9nb2FsPgorICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICA8Y29tcGlsZXJJZD5qYXZhYy13aXRoLWVycm9ycHJvbmU8L2NvbXBpbGVySWQ+CisgICAgICAgICAgICAgICAgICA8Zm9yY2VKYXZhY0NvbXBpbGVyVXNlPnRydWU8L2ZvcmNlSmF2YWNDb21waWxlclVzZT4KKyAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2VjbGlwc2UvamdpdC90cmFuc3BvcnQvSW5zZWN1cmVDaXBoZXJGYWN0b3J5LmphdmE8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1qYXZhYzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjguMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1qYXZhYy1lcnJvcnByb25lPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuOC40PC92ZXJzaW9uPgorICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgIDwhLS0gb3ZlcnJpZGUgcGxleHVzLWNvbXBpbGVyLWphdmFjLWVycm9ycHJvbmUncyBkZXBlbmRlbmN5IG9uCisgICAgICAgICAgICAgICAgICBFcnJvciBQcm9uZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiAtLT4KKyAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5lcnJvcnByb25lPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmVycm9yX3Byb25lX2NvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgICA8L2J1aWxkPgorICAgIDwvcHJvZmlsZT4KKyAgICA8cHJvZmlsZT4KKyAgICAgIDxpZD5lY2o8L2lkPgorICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+dHJ1ZTwvYWN0aXZlQnlEZWZhdWx0PgorICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+My43LjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPGNvbXBpbGVySWQ+ZWNsaXBzZTwvY29tcGlsZXJJZD4KKyAgICAgICAgICAgICAgPGVuY29kaW5nPlVURi04PC9lbmNvZGluZz4KKyAgICAgICAgICAgICAgPHNvdXJjZT4xLjg8L3NvdXJjZT4KKyAgICAgICAgICAgICAgPHRhcmdldD4xLjg8L3RhcmdldD4KKyAgICAgICAgICAgICAgPCEtLSBQYXNzaW5nIGFyZ3VtZW50cyBpcyBhIHRyYWlud3JlY2ssIHNlZSBodHRwczovL2lzc3Vlcy5hcGFjaGUub3JnL2ppcmEvYnJvd3NlL01DT01QSUxFUi0xMjMgLS0+CisgICAgICAgICAgICAgIDxjb21waWxlckFyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4ke3Byb2plY3QuYmFzZWRpcn0vLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzPC9wcm9wZXJ0aWVzPgorICAgICAgICAgICAgICA8L2NvbXBpbGVyQXJndW1lbnRzPgorICAgICAgICAgICAgICA8c2hvd1dhcm5pbmdzPnRydWU8L3Nob3dXYXJuaW5ncz4KKyAgICAgICAgICAgICAgPHNob3dEZXByZWNhdGlvbj50cnVlPC9zaG93RGVwcmVjYXRpb24+CisgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1lY2xpcHNlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuOC40PC92ZXJzaW9uPgorICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpkdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lY2o8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+My4xMy4xMDI8L3ZlcnNpb24+CisgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgICA8L2J1aWxkPgorICAgIDwvcHJvZmlsZT4KKyAgICA8cHJvZmlsZT4KICAgICAgIDxpZD5zdGF0aWMtY2hlY2tzPC9pZD4KICAgICAgIDxidWlsZD4KICAgICAgICAgPHBsdWdpbnM+Cg==