ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKaW5kZXggNmU4N2RmZi4uNDljNmIzYyAxMDA2NDQKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTIsNyArMiw3IEBACiBCdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCiBCdW5kbGUtTmFtZTogJVBMVUdJTl9OQU1FCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDQucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogMS4xLjEwNi5xdWFsaWZpZXIKIEJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uVUlQbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVQTFVHSU5fUFJPVklERVIKIEJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vRmFjZXRPcGVyYXRpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9jb21tb24vRmFjZXRPcGVyYXRpb25EZWxlZ2F0ZS5qYXZhCmluZGV4IDIwNDgxOTIuLjVhYmJjOGMgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvY29tbW9uL0ZhY2V0T3BlcmF0aW9uRGVsZWdhdGUuamF2YQorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL2NvbW1vbi9GYWNldE9wZXJhdGlvbkRlbGVnYXRlLmphdmEKQEAgLTEwLDYgKzEwLDcgQEAKICAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCiAgKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogMjAwOTAzMDMgICAyNDI2MzUgbWFodXRjaEBjYS5pYm0uY29tIC0gTWFyayBIdXRjaGluc29uLCBSZW1vdmUgdW5uZWNlc3NhcnkgVUkgZGVwZW5kZW5jaWVzIGZyb20gb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uCisgKiAyMDA5MDgxOSAgIDI4Njg3NCB6aW5hQGNhLmlibS5jb20gLSBaaW5hIE1vc3RhZmlhCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIHBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLnVpLmNvbW1vbjsKIApAQCAtMjEsMTIgKzIyLDE4IEBACiAKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7CiBpbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwogaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7CitpbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZW0udXRpbC5lbWYud29ya2JlbmNoLlByb2plY3RVdGlsaXRpZXM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uub3BlcmF0aW9uLklSdW5uYWJsZVdpdGhQcm9ncmVzczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29tbW9uLkoyRUVVdGlsczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uQ29uc3VtcHRpb25NZXNzYWdlczsKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24uY29tbW9uLkZhY2V0VXRpbHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbnN1bXB0aW9uLmNvbW1vbi5JRmFjZXRPcGVyYXRpb25EZWxlZ2F0ZTsKQEAgLTUzLDYgKzYwLDcgQEAKIAkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIHNoZWxsTW9uaXRvcikgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKIAkJCQl0cnkgewogCQkJCQlmcHJvamVjdC5tb2RpZnkoYWN0aW9ucywgc2hlbGxNb25pdG9yKTsKKwkJCQkJZml4RUpCQ2xhc3NQYXRoKGZwcm9qZWN0KTsKIAkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCQkJc3RhdHVzWzBdID0gZ2V0RXJyb3JTdGF0dXNGb3JBZGRpbmdGYWNldHMoZnByb2plY3QuZ2V0UHJvamVjdCgpLmdldE5hbWUoKSwgcHJvamVjdEZhY2V0VmVyc2lvbnMsIGUpOwogCQkJCX0KQEAgLTcxLDYgKzc5LDcgQEAKIAkJfSBlbHNlIHsKIAkJCXRyeSB7CiAJCQkJZnByb2plY3QubW9kaWZ5KGFjdGlvbnMsIG51bGwpOworCQkJCWZpeEVKQkNsYXNzUGF0aChmcHJvamVjdCk7CiAJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKIAkJCQlzdGF0dXNbMF0gPSBnZXRFcnJvclN0YXR1c0ZvckFkZGluZ0ZhY2V0cyhmcHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0TmFtZSgpLCBwcm9qZWN0RmFjZXRWZXJzaW9ucywgZSk7CiAJCQl9CkBAIC03OSw2ICs4OCwzNiBAQAogCQlyZXR1cm4gc3RhdHVzWzBdOwogCX0KIAorCXByaXZhdGUgdm9pZCBmaXhFSkJDbGFzc1BhdGgoSUZhY2V0ZWRQcm9qZWN0IHByb2plY3QpIHsKKwkJaWYgKCFKMkVFVXRpbHMuaXNFSkJDb21wb25lbnQocHJvamVjdC5nZXRQcm9qZWN0KCkpKSByZXR1cm47CisJCUlQcm9qZWN0IGVqYlByb2plY3QgPSBwcm9qZWN0LmdldFByb2plY3QoKTsKKwkJSUphdmFQcm9qZWN0IGphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKGVqYlByb2plY3QpOworCQlQYXRoIHByb2plY3RSb290ID0gbmV3IFBhdGgoUGF0aC5ST09ULmFwcGVuZChuZXcgUGF0aChlamJQcm9qZWN0LmdldE5hbWUoKSkpLnRvU3RyaW5nKCkpOworCQlJUGF0aCBlamJNb2R1bGVQYXRoID0gcHJvamVjdFJvb3QuYXBwZW5kKCJlamJNb2R1bGUiKTsKKwkJdHJ5IHsKKwkJCUlDbGFzc3BhdGhFbnRyeVtdIG9yaWdpbmFsU2V0ID0gamF2YVByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7CisJCQlib29sZWFuIGZvdW5kRUpCTW9kdWxFbnRyeSA9IGZhbHNlOworCQkJZm9yIChJQ2xhc3NwYXRoRW50cnkgZW50cnkgOiBvcmlnaW5hbFNldCkgeworCQkJCWlmIChlbnRyeS5nZXRQYXRoKCkuZXF1YWxzKGVqYk1vZHVsZVBhdGgpKQorCQkJCQlmb3VuZEVKQk1vZHVsRW50cnkgPSB0cnVlOworCQkJfQorCQkJaWYgKCFmb3VuZEVKQk1vZHVsRW50cnkpIHsKKwkJCQlJQ2xhc3NwYXRoRW50cnlbXSBuZXdTZXQgPSBuZXcgSUNsYXNzcGF0aEVudHJ5W29yaWdpbmFsU2V0Lmxlbmd0aCArIDFdOworCQkJCWludCBpPTA7CisKKwkJCQlmb3IgKElDbGFzc3BhdGhFbnRyeSBlbnRyeSA6IG9yaWdpbmFsU2V0KSB7CisJCQkJCW5ld1NldFtpKytdID0gZW50cnk7CisJCQkJfQorCQkJCW5ld1NldFtpXSA9IEphdmFDb3JlLm5ld1NvdXJjZUVudHJ5KGVqYk1vZHVsZVBhdGgpOworCQkJCWphdmFQcm9qZWN0LnNldFJhd0NsYXNzcGF0aChuZXdTZXQsbnVsbCk7CisJCQl9CisJCX0KKwkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisJCQkvLyBUT0RPOiBoYW5kbGUgZXhjZXB0aW9uCisJCX0KKwkJCisJfQorCiAJcHVibGljIElTdGF0dXMgY3JlYXRlTmV3RmFjZXRlZFByb2plY3QoZmluYWwgU3RyaW5nIHByb2plY3ROYW1lKSB7CiAJCWZpbmFsIElTdGF0dXNbXSBzdGF0dXMgPSBuZXcgSVN0YXR1c1sxXTsKIAkJc3RhdHVzWzBdID0gU3RhdHVzLk9LX1NUQVRVUzsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3ByZWZlcmVuY2VzL1BlcnNpc3RlbnRTZXJ2ZXJSdW50aW1lQ29udGV4dC5qYXZhCmluZGV4IDllNmVhYTguLjAxNjMyNjAgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvcHJlZmVyZW5jZXMvUGVyc2lzdGVudFNlcnZlclJ1bnRpbWVDb250ZXh0LmphdmEKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS9wcmVmZXJlbmNlcy9QZXJzaXN0ZW50U2VydmVyUnVudGltZUNvbnRleHQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xMSwxMSArMTEsMTQgQEAKICAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAyMDA4MDQxNSAgIDIyNzE1MiBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgTmVlZCBhIHdheSB0byBzcGVjaWZ5IGEgYmFja3VwIFdlYiBzZXJ2aWNlIHJ1bnRpbWUKICAqIDIwMDgwOTE4ICAgMjQ3NTM3IG1haHV0Y2hAY2EuaWJtLmNvbSAtIE1hcmsgSHV0Y2hpbnNvbiwgVXBkYXRlIGRlZmF1bHQgc2VydmVyIHJ1bnRpbWUgdG8gVG9tY2F0IDYKKyAqIDIwMDkwNzE0ICAgMjgzMzk5IGVyaWNkcEBjYS5pYm0uY29tIC0gRXJpYyBELiBQZXRlcnMsIFdlYiBTZXJ2aWNlcyA+IFNlcnZlciAmIFJ1bnRpbWUgcHJlZmVyZW5jZSB1bmRlZmluZWQKKyAqIDIwMDkxMDA3ICAgMjgzMzk5IGVyaWNkcEBjYS5pYm0uY29tIC0gRXJpYyBELiBQZXRlcnMsIFdlYiBTZXJ2aWNlcyA+IFNlcnZlciAmIFJ1bnRpbWUgcHJlZmVyZW5jZSB1bmRlZmluZWQgCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucHJlZmVyZW5jZXM7CiAKIGltcG9ydCBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDb25zdW1wdGlvblVJUGx1Z2luOworaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53c3J0LldlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tYW5kLmludGVybmFsLmVudi5jb250ZXh0LlBlcnNpc3RlbnRDb250ZXh0OwogCiAKQEAgLTQ0LDE1ICs0NywyMCBAQAogCQkvL0RlZmF1bHRzIHdpbGwgYmUgc2V0IHZpYSB0aGUgLmluaSBjdXN0b21pemF0aW9uLiBUaGV5IGFyZSBoYXJkIGNvZGVkIHRvIGRlZmF1bHQgdmFsdWVzIGluIHRoZQogCQkvL2Fic2VuY2Ugb2YgYSAuaW5pIGZpbGUuCiAJCVN0cmluZyBzZXJ2ZXJEZWZhdWx0ID0gZ2V0RGVmYXVsdFN0cmluZyhQUkVGRVJFTkNFX1NFUlZFUik7Ci0JCWlmIChzZXJ2ZXJEZWZhdWx0PT1udWxsIHx8IHNlcnZlckRlZmF1bHQubGVuZ3RoKCk9PTApCisJCWlmIChzZXJ2ZXJEZWZhdWx0PT1udWxsIHx8IHNlcnZlckRlZmF1bHQubGVuZ3RoKCk9PTAgfHwgV2ViU2VydmljZVJ1bnRpbWVFeHRlbnNpb25VdGlsczIuZ2V0U2VydmVyTGFiZWxCeUlkKHNlcnZlckRlZmF1bHQpPT1udWxsKQogCQl7CiAJCSAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1NFUlZFUiwgU0VSVkVSX0ZBQ1RPUllfSURfREVGQVVMVCk7CiAJCX0KIAogCQlTdHJpbmcgcnVudGltZURlZmF1bHQgPSBnZXREZWZhdWx0U3RyaW5nKFBSRUZFUkVOQ0VfUlVOVElNRSk7Ci0JCWlmIChydW50aW1lRGVmYXVsdD09bnVsbCB8fCBydW50aW1lRGVmYXVsdC5sZW5ndGgoKT09MCkKKwkJaWYgKFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFJ1bnRpbWVMYWJlbEJ5SWQocnVudGltZURlZmF1bHQpPT1udWxsKQorCQkJLy90cnkgYWdhaW4gdXNpbmcgZmFsbCBiYWNrIHJ1bnRpbWUKKwkJCXJ1bnRpbWVEZWZhdWx0ID0gZ2V0RGVmYXVsdFN0cmluZyhGQUxMQkFDS19SVU5USU1FKTsKKwkJaWYgKHJ1bnRpbWVEZWZhdWx0PT1udWxsIHx8IHJ1bnRpbWVEZWZhdWx0Lmxlbmd0aCgpPT0wIHx8IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFJ1bnRpbWVMYWJlbEJ5SWQocnVudGltZURlZmF1bHQpPT1udWxsKQogCQl7CiAJCSAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1JVTlRJTUUsIFJVTlRJTUVfSURfREVGQVVMVCk7CisJCX0gZWxzZSB7CisJCSAgc2V0RGVmYXVsdChQUkVGRVJFTkNFX1JVTlRJTUUsIHJ1bnRpbWVEZWZhdWx0KTsKIAkJfQogCQkJCQogCX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi51aS9zcmMvb3JnL2VjbGlwc2UvanN0L3dzL2ludGVybmFsL2NvbnN1bXB0aW9uL3VpL3dpZGdldHMvZXh0ZW5zaW9ucy9DbGllbnRFeHRlbnNpb25EZWZhdWx0aW5nQ29tbWFuZC5qYXZhCmluZGV4IDU5MmYzOWMuLjBlNzg1MzcgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3Qvd3MvaW50ZXJuYWwvY29uc3VtcHRpb24vdWkvd2lkZ2V0cy9leHRlbnNpb25zL0NsaWVudEV4dGVuc2lvbkRlZmF1bHRpbmdDb21tYW5kLmphdmEKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24udWkvc3JjL29yZy9lY2xpcHNlL2pzdC93cy9pbnRlcm5hbC9jb25zdW1wdGlvbi91aS93aWRnZXRzL2V4dGVuc2lvbnMvQ2xpZW50RXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQuamF2YQpAQCAtMSw1ICsxLDUgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDggSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDkgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCiAgKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKICAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0CkBAIC0xOSw2ICsxOSw3IEBACiAgKiAyMDA4MDMyNSAgIDE4NDc2MSBnaWxiZXJ0YUBjYS5pYm0uY29tIC0gR2lsYmVydCBBbmRyZXdzCiAgKiAyMDA4MDUwNiAgIDIyNzg0OCBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgRGlzYWJsZWQgIlJ1biBvbiBTZXJ2ZXIiIGNoZWNrYm94IGlzIGluIGNoZWNrZWQgc3RhdGUKICAqIDIwMDgwNzI5ICAgMjQxMjc1IGVyaWNkcEBjYS5pYm0uY29tIC0gRXJpYyBELiBQZXRlcnMsIE5vIFZhbGlkYXRpb24gZXJyb3IgZ2VuZXJhdGluZyBXZWIgU2VydmljZSBjbGllbnQgaWYgZGlhbG9nIGhpZGRlbgorICogMjAwOTA3MTQgICAyODMzMTIgZXJpY2RwQGNhLmlibS5jb20gLSBFcmljIEQuIFBldGVycywgQU5UIENsaWVudCBnZW4tIG1lc3NhZ2UgbWlzc2luZyBzZXJ2ZXIgbmFtZSBzdWJzdC4gdmFyaWFibGUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY29uc3VtcHRpb24udWkud2lkZ2V0cy5leHRlbnNpb25zOwogCkBAIC02MTIsNiArNjEzLDggQEAKIAl9CiAgICAgaWYgKG5vUnVudGltZUluc3RhbGxlZCl7CiAgICAgICAgIFN0cmluZyBzZXJ2ZXJMYWJlbCA9IFdlYlNlcnZpY2VSdW50aW1lRXh0ZW5zaW9uVXRpbHMyLmdldFNlcnZlckxhYmVsQnlJZChzZXJ2ZXJJZCk7CisgICAgICAgIGlmIChzZXJ2ZXJMYWJlbCA9PSBudWxsKSAvLyBDYW5ub3QgdHJhbnNsYXRlIGZyb20gaWQgdG8gbGFiZWwsIHNvIGxldCdzIGp1c3QgdXNlIHRoZSBpZAorICAgICAgICAJc2VydmVyTGFiZWwgPSBzZXJ2ZXJJZDsKICAgICAJc3RhdHVzID0gU3RhdHVzVXRpbHMuZXJyb3JTdGF0dXMoTkxTLmJpbmQoQ29uc3VtcHRpb25VSU1lc3NhZ2VzLk1TR19FUlJPUl9OT19TRVJWRVJfUlVOVElNRV9JTlNUQUxMRUQsIG5ldyBTdHJpbmdbXSB7c2VydmVyTGFiZWx9KSk7CiAgICAgICAgIGVudi5nZXRTdGF0dXNIYW5kbGVyKCkucmVwb3J0RXJyb3Ioc3RhdHVzKTsKICAgICB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGNkOWExOGIuLmQ1MTBlZTIgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0yLDcgKzIsNyBAQAogQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgogQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNDA3LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDEuMC40MDgucXVhbGlmaWVyCiBCdW5kbGUtQ2xhc3NQYXRoOiAuLAogIHdlYnNlcnZpY2V1dGlscy5qYXIKIEJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi5wbHVnaW4uV2ViU2VydmljZUNvbnN1bXB0aW9uUGx1Z2luCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvU29hcEVsZW1lbnRTYXhIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jb25zdW1wdGlvbi93ZWJzZXJ2aWNldXRpbHMvb3JnL2VjbGlwc2UvanN0L3dzL3V0aWwvU29hcEVsZW1lbnRTYXhIYW5kbGVyLmphdmEKaW5kZXggMjZiYmY2ZS4uYWM0M2NkYSAxMDA2NDQKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY29uc3VtcHRpb24vd2Vic2VydmljZXV0aWxzL29yZy9lY2xpcHNlL2pzdC93cy91dGlsL1NvYXBFbGVtZW50U2F4SGFuZGxlci5qYXZhCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNvbnN1bXB0aW9uL3dlYnNlcnZpY2V1dGlscy9vcmcvZWNsaXBzZS9qc3Qvd3MvdXRpbC9Tb2FwRWxlbWVudFNheEhhbmRsZXIuamF2YQpAQCAtMSwxNSArMSwxNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNiwgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKICAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKKyAqCiAgKiBDb250cmlidXRvcnM6CiAgKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KICAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCiAgKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICogMjAwNjAxMzEgICAxMjM5NjMgYW5keXpoYWlAY2EuaWJtLmNvbSAtIEFuZHkgWmhhaQorICogMjAwOTA4MDYgICAyODU5MzMgZXJpY2RwQGNhLmlibS5jb20gLSBFcmljIEQuIFBldGVycywgU09BUEVsZW1lbnRTYXhIYW5kbGVyIHRvIGNyZWF0ZSB0ZXh0IG5vZGVzIHJlc3VsdHMgaW4gbnVsbCByZXR1cm4gZm9yIGNoYXIgc2l6ZSAxCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogcGFja2FnZSBvcmcuZWNsaXBzZS5qc3Qud3MudXRpbDsKQEAgLTY4LDcgKzY5LDcgQEAKIAl7CiAJCVN0cmluZyBzdHIgPSBTdHJpbmcudmFsdWVPZihjaCk7CiAJCS8vQWRkIG5vbi10cml2aWFsIHRleHQgYXMgYSB0ZXh0IG5vZGUKLQkJaWYgKGxlbmd0aCA+IDEpCisJCWlmIChsZW5ndGggPiAwKQogCQl7CiAJCQl0cnkgCiAJCQl7CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDJhZjFjY2EuLjYyYTNkMTcgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0yLDcgKzIsNyBAQAogQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgogQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNDA4LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDEuMC40MDkucXVhbGlmaWVyCiBCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS5qc3Qud3MuaW50ZXJuYWwuY3JlYXRpb24udWkucGx1Z2luLldlYlNlcnZpY2VDcmVhdGlvblVJUGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC53cy5jcmVhdGlvbi51aS9wbHVnaW4ueG1sCmluZGV4IDkyNzFmNzcuLjk5YzFiNzcgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LndzLmNyZWF0aW9uLnVpL3BsdWdpbi54bWwKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3Qud3MuY3JlYXRpb24udWkvcGx1Z2luLnhtbApAQCAtMzMzLDExICszMzMsNyBAQAogICAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jcmVhdGlvbi51aS53aWRnZXRzLlNlcnZlcldpemFyZFdpZGdldE91dHB1dENvbW1hbmQiCiAgICAgICAgICAgICAgIHByb3BlcnR5PSJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiCiAgICAgICAgICAgICAgIHRyYW5zZm9ybT0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNvbW1vbi5TdHJpbmcyVHlwZVJ1bnRpbWVTZXJ2ZXJNb2RpZmllciIvPiAgICAgICAgICAgICAKLSAgICAgICAgPG1hcAotICAgICAgICAgICAgICBrZXk9IkdlbmVyYXRlUHJveHkiCi0gICAgICAgICAgICAgIG9wZXJhdGlvbj0ib3JnLmVjbGlwc2UuanN0LndzLmludGVybmFsLmNyZWF0aW9uLnVpLndpZGdldHMuU2VydmVyV2l6YXJkV2lkZ2V0T3V0cHV0Q29tbWFuZCIKLSAgICAgICAgICAgICAgcHJvcGVydHk9IkdlbmVyYXRlUHJveHkiLz4KLSAgICAgIDxtYXAKKyAgICAgPG1hcAogICAgICAgICAgICAgICBrZXk9IlNlcnZpY2UuUnVudGltZUlkIgogICAgICAgICAgICAgICBvcGVyYXRpb249Im9yZy5lY2xpcHNlLmpzdC53cy5pbnRlcm5hbC5jb25zdW1wdGlvbi51aS53aWRnZXRzLmV4dGVuc2lvbnMuU2VydmVyRXh0ZW5zaW9uRGVmYXVsdGluZ0NvbW1hbmQiCiAgICAgICAgICAgICAgIHByb3BlcnR5PSJTZXJ2aWNlVHlwZVJ1bnRpbWVTZXJ2ZXIiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IGVjNmNmYWIuLjViYTIyODUgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0yLDcgKzIsNyBAQAogQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgogQnVuZGxlLU5hbWU6ICVQTFVHSU5fTkFNRQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuNDA3LnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDEuMC40MDgucXVhbGlmaWVyCiBCdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwuZXhwbG9yZXIucGx1Z2luLkV4cGxvcmVyUGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC90cmFuc3BvcnQvU09BUE1lc3NhZ2VQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzLmV4cGxvcmVyL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3MvaW50ZXJuYWwvZXhwbG9yZXIvcGxhdGZvcm0vd3NkbC90cmFuc3BvcnQvU09BUE1lc3NhZ2VQcm9jZXNzb3IuamF2YQppbmRleCAwNTMyMTEyLi5hZjc2M2VlIDEwMDY0NAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53cy5leHBsb3Jlci9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL2ludGVybmFsL2V4cGxvcmVyL3BsYXRmb3JtL3dzZGwvdHJhbnNwb3J0L1NPQVBNZXNzYWdlUHJvY2Vzc29yLmphdmEKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3MuZXhwbG9yZXIvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9pbnRlcm5hbC9leHBsb3Jlci9wbGF0Zm9ybS93c2RsL3RyYW5zcG9ydC9TT0FQTWVzc2FnZVByb2Nlc3Nvci5qYXZhCkBAIC0xLDUgKzEsNSBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAwOSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KICAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKICAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAogICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKQEAgLTExLDYgKzExLDcgQEAKICAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgKiAyMDA3MDQxMyAgIDE3NjQ5MyBtYWthbmRyZUBjYS5pYm0uY29tIC0gQW5kcmV3IE1haywgV1NFOiBNYWtlIG1lc3NhZ2UvdHJhbnNwb3J0IHN0YWNrIHBsdWdnYWJsZQogICogMjAwODEwMjAgICAyNTEyNjkgbWFodXRjaEBjYS5pYm0uY29tIC0gTWFyayBIdXRjaGluc29uLCBXU0UgU2VuZHMgV3JvbmcgTmFtZXNwYWNlIGZvciBjaGlsZCBlbGVtZW50cyBvZiB0aGUgU09BUCBib2R5CisgKiAyMDA5MTEwNCAgIDI5NDI2MCBtYWh1dGNoQGNhLmlibS5jb20gLSBNYXJrIEh1dGNoaW5zb24sIFdTRSBzb3VyY2UgdmlldyBtaXNzaW5nIHNvbWUgbmFtZXNwYWNlIHByZWZpeGVzIGluIFNPQVAgcmVzcG9uc2UgbWVzc2FnZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBwYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5pbnRlcm5hbC5leHBsb3Jlci5wbGF0Zm9ybS53c2RsLnRyYW5zcG9ydDsKIApAQCAtMzU3LDcgKzM1OCw3IEBACiAJCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluc3RhbmNlVmVjdG9yLnNpemUoKTsgaSsrKSB7CiAJCSAgICAJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIGluc3RhbmNlVmVjdG9yLmdldChpKTsKIAkJICAgIAkKLQkJICAgIAlpZiAoIWVsZW1lbnQuZ2V0VGFnTmFtZSgpLmVxdWFscyhmcmFnTmFtZSkpIHsKKwkJICAgIAlpZiAoIWVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkuZXF1YWxzKGZyYWdOYW1lKSkgewogCQkgICAgCQlEb2N1bWVudCBkb2MgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKIAkJICAgIAkJTm9kZUxpc3QgY2hpbGRyZW4gPSBlbGVtZW50LmdldENoaWxkTm9kZXMoKTsKIAkJICAgIAkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCBlZjNhZDE0Li5jZmJkNDhmIDEwMDY0NAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0yLDcgKzIsNyBAQAogQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgogQnVuZGxlLU5hbWU6ICVfUExVR0lOX05BTUUKIEJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb247IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS40MDEucXVhbGlmaWVyCitCdW5kbGUtVmVyc2lvbjogMS4xLjQwMi5xdWFsaWZpZXIKIEJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuZWNsaXBzZS5WYWxpZGF0ZVdTRExQbHVnaW4KIEJ1bmRsZS1WZW5kb3I6ICVfUFJPVklERVJfTkFNRQogQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMUJhc2ljVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24vc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvd3NkbDExL1dTREwxMUJhc2ljVmFsaWRhdG9yLmphdmEKaW5kZXggZjk5YjA5Zi4uN2MzNmEyNyAxMDA2NDQKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3dzZGwxMS9XU0RMMTFCYXNpY1ZhbGlkYXRvci5qYXZhCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC93c2RsMTEvV1NETDExQmFzaWNWYWxpZGF0b3IuamF2YQpAQCAtMTAyLDggKzEwMiw2IEBACiAgICAqLwogICBwdWJsaWMgdm9pZCB2YWxpZGF0ZShPYmplY3QgZWxlbWVudCwgTGlzdCBwYXJlbnRzLCBJV1NETDExVmFsaWRhdGlvbkluZm8gdmFsSW5mbykKICAgewotICAgIC8vdGhpcy52YWxpZGF0b3Jjb250cm9sbGVyID0gdmFsaWRhdG9yY29udHJvbGxlcjsKLSAgICAvL3NldERlZmF1bHRSZXNvdXJjZUJ1bmRsZUlmTmVlZGVkKHZhbGlkYXRvcmNvbnRyb2xsZXIpOwogICAgIERlZmluaXRpb24gd3NkbERlZmluaXRpb24gPSAoRGVmaW5pdGlvbillbGVtZW50OwogICAgIHZhbGlkYXRlVHlwZXMod3NkbERlZmluaXRpb24sIHZhbEluZm8pOwogICAgIHZhbGlkYXRlU2VydmljZXMod3NkbERlZmluaXRpb24sIHZhbEluZm8pOwpAQCAtMTExLDYgKzEwOSwxMyBAQAogICAgIHZhbGlkYXRlUG9ydFR5cGVzKHdzZGxEZWZpbml0aW9uLCB2YWxJbmZvKTsKICAgICB2YWxpZGF0ZU1lc3NhZ2VzKHdzZGxEZWZpbml0aW9uLCB2YWxJbmZvKTsKIAorICAgIC8vIFRoZSBwYXJlbnRzIGxpc3QgaXMgZXhwZWN0ZWQgdG8gYmUgZW1wdHkgaGVyZSwgc28gc2ltcGx5IGFkZCB0aGUgZGVmaW5pdGlvbiAKKyAgICAvLyBiZWluZyB2YWxpZGF0ZWQgdG8gdGhlIHBhcmVudHMgbGlzdCwgdmFsaWRhdGUgaXRzIGV4dGVuc2liaWxpdHkgZWxlbWVudHMsIAorICAgIC8vIHRoZW4gcmVtb3ZlIGl0LgorICAgIAorICAgIHBhcmVudHMuYWRkKHdzZGxEZWZpbml0aW9uKTsKKyAgICB2YWxpZGF0ZUV4dGVuc2liaWxpdHlFbGVtZW50TGlzdChwYXJlbnRzLCB3c2RsRGVmaW5pdGlvbi5nZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKSwgdmFsSW5mbyk7CisgICAgcGFyZW50cy5yZW1vdmUoMCk7CiAgIH0KIAogICAvKioKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDdiYjdiMWIuLjJiYTAwMjkgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMiw3ICsyLDcgQEAKIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKIEJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQogQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndzZGw7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMi4wLnF1YWxpZmllcgorQnVuZGxlLVZlcnNpb246IDEuMi4yLnF1YWxpZmllcgogQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBsdWdpbkltcGxlbWVudGF0aW9uCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nRmF1bHRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ0ZhdWx0SW1wbC5qYXZhCmluZGV4IDVhMTVlZTQuLjA0ZTg5MmMgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nRmF1bHRJbXBsLmphdmEKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdGYXVsdEltcGwuamF2YQpAQCAtMjk5LDE0ICsyOTksNiBAQAogICAgIHN1cGVyLmhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoY2hpbGQsIHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7CiAgIH0KIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLnJlbW92ZShpLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KICAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCiAgIHsKICAgICBCaW5kaW5nRmF1bHQgYmluZGluZ0ZhdWx0ID0gKEJpbmRpbmdGYXVsdCljb21wb25lbnQ7CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ0lucHV0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdJbnB1dEltcGwuamF2YQppbmRleCA0Mzk4ZDFhLi42YzFkNTliIDEwMDY0NAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ0lucHV0SW1wbC5qYXZhCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9CaW5kaW5nSW5wdXRJbXBsLmphdmEKQEAgLTMwMiwxNCArMzAyLDYgQEAKICAgICBzdXBlci5oYW5kbGVVbnJlY29uY2lsZWRFbGVtZW50KGNoaWxkLCByZW1haW5pbmdNb2RlbE9iamVjdHMpOwogICB9CiAKLSAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlUmVjb25jaWxpYXRpb24oQ29sbGVjdGlvbiByZW1haW5pbmdNb2RlbE9iamVjdHMpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZW1haW5pbmdNb2RlbE9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIGdldEVFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5yZW1vdmUoaS5uZXh0KCkpOwotICAgIH0KLSAgfQotCiAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGVsT2JqZWN0cyhPYmplY3QgY29tcG9uZW50KQogICB7CiAgICAgQmluZGluZ0lucHV0IGJpbmRpbmdJbnB1dCA9IChCaW5kaW5nSW5wdXQpY29tcG9uZW50OwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0JpbmRpbmdPdXRwdXRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ091dHB1dEltcGwuamF2YQppbmRleCA5MmQzN2IyLi42ZjE2YmNiIDEwMDY0NAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ091dHB1dEltcGwuamF2YQorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvQmluZGluZ091dHB1dEltcGwuamF2YQpAQCAtMzAyLDE0ICszMDIsNiBAQAogICAgIHN1cGVyLmhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoY2hpbGQsIHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7CiAgIH0KIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLnJlbW92ZShpLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KICAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCiAgIHsKICAgICBCaW5kaW5nT3V0cHV0IGJpbmRpbmdPdXRwdXQgPSAoQmluZGluZ091dHB1dCljb21wb25lbnQ7CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJsZUVsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvRXh0ZW5zaWJsZUVsZW1lbnRJbXBsLmphdmEKaW5kZXggYmJmOWJiYS4uYzNjMDVjNyAxMDA2NDQKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0V4dGVuc2libGVFbGVtZW50SW1wbC5qYXZhCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9FeHRlbnNpYmxlRWxlbWVudEltcGwuamF2YQpAQCAtMTIsNiArMTIsNyBAQAogCiAKIGltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIApAQCAtMjYyLDQgKzI2MywyMiBAQAogICAgIHJldHVybiBnZXRFbmNsb3NpbmdEZWZpbml0aW9uKCkgPT0gbnVsbCA/IHRydWUgOiAoKERlZmluaXRpb25JbXBsKWdldEVuY2xvc2luZ0RlZmluaXRpb24oKSkuZ2V0VXNlRXh0ZW5zaW9uRmFjdG9yaWVzKCk7CiAgIH0KIAorICAvKioKKyAgICogT3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhlIHJlbWFpbmluZ01vZGVsT2JqZWN0cyBjb250YWluIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBvbmx5IEV4dGVuc2liaWxpdHlFbGVtZW50CisgICAqLworICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKKyAgeworICAgIHN1cGVyLmhhbmRsZVJlY29uY2lsaWF0aW9uKHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7CisgICAgSXRlcmF0b3IgaXRlcmF0b3IgPSByZW1haW5pbmdNb2RlbE9iamVjdHMuaXRlcmF0b3IoKTsKKyAgICBMaXN0IGV4dGVuc2liaWxpdHlFbGVtZW50cyA9IGdldEV4dGVuc2liaWxpdHlFbGVtZW50cygpOworICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpCisgICAgeworICAgICAgT2JqZWN0IG1vZGVsT2JqZWN0ID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQpIAorICAgICAgeworICAgICAgICBleHRlbnNpYmlsaXR5RWxlbWVudHMucmVtb3ZlKG1vZGVsT2JqZWN0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KKwogfSAvL0V4dGVuc2libGVFbGVtZW50SW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0ltcG9ydEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9JbXBvcnRJbXBsLmphdmEKaW5kZXggOWZkMjU5MC4uMDE3YjU5NiAxMDA2NDQKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL0ltcG9ydEltcGwuamF2YQorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvSW1wb3J0SW1wbC5qYXZhCkBAIC0zMSw4ICszMSwxNCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnV0aWwuV1NETENvbnN0YW50czsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExSZXNvdXJjZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKK2ltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7CiBpbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VJbXBsOwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CitpbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxSZWFkZXJGYWN0b3J5OwogCiAKIC8qKgpAQCAtNTEwLDcgKzUxNiw3IEBACiAgICAgICAgICAgICAgIHRyeQogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbSh1cmkpOwotICAgICAgICAgICAgICAgIHJlc29sdmVkUmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZSh1cmkpOworICAgICAgICAgICAgICAgIHJlc29sdmVkUmVzb3VyY2UgPSBnZXRSZXNvdXJjZSh1cmksIHJlc291cmNlU2V0KTsKICAgICAgICAgICAgICAgICByZXNvbHZlZFJlc291cmNlLmxvYWQoaW5wdXRTdHJlYW0sIHJlc291cmNlU2V0LmdldExvYWRPcHRpb25zKCkpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBleGNlcHRpb24pCkBAIC01ODYsNCArNTkyLDc2IEBACiAgICAgfQogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KKyAgCisgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRSb290RWxlbWVudE5hbWUoU3RyaW5nIHVyaSkKKyAgeworICAgIFJvb3RFbGVtZW50TmFtZUNvbnRlbnRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgUm9vdEVsZW1lbnROYW1lQ29udGVudEhhbmRsZXIoKTsKKyAgICB0cnkKKyAgICB7CisgICAgICBYTUxSZWFkZXIgcmVhZGVyID0gWE1MUmVhZGVyRmFjdG9yeS5jcmVhdGVYTUxSZWFkZXIoKTsKKyAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihoYW5kbGVyKTsKKyAgICAgIHJlYWRlci5wYXJzZSh1cmkpOworICAgIH0KKyAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCisgICAgeworICAgICAgLy8gRXhwbGljaXRseSBpZ25vcmUgYW55IGV4Y2VwdGlvbnMuCisgICAgfQorCisgICAgcmV0dXJuIGhhbmRsZXIucm9vdEVsZW1lbnROYW1lOworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUm9vdEVsZW1lbnROYW1lQ29udGVudEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlcgorICB7CisgICAgcHVibGljIFN0cmluZyByb290RWxlbWVudE5hbWU7CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24KKyAgICB7CisgICAgICByb290RWxlbWVudE5hbWUgPSBsb2NhbE5hbWU7CisKKyAgICAgIC8vIFRocm93IGFuIGV4Y2VwdGlvbiB0byBtYWtlIHRoZSBTQVggUGFyc2VyIHRvIHN0b3AgcGFyc2luZworICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiU0FYUGFyc2VyIGludGVudGlvbmFsbHkgc3RvcHBlZCIpOyAvLyROT04tTkxTLTEkCisgICAgfQorICB9CisgIAorICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgWFNEX1VSSSA9IFVSSS5jcmVhdGVVUkkoIioueHNkIik7IC8vJE5PTi1OTFMtMSQKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIFdTRExfVVJJID0gVVJJLmNyZWF0ZVVSSSgiKi53c2RsIik7IC8vJE5PTi1OTFMtMSQKKyAgCisgIHByaXZhdGUgc3RhdGljIFJlc291cmNlIGdldFJlc291cmNlKFVSSSB1cmksIFJlc291cmNlU2V0IHJlc291cmNlU2V0KQorICB7CisgICAgLy8gQWxsb3cgdGhlIHJlc291cmNlIHNldCB0aGUgZmlyc3QgY2hhbmNlIHRvIGNyZWF0ZSB0aGUgcmVzb3VyY2UgYmFzZWQgb24KKyAgICAvLyB0aGUgcmVnaXN0ZXJlZCByZXNvdXJjZSBmYWN0b3JpZXMuCisgICAgCisgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZSh1cmkpOworICAgIAorICAgIGJvb2xlYW4gaXNXc2RsT3JYc2RSZXNvdXJjZSA9IHJlc291cmNlIGluc3RhbmNlb2YgV1NETFJlc291cmNlSW1wbCB8fCByZXNvdXJjZSBpbnN0YW5jZW9mIFhTRFJlc291cmNlSW1wbDsKKyAgICAKKyAgICBpZiAoIWlzV3NkbE9yWHNkUmVzb3VyY2UpCisgICAgeworICAgICAgLy8gVGhlIFVSSSB3YXMgbm90IG1hcHBlZCB0byBhIFdTREwgb3IgWFNEIHJlc291cmNlLgorICAgICAgLy8gVHJ5IHRvIHBlZWsgaW5zaWRlIHRoZSByZXNvdXJjZSB0byBkZXRlcm1pbmUgaWYgaXRzIGFuIFhTRCBvciBXU0RMIGRvY3VtZW50LiAKKyAgICAgIAorICAgICAgU3RyaW5nIHJvb3RFbGVtZW50TmFtZSA9IGdldFJvb3RFbGVtZW50TmFtZSh1cmkudG9TdHJpbmcoKSk7CisgICAgICAKKyAgICAgIGlmIChyb290RWxlbWVudE5hbWUgIT0gbnVsbCkKKyAgICAgIHsKKyAgICAgICAgVVJJIHJlc291cmNlVVJJID0gbnVsbDsKKworICAgICAgICBpZiAoWFNEQ29uc3RhbnRzLlNDSEVNQV9FTEVNRU5UX1RBRy5lcXVhbHMocm9vdEVsZW1lbnROYW1lKSkKKyAgICAgICAgeworICAgICAgICAgIHJlc291cmNlVVJJID0gWFNEX1VSSTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChXU0RMQ29uc3RhbnRzLkRFRklOSVRJT05fRUxFTUVOVF9UQUcuZXF1YWxzKHJvb3RFbGVtZW50TmFtZSkpCisgICAgICAgIHsKKyAgICAgICAgICByZXNvdXJjZVVSSSA9IFdTRExfVVJJOworICAgICAgICB9CisgICAgICAgIAorICAgICAgICBpZiAocmVzb3VyY2VVUkkgIT0gbnVsbCkKKyAgICAgICAgeworICAgICAgICAgIHJlc291cmNlID0gcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UocmVzb3VyY2VVUkkpOworICAgICAgICAgIHJlc291cmNlLnNldFVSSSh1cmkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXNvdXJjZTsKKyAgfQogfSAvL0ltcG9ydEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9NZXNzYWdlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VJbXBsLmphdmEKaW5kZXggZmE2MTU3MS4uZjAyODc2ZSAxMDA2NDQKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VJbXBsLmphdmEKKysrIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL01lc3NhZ2VJbXBsLmphdmEKQEAgLTMxLDYgKzMxLDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FT2JqZWN0Q29udGFpbm1lbnRFTGlzdDsKIGltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuTWVzc2FnZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5QYXJ0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLldTRExQYWNrYWdlOwpAQCAtNDMxLDEzICs0MzIsMjggQEAKIAogICBwcm90ZWN0ZWQgdm9pZCByZW1vdmUoT2JqZWN0IGNvbXBvbmVudCwgT2JqZWN0IG1vZGVsT2JqZWN0KQogICB7CisgICAgTGlzdCBsaXN0ID0gZ2V0TGlzdChjb21wb25lbnQsIG1vZGVsT2JqZWN0KTsKKyAgICBpZiAobGlzdCAhPSBudWxsKQorICAgIHsKKyAgICAgIGxpc3QucmVtb3ZlKG1vZGVsT2JqZWN0KTsKKyAgICB9ICAgIAorICB9CisgIAorICBwcml2YXRlIExpc3QgZ2V0TGlzdChPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCisgIHsKKyAgICBMaXN0IHJlc3VsdCA9IG51bGw7CiAgICAgTWVzc2FnZSBtZXNzYWdlID0gKE1lc3NhZ2UpY29tcG9uZW50OwogICAgIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIFBhcnQpCiAgICAgewotICAgICAgbWVzc2FnZS5nZXRFUGFydHMoKS5yZW1vdmUobW9kZWxPYmplY3QpOwotICAgICAgLy8gICAgICBtZXNzYWdlLmdldEVQYXJ0cygpLmNsZWFyKCk7CisgICAgICByZXN1bHQgPSBtZXNzYWdlLmdldEVQYXJ0cygpOwogICAgIH0KLSAgfQorICAgIGVsc2UgaWYgKG1vZGVsT2JqZWN0IGluc3RhbmNlb2YgRXh0ZW5zaWJpbGl0eUVsZW1lbnQpCisgICAgeworICAgICAgcmVzdWx0ID0gZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7CisgICAgfQorICAgIAorICAgIHJldHVybiByZXN1bHQ7CisgIH0gIAogCiAgIC8vCiAgIC8vIEZvciByZWNvbmNpbGlhdGlvbjogTW9kZWwgLT4gRE9NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvTWVzc2FnZVJlZmVyZW5jZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9NZXNzYWdlUmVmZXJlbmNlSW1wbC5qYXZhCmluZGV4IDA2OWIwZWYuLjFkNDAwYmIgMTAwNjQ0Ci0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9NZXNzYWdlUmVmZXJlbmNlSW1wbC5qYXZhCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9NZXNzYWdlUmVmZXJlbmNlSW1wbC5qYXZhCkBAIC0yNjcsMTAgKzI2Nyw2IEBACiAgICAgc3VwZXIuaGFuZGxlVW5yZWNvbmNpbGVkRWxlbWVudChjaGlsZCwgcmVtYWluaW5nTW9kZWxPYmplY3RzKTsKICAgfQogCi0gIHByb3RlY3RlZCB2b2lkIGhhbmRsZVJlY29uY2lsaWF0aW9uKENvbGxlY3Rpb24gcmVtYWluaW5nTW9kZWxPYmplY3RzKQotICB7Ci0gIH0KLQogICAvLwogICAvLyBGb3IgcmVjb25jaWxpYXRpb246IE1vZGVsIC0+IERPTQogICAvLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL09wZXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9PcGVyYXRpb25JbXBsLmphdmEKaW5kZXggMDhhZmIyYS4uOWJhOGIzMiAxMDA2NDQKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL09wZXJhdGlvbkltcGwuamF2YQorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvT3BlcmF0aW9uSW1wbC5qYXZhCkBAIC0zMyw2ICszMyw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFJlc29sdmluZ0VMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5GYXVsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5JbnB1dDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247CkBAIC05MTMsNiArOTE0LDEwIEBACiAgICAgewogICAgICAgb3BlcmF0aW9uLmdldEVGYXVsdHMoKS5yZW1vdmUobW9kZWxPYmplY3QpOwogICAgIH0KKyAgICBlbHNlIGlmIChtb2RlbE9iamVjdCBpbnN0YW5jZW9mIEV4dGVuc2liaWxpdHlFbGVtZW50KSAKKyAgICB7CisgICAgICBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKS5yZW1vdmUobW9kZWxPYmplY3QpOworICAgIH0KICAgfQogCiAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGVsT2JqZWN0cyhPYmplY3QgY29tcG9uZW50KQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BvcnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUG9ydEltcGwuamF2YQppbmRleCBlOWJlOTY1Li4wMTVlYjYyIDEwMDY0NAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUG9ydEltcGwuamF2YQorKysgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUG9ydEltcGwuamF2YQpAQCAtMjk4LDE0ICsyOTgsNiBAQAogICAgIHN1cGVyLmhhbmRsZVVucmVjb25jaWxlZEVsZW1lbnQoY2hpbGQsIHJlbWFpbmluZ01vZGVsT2JqZWN0cyk7CiAgIH0KIAotICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpLnJlbW92ZShpLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KICAgcHVibGljIENvbGxlY3Rpb24gZ2V0TW9kZWxPYmplY3RzKE9iamVjdCBjb21wb25lbnQpCiAgIHsKICAgICBQb3J0IHBvcnQgPSAoUG9ydCljb21wb25lbnQ7CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUG9ydFR5cGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvUG9ydFR5cGVJbXBsLmphdmEKaW5kZXggZjk0ODRkZC4uNjgwNWJhYyAxMDA2NDQKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1BvcnRUeXBlSW1wbC5qYXZhCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9Qb3J0VHlwZUltcGwuamF2YQpAQCAtMjgsNiArMjgsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudEVMaXN0OwogaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRGVmaW5pdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5FeHRlbnNpYmlsaXR5RWxlbWVudDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5PcGVyYXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7CkBAIC00NTgsNiArNDU5LDExIEBACiAgICAgewogICAgICAgcmVzdWx0ID0gcG9ydFR5cGUuZ2V0RU9wZXJhdGlvbnMoKTsKICAgICB9CisgICAgZWxzZSBpZiAobW9kZWxPYmplY3QgaW5zdGFuY2VvZiBFeHRlbnNpYmlsaXR5RWxlbWVudCkKKyAgICB7CisgICAgICByZXN1bHQgPSBnZXRFeHRlbnNpYmlsaXR5RWxlbWVudHMoKTsKKyAgICB9CisgICAgCiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvVHlwZXNJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC53c2RsL3NyYy13c2RsL29yZy9lY2xpcHNlL3dzdC93c2RsL2ludGVybmFsL2ltcGwvVHlwZXNJbXBsLmphdmEKaW5kZXggMTUwZmEzZi4uZmVlYWQyYiAxMDA2NDQKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Qud3NkbC9zcmMtd3NkbC9vcmcvZWNsaXBzZS93c3Qvd3NkbC9pbnRlcm5hbC9pbXBsL1R5cGVzSW1wbC5qYXZhCisrKyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LndzZGwvc3JjLXdzZGwvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvaW50ZXJuYWwvaW1wbC9UeXBlc0ltcGwuamF2YQpAQCAtMTcwLDIwICsxNzAsMTAgQEAKIAogICBwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZWNvbmNpbGlhdGlvbihDb2xsZWN0aW9uIHJlbWFpbmluZ01vZGVsT2JqZWN0cykKICAgewotICAgIGZvciAoSXRlcmF0b3IgaSA9IHJlbWFpbmluZ01vZGVsT2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgcmVtb3ZlKHRoaXMsIGkubmV4dCgpKTsKLSAgICB9CisgICAgc3VwZXIuaGFuZGxlUmVjb25jaWxpYXRpb24ocmVtYWluaW5nTW9kZWxPYmplY3RzKTsKICAgICAoKERlZmluaXRpb25JbXBsKWdldEVuY2xvc2luZ0RlZmluaXRpb24oKSkucmVjb25jaWxlUmVmZXJlbmNlcyh0cnVlKTsKICAgfQogCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZShPYmplY3QgY29tcG9uZW50LCBPYmplY3QgbW9kZWxPYmplY3QpCi0gIHsKLSAgICBUeXBlcyB0eXBlcyA9IChUeXBlcyljb21wb25lbnQ7Ci0gICAgTGlzdCBsaXN0ID0gdHlwZXMuZ2V0RUV4dGVuc2liaWxpdHlFbGVtZW50cygpOwotICAgIGxpc3QucmVtb3ZlKG1vZGVsT2JqZWN0KTsKLSAgfQotCiAgIHB1YmxpYyBDb2xsZWN0aW9uIGdldE1vZGVsT2JqZWN0cyhPYmplY3QgY29tcG9uZW50KQogICB7CiAgICAgVHlwZXMgdHlwZXMgPSAoVHlwZXMpY29tcG9uZW50OwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggY2VlMTg3OS4uZTNlNGMzNiAxMDA2NDQKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NfY29yZS5mZWF0dXJlIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjMuMS4yLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3Nfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3Nfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggOGM5NGM0Zi4uYzFjZDlmYSAxMDA2NDQKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c19zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApAQCAtMiw3ICsyLDcgQEAKIDxmZWF0dXJlCiAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndzX3Nkay5mZWF0dXJlIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjMuMS4yLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud3NfdGVzdHMuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c190ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCmluZGV4IDAzZWM3NjYuLjQ0ZWYxMTMgMTAwNjQ0Ci0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c190ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c190ZXN0cy5mZWF0dXJlL2ZlYXR1cmUueG1sCkBAIC0yLDcgKzIsNyBAQAogPGZlYXR1cmUKICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud3NfdGVzdHMuZmVhdHVyZSIKICAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIzLjAuMjAxLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjMuMC4zMDIucXVhbGlmaWVyIgogICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+CiAKICAgIDxkZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKaW5kZXggMGM1MDdkZC4uMGNjYTM1NSAxMDA2NDQKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndzX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKQEAgLTIsNyArMiw3IEBACiA8ZmVhdHVyZQogICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53c191aS5mZWF0dXJlIgogICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjMuMS4wLnF1YWxpZmllciIKKyAgICAgIHZlcnNpb249IjMuMS4yLnF1YWxpZmllciIKICAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgogCiAgICA8ZGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC8uY2xhc3NwYXRoIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcyZWUyOS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS41Ii8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0Ly5wcm9qZWN0IGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2UxYTQuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTU2YTNhLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdDtzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMAotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QuU2VydmljZVBvbGljeXRUZXN0QWN0aXZhdG9yCi1CdW5kbGUtVmVuZG9yOiAlUExVR0lOX1BST1ZJREVSCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUsCi0gb3JnLmp1bml0NCwKLSBvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3ksCi0gb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnVpLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLndzdC53cywKLSBvcmcuZWNsaXBzZS5jb3JlLmV4cHJlc3Npb25zLAotIG9yZy5lY2xpcHNlLnVpCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQotQnVuZGxlLVJlcXVpcmVkRXhlY3V0aW9uRW52aXJvbm1lbnQ6IEoyU0UtMS41CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC9hYm91dC5odG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVhZmI2My4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDg8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZjQzYzcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLXNvdXJjZS4uID0gc3JjLwotb3V0cHV0Li4gPSBiaW4vCi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLXNyYy5pbmNsdWRlcyA9IE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHNyYy8KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L3BsdWdpbi5wcm9wZXJ0aWVzIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZjI5MGUuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSMgLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgMjAwNzEwMjQgICAxOTY5OTcgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jCi0jIE1lc3NhZ2VzIGluIHBsdWdpbi54bWwuCi0jCi1QTFVHSU5fTkFNRT1TZXJ2aWNlIHBvbGljeQotUExVR0lOX1BST1ZJREVSPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUyMTgzYS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci0KLTxwbHVnaW4+Ci0gIAotICA8IS0tIFdlIG5lZWQgdGhpcyBwbHVnaW4gdG8gYmUgbG9hZGVkIGF0IHN0YXJ0dXAgdGltZSBzbyB0aGF0IHRoZQotICAgICAgIFNlcnZpY2VQb2xpY3lQcm9wZXJ0eVRlc3RlciBjbGFzcyB3aWxsIGFsd2F5cyBiZSBsb2FkZWQuICBJZiB0aGlzIGlzCi0gICAgICAgbm90IGRvbmUgdGhlbiB0aGUgU2VydmljZSBQb2xpY3kgcHJvamVjdCBwcm9wZXJ0eSBwYWdlIHdpbGwgYXBwZWFyCi0gICAgICAgb24gYWxsIHByb2plY3QgcHJvcGVydHkgcGFnZXMgdW50aWwgdGhlIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQuIAotICAgICAgIC0tPgotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5zdGFydHVwIi8+Ci0gIAotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5leHByZXNzaW9ucy5wcm9wZXJ0eVRlc3RlcnMiPgotICAgIDxwcm9wZXJ0eVRlc3RlcgotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0LnNlcnZpY2Uud3Muc2VydmljZS5wb2xpY3kuZm9vIgotICAgICAgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiCi0gICAgICBuYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0LnNlcnZpY2Uud3Muc2VydmljZS5wb2xpY3kuZm9vIgotICAgICAgcHJvcGVydGllcz0icHJvamVjdEhhc0ZPT2ZpbGVzIgotICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0LmludGVybmFsLnByb3BlcnRpZXMuRk9PRmlsZVByb3BlcnR5VGVzdGVyIj4KLSAgICA8L3Byb3BlcnR5VGVzdGVyPgotIAk8L2V4dGVuc2lvbj4KLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS5zZXJ2aWNlcG9saWN5Ij4KLSAgICAgPHNlcnZpY2VQb2xpY3k+Ci0gICAgICA8ZW5hYmxlbWVudD4KLSAgICAgICAgIDx0ZXN0IHByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC5zZXJ2aWNlLndzLnNlcnZpY2UucG9saWN5LmZvby5wcm9qZWN0SGFzRk9PZmlsZXMiLz4KLSAgICAgICA8L2VuYWJsZW1lbnQ+IAotICAgICAgIDxwb2xpY3kgcGFyZW50UG9saWN5SWQ9InNvbWVwYXJlbnQiIGlkPSJpZDEiIGVudW1MaXN0SWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2aWNlLnBvbGljeS5lcnJvcldhcm5FbnVtIiBtdXRhYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxkZXNjcmlwdG9yIHNob3J0TmFtZT0iaWQxIHNob3J0TmFtZSIgZGVzY3JpcHRpb249ImlkMSBkZXNjcmlwdGlvbiIvPgotICAgICAgICAgPHJlbGF0aW9uc2hpcCBlbnVtTGlzdD0ib3JnLmVjbGlwc2Uud3N0Lndhcm4gb3JnLmVjbGlwc2Uud3N0LmVycm9yIj4KLSAgICAgICAgICAgPHRhcmdldFBvbGljeSBpZD0iaWQyIgotICAgICAgICAgICAgICAgICAgIGl0ZW1MaXN0PSJvcmcuZWNsaXBzZS53c3Qud2FybiBvcmcuZWNsaXBzZS53c3QuZXJyb3IiLz4KLSAgICAgICAgICAgPHRhcmdldFBvbGljeSBpZD0iaWQzIgotICAgICAgICAgICAgICAgICAgIGl0ZW1MaXN0PSJvcmcuZWNsaXBzZS53c3Qud2FybiIvPgotICAgICAgICAgICA8dGFyZ2V0UG9saWN5IGlkPSJpZDQiCi0gICAgICAgICAgICAgICAgICAgaXRlbUxpc3Q9Im9yZy5lY2xpcHNlLndzdC5lcnJvciIvPgotICAgICAgICAgICA8dGFyZ2V0UG9saWN5IGlkPSJpZDIyIgotICAgICAgICAgICAgICAgICAgIGl0ZW1MaXN0PSJvcmcuZWNsaXBzZS53c3Qud2FybjIgb3JnLmVjbGlwc2Uud3N0LmVycm9yMiIvPgotICAJCQk8dGFyZ2V0UG9saWN5IGlkPSJpZF9ib29sZWFuMiIKLSAgICAgICAgICAgICAgICAgICBpdGVtTGlzdD0ib3JnLmVjbGlwc2Uud3N0LmZhbHNlIi8+ICAKLSAgICAgICAgIDwvcmVsYXRpb25zaGlwPgotICAgICAgICAgCi0gICAgICAgICA8cmVsYXRpb25zaGlwIGVudW1MaXN0PSJvcmcuZWNsaXBzZS53c3QuaWdub3JlIj4KLSAgICAgICAgICAgPHRhcmdldFBvbGljeSBpZD0iaWQzIgotICAgICAgICAgICAgICAgICAgIGl0ZW1MaXN0PSJvcmcuZWNsaXBzZS53c3Qud2FybiBvcmcuZWNsaXBzZS53c3QuZXJyb3IiLz4KLSAgICAgICAgIDwvcmVsYXRpb25zaGlwPgotICAgICAgIDwvcG9saWN5PgotICAgICAgIAotICAgICAgIDxwb2xpY3kgaWQ9InNvbWVwYXJlbnQiPgotICAgICAgICAgPGRlc2NyaXB0b3IgbG9uZ05hbWU9InBhcmVudCBsb25nbmFtZSIgLz4KLSAgICAgICA8L3BvbGljeT4KLSAgICAgICAKLSAgICAgICA8cG9saWN5IGlkPSJpZDIiIHBhcmVudFBvbGljeUlkPSJzb21lcGFyZW50IiAKLSAgICAgICAgICAgICAgICAgICAgICAgIGVudW1MaXN0SWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2aWNlLnBvbGljeS5lcnJvcldhcm5FbnVtIgotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEVudW1JZD0ib3JnLmVjbGlwc2Uud3N0Lndhcm4iCi0gICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlPSJ0cnVlIj4KLSAgICAgICAgIDxkZXNjcmlwdG9yIHNob3J0TmFtZT0iaWQyIHNob3J0bmFtZSIgY29udGV4dEhlbHBJZD0ic29tZWNvbnRleHRpZC5BMDAxIi8+Ci0gICAgICAgICA8c3RhdGUga2V5PSJpZDJfa2V5IiB2YWx1ZT0iaWQyX3ZhbHVlIiAvPgotICAgICAgIDwvcG9saWN5PgotICAgICAgIAotICAgICAgIDxwb2xpY3kgaWQ9ImlkMyIgcGFyZW50UG9saWN5SWQ9ImlkMiIgCi0gICAgICAgCQkJCQllbnVtTGlzdElkPSJvcmcuZWNsaXBzZS53c3Quc2VydmljZS5wb2xpY3kuZXJyb3JXYXJuRW51bSIKLSAgICAgICAJCQkJCWRlZmF1bHRFbnVtSWQ9Im9yZy5lY2xpcHNlLndzdC5lcnJvciI+Ci0gICAgICAgICA8ZGVzY3JpcHRvciBzaG9ydE5hbWU9ImlkMyBzaG9ydCBuYW1lIi8+Ci0gICAgICAgPC9wb2xpY3k+Ci0gICAgICAgPHBvbGljeSBpZD0iaWQ1IiBwYXJlbnRQb2xpY3lJZD0iaWQzIiAKLSAgICAgICAJCQkJCWVudW1MaXN0SWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2aWNlLnBvbGljeS5lcnJvcldhcm5FbnVtIgotICAgICAgIAkJCQkJZGVmYXVsdEVudW1JZD0ib3JnLmVjbGlwc2Uud3N0LmVycm9yIj4KLSAgICAgICAgIDxkZXNjcmlwdG9yIHNob3J0TmFtZT0iaWQ1IHNob3J0IG5hbWUiLz4KLSAgICAgICAgIDxyZWxhdGlvbnNoaXAgZW51bUxpc3Q9Im9yZy5lY2xpcHNlLndzdC53YXJuIj4KLSAgICAgICAgICAgPHRhcmdldFBvbGljeSBpZD0iaWQyIiAKLSAgICAgICAgICAgICAgICAgICBpdGVtTGlzdD0ib3JnLmVjbGlwc2Uud3N0Lmlnbm9yZSIvPgotICAgICAgICAgPC9yZWxhdGlvbnNoaXA+ICAKLSAgICAgICA8L3BvbGljeT4KLSAgICAgICA8cG9saWN5IGlkPSJpZDYiIHBhcmVudFBvbGljeUlkPSJpZDUiIAotICAgICAgIAkJCQkJZW51bUxpc3RJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZpY2UucG9saWN5LmVycm9yV2FybkVudW0iCi0gICAgICAgCQkJCQlkZWZhdWx0RW51bUlkPSJvcmcuZWNsaXBzZS53c3QuZXJyb3IiPgotICAgICAgICAgPGRlc2NyaXB0b3Igc2hvcnROYW1lPSJpZDYgc2hvcnQgbmFtZSIvPgotICAgICAgIDwvcG9saWN5PgotCi0gICAgICAgPHBvbGljeSBpZD0iaWQxMCIgcGFyZW50UG9saWN5SWQ9ImlkMjIiIAotICAgICAgIAkJCQkJZW51bUxpc3RJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZpY2UucG9saWN5LmVycm9yV2FybkVudW0iCi0gICAgICAgCQkJCQlkZWZhdWx0RW51bUlkPSJvcmcuZWNsaXBzZS53c3QuZXJyb3IiPgotICAgICAgICAgPGRlc2NyaXB0b3Igc2hvcnROYW1lPSJpZDEwIHNob3J0IG5hbWUiLz4KLSAgICAgICA8L3BvbGljeT4KLSAgICAgICA8cG9saWN5IGlkPSJpZDExIiBwYXJlbnRQb2xpY3lJZD0iaWQxMCIgCi0gICAgICAgCQkJCQllbnVtTGlzdElkPSJvcmcuZWNsaXBzZS53c3Quc2VydmljZS5wb2xpY3kuZXJyb3JXYXJuRW51bSIKLSAgICAgICAJCQkJCWRlZmF1bHRFbnVtSWQ9Im9yZy5lY2xpcHNlLndzdC5lcnJvciI+Ci0gICAgICAgICA8ZGVzY3JpcHRvciBzaG9ydE5hbWU9ImlkMTEgc2hvcnQgbmFtZSIvPgotICAgICAgICAgPHJlbGF0aW9uc2hpcCBlbnVtTGlzdD0ib3JnLmVjbGlwc2Uud3N0Lndhcm4iPgotICAgICAgICAgICA8dGFyZ2V0UG9saWN5IGlkPSJpZDIiIAotICAgICAgICAgICAgICAgICAgIGl0ZW1MaXN0PSJvcmcuZWNsaXBzZS53c3QuaWdub3JlIi8+Ci0gICAgICAgICA8L3JlbGF0aW9uc2hpcD4gIAotICAgICAgIDwvcG9saWN5PgotICAgICAgIDxwb2xpY3kgaWQ9ImlkMTIiIHBhcmVudFBvbGljeUlkPSJpZDExIiAKLSAgICAgICAJCQkJCWVudW1MaXN0SWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2aWNlLnBvbGljeS5lcnJvcldhcm5FbnVtIgotICAgICAgIAkJCQkJZGVmYXVsdEVudW1JZD0ib3JnLmVjbGlwc2Uud3N0LmVycm9yIj4KLSAgICAgICAgIDxkZXNjcmlwdG9yIHNob3J0TmFtZT0iaWQxMiBzaG9ydCBuYW1lIi8+Ci0gICAgICAgPC9wb2xpY3k+Ci0gICAgICAgCi0gICAgICAgPHBvbGljeSBpZD0iaWQ3IiBwYXJlbnRQb2xpY3lJZD0iaWQyIiAKLSAgICAgICAJCQkJCWVudW1MaXN0SWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2aWNlLnBvbGljeS5lcnJvcldhcm5FbnVtIgotICAgICAgIAkJCQkJZGVmYXVsdEVudW1JZD0ib3JnLmVjbGlwc2Uud3N0LmVycm9yIj4KLSAgICAgICAgIDxkZXNjcmlwdG9yIHNob3J0TmFtZT0iaWQ3IHNob3J0IG5hbWUiLz4KLSAgICAgICA8L3BvbGljeT4KLSAgICAgICA8cG9saWN5IGlkPSJpZDgiIHBhcmVudFBvbGljeUlkPSJpZDciIAotICAgICAgIAkJCQkJZW51bUxpc3RJZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZpY2UucG9saWN5LmVycm9yV2FybkVudW0iCi0gICAgICAgCQkJCQlkZWZhdWx0RW51bUlkPSJvcmcuZWNsaXBzZS53c3QuZXJyb3IiPgotICAgICAgICAgPGRlc2NyaXB0b3Igc2hvcnROYW1lPSJpZDggc2hvcnQgbmFtZSIvPgotICAgICAgIDwvcG9saWN5PgotICAgICAgIDxwb2xpY3kgaWQ9ImlkOSIgcGFyZW50UG9saWN5SWQ9ImlkOCIgCi0gICAgICAgCQkJCQllbnVtTGlzdElkPSJvcmcuZWNsaXBzZS53c3Quc2VydmljZS5wb2xpY3kuZXJyb3JXYXJuRW51bSIKLSAgICAgICAJCQkJCWRlZmF1bHRFbnVtSWQ9Im9yZy5lY2xpcHNlLndzdC5lcnJvciI+Ci0gICAgICAgICA8ZGVzY3JpcHRvciBzaG9ydE5hbWU9ImlkOSBzaG9ydCBuYW1lIi8+Ci0gICAgICAgICA8cmVsYXRpb25zaGlwIGVudW1MaXN0PSJvcmcuZWNsaXBzZS53c3Qud2FybiI+Ci0gICAgICAgICAgIDx0YXJnZXRQb2xpY3kgaWQ9ImlkMiIgCi0gICAgICAgICAgICAgICAgICAgaXRlbUxpc3Q9Im9yZy5lY2xpcHNlLndzdC5pZ25vcmUiLz4KLSAgICAgICAgIDwvcmVsYXRpb25zaGlwPiAgCi0gICAgICAgPC9wb2xpY3k+Ci0gICAgICAgCi0gICAgICAgPHBvbGljeSBpZD0iaWQ0IiBlbnVtTGlzdElkPSJvcmcuZWNsaXBzZS53c3Quc2VydmljZS5wb2xpY3kuZXJyb3JXYXJuRW51bSI+Ci0gICAgICAgICA8ZGVzY3JpcHRvciBzaG9ydE5hbWU9ImlkNCBzaG9ydCBuYW1lIiBsb25nTmFtZT0iaWQ0IGxvbmcgbmFtZSIgLz4KLSAgICAgICA8L3BvbGljeT4KLSAgICAgICAKLSAgICAgICA8cG9saWN5IGlkPSJpZDIyIiBwYXJlbnRQb2xpY3lJZD0ic29tZXBhcmVudCIgCi0gICAgICAgICAgICAgICAgICAgICAgICBlbnVtTGlzdElkPSJvcmcuZWNsaXBzZS53c3Quc2VydmljZS5wb2xpY3kuZXJyb3JXYXJuRW51bTIiCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0RW51bUlkPSJvcmcuZWNsaXBzZS53c3Qud2FybjIiPgotICAgICAgICAgPGRlc2NyaXB0b3Igc2hvcnROYW1lPSJpZDIyIHNob3J0bmFtZSIgY29udGV4dEhlbHBJZD0ic29tZWNvbnRleHRpZC5BMDAxIi8+Ci0gICAgICAgPC9wb2xpY3k+Ci0gICAgICAgCi0gICAgICAgPHBvbGljeSBpZD0iaWRfYm9vbGVhbjEiIGVudW1MaXN0SWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2aWNlLnBvbGljeS5ib29sZWFuRW51bSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdEVudW1JZD0ib3JnLmVjbGlwc2Uud3N0LnRydWUiPgotICAgICAgICAgPGRlc2NyaXB0b3Igc2hvcnROYW1lPSJib29sZWFuMSBzaG9ydCBuYW1lIiBsb25nTmFtZT0iYm9vbGVhbjEgbG9uZyBuYW1lIiAvPgotICAgICAgIDwvcG9saWN5PgotICAgICAgIAotICAgICAgIDxwb2xpY3kgaWQ9ImlkX2Jvb2xlYW4yIiBlbnVtTGlzdElkPSJvcmcuZWNsaXBzZS53c3Quc2VydmljZS5wb2xpY3kuYm9vbGVhbkVudW0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRFbnVtSWQ9Im9yZy5lY2xpcHNlLndzdC50cnVlIj4KLSAgICAgICAgIDxkZXNjcmlwdG9yIHNob3J0TmFtZT0iYm9vbGVhbjIgc2hvcnQgbmFtZSIgbG9uZ05hbWU9ImJvb2xlYW4yIGxvbmcgbmFtZSIgLz4KLSAgICAgICA8L3BvbGljeT4KLSAgICAgICA8ZW51bWVyYXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2aWNlLnBvbGljeS5lcnJvcldhcm5FbnVtMiIgCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Im9yZy5lY2xpcHNlLndzdC5pZ25vcmUyIj4KLSAgICAgICAgIDxpdGVtIGlkPSJvcmcuZWNsaXBzZS53c3QuaWdub3JlMiIKLSAgICAgICAgICAgICAgIHNob3J0TmFtZT0iSUdOT1JFIFNIT1JUTkFNRTIiIGxvbmdOYW1lPSJJR05PUkUgTE9OR05BTUUyIiAvPgotICAgICAgICAgPGl0ZW0gaWQ9Im9yZy5lY2xpcHNlLndzdC53YXJuMiIKLSAgICAgICAgICAgICAgIHNob3J0TmFtZT0iV0FSTiBTSE9SVE5BTUUyIiBsb25nTmFtZT0iV0FSTiBMT05HTkFNRTIiIC8+Ci0gICAgICAgICA8aXRlbSBpZD0ib3JnLmVjbGlwc2Uud3N0LmVycm9yMiIKLSAgICAgICAgICAgICAgIHNob3J0TmFtZT0iRVJST1IgU0hPUlROQU1FMiIgbG9uZ05hbWU9IkVSUk9SIExPTkdOQU1FMiIgLz4KLSAgICAgICA8L2VudW1lcmF0aW9uPiAKLSAgICAgICAKLSAgICAgPC9zZXJ2aWNlUG9saWN5PiAgICAgIAotICAgPC9leHRlbnNpb24+Ci0gICAKLSAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS51aS5zZXJ2aWNlcG9saWN5dWkiPgotICAgICA8c2VydmljZVBvbGljeVVJPiAKLSAgICAgICA8b3BlcmF0aW9uIGlkPSJzZXJ2aWNlLnVpLm9wZXJhdGlvbjEiIGRlZmF1bHRkYXRhPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgIHBvbGljeVBhdHRlcm49ImlkM3xpZDIiID4KLSAgICAgICAgIDxkZXNjcmlwdG9yIHNob3J0TmFtZT0iVUkgcG9saWN5MSBzaG9ydCBuYW1lIiBsb25nTmFtZT0iVUkgcG9saWN5MSBsb25nIG5hbWUiIC8+Ci0gICAgICAgICA8ZW51bWVyYXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2aWNlLnBvbGljeS5lcnJvcldhcm5FbnVtIi8+Ci0gICAgICAgICA8ZW5hYmxlZCBtdWx0aXNlbGVjdD0idHJ1ZSIvPgotICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgIAotICAgICAgIDxvcGVyYXRpb24gaWQ9InNlcnZpY2UudWkub3BlcmF0aW9uMiIgZGVmYXVsdGRhdGE9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgcG9saWN5UGF0dGVybj0iaWRcZC4qIiA+Ci0gICAgICAgICA8ZGVzY3JpcHRvciBzaG9ydE5hbWU9IlVJIHBvbGljeTIgc2hvcnQgbmFtZSIgbG9uZ05hbWU9IlVJIHBvbGljeTIgbG9uZyBuYW1lIiAvPgotICAgICAgICAgPGVudW1lcmF0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmljZS5wb2xpY3kuZXJyb3JXYXJuRW51bSIvPgotICAgICAgICAgPGVuYWJsZWQgbXVsdGlzZWxlY3Q9ImZhbHNlIi8+Ci0gICAgICAgPC9vcGVyYXRpb24+IAotICAgICAgIAotICAgICAgIDxvcGVyYXRpb24gaWQ9InNlcnZpY2UudWkub3BlcmF0aW9uMyIgZGVmYXVsdGRhdGE9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICAgIHBvbGljeVBhdHRlcm49ImlkNCIgPgotICAgICAgICAgPGRlc2NyaXB0b3Igc2hvcnROYW1lPSJVSSBwb2xpY3kzIHNob3J0IG5hbWUiIGxvbmdOYW1lPSJVSSBwb2xpY3kzIGxvbmcgbmFtZSIgLz4KLSAgICAgICAgIDxlbnVtZXJhdGlvbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnNlcnZpY2UucG9saWN5LmVycm9yV2FybkVudW0iLz4KLSAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAKLSAgICAgICA8b3BlcmF0aW9uIGlkPSJzZXJ2aWNlLnVpLm9wZXJhdGlvbjQiIGRlZmF1bHRkYXRhPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgIHBvbGljeVBhdHRlcm49ImlkMXxpZDJ8aWQzIiA+Ci0gICAgICAgICA8ZGVzY3JpcHRvciBzaG9ydE5hbWU9IlVJIHBvbGljeTQgc2hvcnQgbmFtZSIgbG9uZ05hbWU9IlVJIHBvbGljeTQgbG9uZyBuYW1lIiAvPgotICAgICAgICAgPGVudW1lcmF0aW9uIGlkPSJvcmcuZWNsaXBzZS53c3Quc2VydmljZS5wb2xpY3kuZXJyb3JXYXJuRW51bSIvPgotICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAKLSAgICAgICA8b3BlcmF0aW9uIGlkPSJzZXJ2aWNlLnVpLm9wZXJhdGlvbjUiIGRlZmF1bHRkYXRhPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lQYXR0ZXJuPSJpZDIyIiB3b3Jrc3BhY2VPbmx5PSJ0cnVlIj4KLSAgICAgICAgIDxkZXNjcmlwdG9yIHNob3J0TmFtZT0iVUkgcG9saWN5NSBzaG9ydCBuYW1lIiBsb25nTmFtZT0iVUkgcG9saWN5NSBsb25nIG5hbWUiIC8+Ci0gICAgICAgICA8ZW51bWVyYXRpb24gaWQ9Im9yZy5lY2xpcHNlLndzdC5zZXJ2aWNlLnBvbGljeS5lcnJvcldhcm5FbnVtMiIvPgotICAgICAgIDwvb3BlcmF0aW9uPiAgICAgIAotICAgICAgIDxvcGVyYXRpb24gaWQ9InNlcnZpY2UudWkuYm9vbGVhbi5vcGVyYXRpb24xIiBkZWZhdWx0ZGF0YT0iZmFsc2UiCi0gICAgICAgICAgICAgICAgICAgICAgcG9saWN5UGF0dGVybj0iaWRfYm9vbC4qIiB3b3Jrc3BhY2VPbmx5PSJ0cnVlIj4KLSAgICAgICAgIDxkZXNjcmlwdG9yIHNob3J0TmFtZT0iVUkgcG9saWN5MmIgYm9vbCBzaG9ydCBuYW1lIiBsb25nTmFtZT0iVUkgcG9saWN5MmIgYm9vbCBsb25nIG5hbWUiIC8+Ci0gICAgICAgICA8c2VsZWN0aW9uLz4KLSAgICAgICA8L29wZXJhdGlvbj4KLSAgICAgICAKLSAgICAgICA8b3BlcmF0aW9uIGlkPSJzZXJ2aWNlLnVpLmJvb2xlYW4ub3BlcmF0aW9uMiIgZGVmYXVsdGRhdGE9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgcG9saWN5UGF0dGVybj0iaWRfYm9vbGVhbjIiID4KLSAgICAgICAgIDxkZXNjcmlwdG9yIHNob3J0TmFtZT0iVUkgcG9saWN5MyBib29sIHNob3J0IG5hbWUiIGxvbmdOYW1lPSJVSSBwb2xpY3kzIGJvb2wgbG9uZyBuYW1lIiAvPgotICAgICAgICAgPHNlbGVjdGlvbiBpY29uPSJ0cnVlIi8+Ci0gICAgICAgPC9vcGVyYXRpb24+Ci0gICAgICAgCi0gICAgICAgPG9wZXJhdGlvbiBpZD0ic2VydmljZS51aS5jb21wbGV4Lm9wZXJhdGlvbjEiIGRlZmF1bHRkYXRhPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lQYXR0ZXJuPSJzb21lcGFyZW50fCBpZDQiID4KLSAgICAgICAgIDxkZXNjcmlwdG9yIHNob3J0TmFtZT0iVUkgcG9saWN5NCBzaG9ydCBuYW1lIiBsb25nTmFtZT0iVUkgcG9saWN5NCBsb25nIG5hbWUiIC8+Ci0gICAgICAgICA8Y29tcGxleCBsYXVuY2hDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QuVGVzdExhdW5jaENsYXNzIi8+Ci0gICAgICAgICA8ZW5hYmxlZCBtdWx0aXNlbGVjdD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGVuYWJsZWRDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QuVGVzdEVuYWJsZWRDbGFzcyIvPgotICAgICAgIDwvb3BlcmF0aW9uPgotICAgICAgIAotICAgICAgIDxxdWlja0ZpeCBwbHVnaW5JZD0ib3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QiCi0gICAgICAgICAgICAgICAgIGNvZGU9IjEiPgotICAgICAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0LmFjdGlvbjEiPgotICAgICAgICAgICAgIDxkZXNjcmlwdG9yIHNob3J0TmFtZT0icXVpY2sgZml4IDEgZm9yIGNvZGUgMSIvPgotICAgICAgICAgIDwvYWN0aW9uPgotICAgICAgICAgIDxhY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0LmFjdGlvbjIiPgotICAgICAgICAgICAgIDxkZXNjcmlwdG9yIHNob3J0TmFtZT0icXVpY2sgZml4IDIgZm9yIGNvZGUgMSIvPgotICAgICAgICAgIDwvYWN0aW9uPgotICAgICAgIDwvcXVpY2tGaXg+Ci0gICAgICAgCi0gICAgICAgPHF1aWNrRml4IHBsdWdpbklkPSJvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdCIKLSAgICAgICAgICAgICAgICAgY29kZT0iMiI+Ci0gICAgICAgICAgPGFjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QuYWN0aW9uMyI+Ci0gICAgICAgICAgICAgPGRlc2NyaXB0b3Igc2hvcnROYW1lPSJxdWljayBmaXggMSBmb3IgY29kZSAyIi8+Ci0gICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgPC9xdWlja0ZpeD4KLSAgICAgPC9zZXJ2aWNlUG9saWN5VUk+Ci0gICA8L2V4dGVuc2lvbj4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3NlcnZpY2UvcG9saWN5L3Rlc3QvTWFpblRlc3Rlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3Qvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9zZXJ2aWNlL3BvbGljeS90ZXN0L01haW5UZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJiOTAzYi4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3NlcnZpY2UvcG9saWN5L3Rlc3QvTWFpblRlc3Rlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MTAyNCAgIDE5Njk5NyBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJlZmVyZW5jZXMuUGVyc2lzdGVudFdTSUFQQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3MuaW50ZXJuYWwucHJlZmVyZW5jZXMuUGVyc2lzdGVudFdTSUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLmludGVybmFsLnByZWZlcmVuY2VzLlBlcnNpc3RlbnRXU0lTU0JQQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kuSURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LklQb2xpY3lFbnVtZXJhdGlvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LklQb2xpY3lSZWxhdGlvbnNoaXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LklQb2xpY3lTdGF0ZUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LklTZXJ2aWNlUG9saWN5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS5JU3RhdGVFbnVtZXJhdGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LlNlcnZpY2VQb2xpY3lBY3RpdmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LlNlcnZpY2VQb2xpY3lQbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kubGlzdGVuZXJzLklQb2xpY3lDaGlsZENoYW5nZUxpc3RlbmVyOwotCi1AU3VwcHJlc3NXYXJuaW5ncygicmVzdHJpY3Rpb24iKSAvLyROT04tTkxTLTEkCi1wdWJsaWMgY2xhc3MgTWFpblRlc3RlciBleHRlbmRzIFRlc3RDYXNlCi17ICAKLSAgIAotICAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvbnMoKQotICAgewotICAgICBTZXJ2aWNlUG9saWN5UGxhdGZvcm0gcGxhdGZvcm0gICA9IFNlcnZpY2VQb2xpY3lQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpOwotICAgICBMaXN0PElTZXJ2aWNlUG9saWN5PiAgcG9saWN5TGlzdCA9IHBsYXRmb3JtLmdldFJvb3RTZXJ2aWNlUG9saWNpZXMoIG51bGwgKTsKLSAgICAgCi0gICAgIGZvciggSVNlcnZpY2VQb2xpY3kgcG9saWN5IDogcG9saWN5TGlzdCApCi0gICAgIHsKLSAgICAgICBkaXNwbGF5UG9saWN5Tm9kZSggcG9saWN5ICk7Ci0gICAgIH0gICAKLSAgICAgCi0gICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09IEVudW1lcmF0aW9uczoiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgCi0gICAgIExpc3Q8SVN0YXRlRW51bWVyYXRpb25JdGVtPiBlcnJvcldhcm5FbnVtID0gcGxhdGZvcm0uZ2V0U3RhdGVFbnVtZXJhdGlvbiggIm9yZy5lY2xpcHNlLndzdC5zZXJ2aWNlLnBvbGljeS5lcnJvcldhcm5FbnVtIiApOyAvLyROT04tTkxTLTEkCi0gICAgIAotICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJFbnVtIGlkOiAiICsgIm9yZy5lY2xpcHNlLndzdC5zZXJ2aWNlLnBvbGljeS5lcnJvcldhcm5FbnVtIiApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgCi0gICAgIGZvciggSVN0YXRlRW51bWVyYXRpb25JdGVtIGl0ZW0gOiBlcnJvcldhcm5FbnVtICkKLSAgICAgewotICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIiAgaWQ6ICIgKyBpdGVtLmdldElkKCkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIiAgc2hvcnRuYW1lOiAiICsgaXRlbS5nZXRTaG9ydE5hbWUoKSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiICBsb25nbmFtZTogIiArIGl0ZW0uZ2V0TG9uZ05hbWUoKSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiICBpc0RlZmF1bHQ6ICIgKyBpdGVtLmlzRGVmYXVsdCgpICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgfQotICAgfQotICAgCi0gICBwcml2YXRlIHZvaWQgZGlzcGxheVBvbGljeU5vZGUoIElTZXJ2aWNlUG9saWN5IHBvbGljeSApCi0gICB7Ci0gICAgIElTZXJ2aWNlUG9saWN5IHBhcmVudFBvbGljeSA9IHBvbGljeS5nZXRQYXJlbnRQb2xpY3koKTsKLSAgICAgSURlc2NyaXB0b3IgICAgIGRlc2NyaXB0b3IgICA9IHBvbGljeS5nZXREZXNjcmlwdG9yKCk7Ci0gICAgIAotICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJGb3VuZCBwb2xpY3k6ICIgKyBwb2xpY3kuZ2V0SWQoKSArICIgcGFyZW50aWQ6IiArIChwYXJlbnRQb2xpY3kgPT0gbnVsbCA/ICJudWxsIiA6IHBhcmVudFBvbGljeS5nZXRJZCgpKSApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAKLSAgICAgZm9yKCBJU2VydmljZVBvbGljeSBjaGlsZCA6IHBvbGljeS5nZXRDaGlsZHJlbigpICkKLSAgICAgewotICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIiAgY2hpbGQgaWQ6ICIgKyBjaGlsZC5nZXRJZCgpICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgfQotICAgICAKLSAgICAgTGlzdDxJUG9saWN5UmVsYXRpb25zaGlwPiByZWxhdGlvbnNoaXBzID0gcG9saWN5LmdldFJlbGF0aW9uc2hpcHMoKTsKLSAgICAgCi0gICAgIFN5c3RlbS5vdXQucHJpbnRsbiggICIgIHJlbGF0aW9uc2hpcHM6IiApOyAvLyROT04tTkxTLTEkCi0gICAgIAotICAgICBmb3IoIElQb2xpY3lSZWxhdGlvbnNoaXAgcmVsYXRpb25zaGlwIDogcmVsYXRpb25zaGlwcyApCi0gICAgIHsKLSAgICAgICBJUG9saWN5RW51bWVyYXRpb25MaXN0ICAgICAgIHNvdXJjZUxpc3QgICAgID0gcmVsYXRpb25zaGlwLmdldFBvbGljeUVudW1lcmF0aW9uTGlzdCgpOwotICAgICAgIExpc3Q8SVBvbGljeUVudW1lcmF0aW9uTGlzdD4gdGFyZ2V0TGlzdCAgICAgPSByZWxhdGlvbnNoaXAuZ2V0UmVsYXRlZFBvbGljaWVzKCk7Ci0gICAgICAgTGlzdDxJU3RhdGVFbnVtZXJhdGlvbkl0ZW0+ICBzb3VyY2VFbnVtTGlzdCA9IHNvdXJjZUxpc3QuZ2V0RW51bWVyYXRpb25MaXN0KCk7Ci0gICAgICAgCi0gICAgICAgZm9yKCBJU3RhdGVFbnVtZXJhdGlvbkl0ZW0gaXRlbSA6IHNvdXJjZUVudW1MaXN0ICkKLSAgICAgICB7Ci0gICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICIgICAgIiArIGl0ZW0uZ2V0SWQoKSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgfQotICAgICAgIAotICAgICAgIGZvciggSVBvbGljeUVudW1lcmF0aW9uTGlzdCBwb2xpY3lFbnVtTGlzdCA6IHRhcmdldExpc3QgKQotICAgICAgIHsKLSAgICAgICAgIFN0cmluZyAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lJZCAgICAgICA9IHBvbGljeUVudW1MaXN0LmdldFBvbGljeSgpLmdldElkKCk7Ci0gICAgICAgICBMaXN0PElTdGF0ZUVudW1lcmF0aW9uSXRlbT4gdGFyZ2V0RW51bUxpc3QgPSBwb2xpY3lFbnVtTGlzdC5nZXRFbnVtZXJhdGlvbkxpc3QoKTsKLSAgICAgICAgIAotICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiICAgIHBvbGljeSBpZDogIiArIHBvbGljeUlkICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgIAotICAgICAgICAgZm9yKCBJU3RhdGVFbnVtZXJhdGlvbkl0ZW0gdGFyZ2V0SXRlbSA6IHRhcmdldEVudW1MaXN0ICkKLSAgICAgICAgIHsKLSAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiICAgICAgdGFyZ2V0IGVudW0gaWQ6ICIgKyB0YXJnZXRJdGVtLmdldElkKCkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgfQotICAgICAgICAgCi0gICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkRlc2NyaXB0b3I6IiApOyAvLyROT04tTkxTLTEkCi0gICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIiAgc2hvcnQgbmFtZTogIiArIGRlc2NyaXB0b3IuZ2V0U2hvcnROYW1lKCkgKTsgLy8kTk9OLU5MUy0xJAotICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICIgIGxvbmcgbmFtZTogIiArIGRlc2NyaXB0b3IuZ2V0TG9uZ05hbWUoKSApOyAvLyROT04tTkxTLTEkCi0gICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIiAgZGVzY3JpcHRpb246ICIgKyBkZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCkgKTsgLy8kTk9OLU5MUy0xJAotICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICIgIGNvbnRleHQgaGVscDogIiArIGRlc2NyaXB0b3IuZ2V0Q29udGV4dEhlbHBJZCgpICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiICBpY29uIHBhdGg6ICIgKyBkZXNjcmlwdG9yLmdldEljb25QYXRoKCkgKTsgLy8kTk9OLU5MUy0xJAotICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICIgIGljb24gcGF0aCBidW5kbGUgaWQ6ICIgKyBkZXNjcmlwdG9yLmdldEljb25CdW5kbGVJZCgpICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiPT09IiApOyAvLyROT04tTkxTLTEkCi0gICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgZm9yKCBJU2VydmljZVBvbGljeSBjaGlsZCA6IHBvbGljeS5nZXRDaGlsZHJlbigpICkKLSAgICAgewotICAgICAgIGRpc3BsYXlQb2xpY3lOb2RlKCBjaGlsZCApOwotICAgICB9ICAgCi0gICB9Ci0gICAKLSAgIHB1YmxpYyB2b2lkIHRlc3RFbnVtZXJhdGlvbnMoKQotICAgewotICAgICBTZXJ2aWNlUG9saWN5UGxhdGZvcm0gcGxhdGZvcm0gID0gU2VydmljZVBvbGljeVBsYXRmb3JtLmdldEluc3RhbmNlKCk7Ci0gICAgIElTZXJ2aWNlUG9saWN5ICAgICAgICBpZDEgICAgICAgPSBwbGF0Zm9ybS5nZXRTZXJ2aWNlUG9saWN5KCAiaWQxIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElTZXJ2aWNlUG9saWN5ICAgICAgICBpZDIgICAgICAgPSBwbGF0Zm9ybS5nZXRTZXJ2aWNlUG9saWN5KCAiaWQyIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElTZXJ2aWNlUG9saWN5ICAgICAgICBpZDMgICAgICAgPSBwbGF0Zm9ybS5nZXRTZXJ2aWNlUG9saWN5KCAiaWQzIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElQb2xpY3lTdGF0ZUVudW0gICAgICBzdGF0ZTEgICAgPSBpZDEuZ2V0UG9saWN5U3RhdGVFbnVtKCk7Ci0gICAgIElQb2xpY3lTdGF0ZUVudW0gICAgICBzdGF0ZTIgICAgPSBpZDIuZ2V0UG9saWN5U3RhdGVFbnVtKCk7Ci0gICAgIElQb2xpY3lTdGF0ZUVudW0gICAgICBzdGF0ZTMgICAgPSBpZDMuZ2V0UG9saWN5U3RhdGVFbnVtKCk7Ci0gICAgIElTdGF0ZUVudW1lcmF0aW9uSXRlbSBpdGVtMSAgICAgPSBzdGF0ZTEuZ2V0Q3VycmVudEl0ZW0oKTsKLSAgICAgSVN0YXRlRW51bWVyYXRpb25JdGVtIGl0ZW0yICAgICA9IHN0YXRlMi5nZXRDdXJyZW50SXRlbSgpOwotICAgICBJU3RhdGVFbnVtZXJhdGlvbkl0ZW0gaXRlbTMgICAgID0gc3RhdGUzLmdldEN1cnJlbnRJdGVtKCk7Ci0gICAgIAotICAgICBhc3NlcnRUcnVlKCAiVW5leHBlY3RlZCBzaG9ydG5hbWU6IiArIGl0ZW0xLmdldFNob3J0TmFtZSgpLCBpdGVtMS5nZXRTaG9ydE5hbWUoKS5lcXVhbHMoICJpZ25vcmUiKSApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgYXNzZXJ0VHJ1ZSggIlVuZXhwZWN0ZWQgc2hvcnRuYW1lOiIgKyBpdGVtMi5nZXRTaG9ydE5hbWUoKSwgaXRlbTIuZ2V0U2hvcnROYW1lKCkuZXF1YWxzKCAid2FybiIpICk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICBhc3NlcnRUcnVlKCAiVW5leHBlY3RlZCBzaG9ydG5hbWU6IiArIGl0ZW0zLmdldFNob3J0TmFtZSgpLCBpdGVtMy5nZXRTaG9ydE5hbWUoKS5lcXVhbHMoICJlcnJvciIpICk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJpZDEgdmFsdWU6IiArIGl0ZW0xLmdldFNob3J0TmFtZSgpICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiaWQyIHZhbHVlOiIgKyBpdGVtMi5nZXRTaG9ydE5hbWUoKSApOyAvLyROT04tTkxTLTEkCi0gICB9Ci0gICAKLSAgIHB1YmxpYyB2b2lkIHRlc3RQb2xpY3lTdGF0ZSgpCi0gICB7Ci0gICAgIFNlcnZpY2VQb2xpY3lQbGF0Zm9ybSBwbGF0Zm9ybSAgPSBTZXJ2aWNlUG9saWN5UGxhdGZvcm0uZ2V0SW5zdGFuY2UoKTsKLSAgICAgSVNlcnZpY2VQb2xpY3kgICAgICAgIGlkMSAgICAgICA9IHBsYXRmb3JtLmdldFNlcnZpY2VQb2xpY3koICJpZDEiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgSVBvbGljeVN0YXRlRW51bSAgICAgIGVudW1TdGF0ZSA9IGlkMS5nZXRQb2xpY3lTdGF0ZUVudW0oKTsKLSAgICAgSVN0YXRlRW51bWVyYXRpb25JdGVtIGVudW1JdGVtICA9IGVudW1TdGF0ZS5nZXRDdXJyZW50SXRlbSgpOwotICAgICBTdHJpbmcgICAgICAgICAgICAgICAgaWdub3JlSWQgID0gIm9yZy5lY2xpcHNlLndzdC5pZ25vcmUiOyAvLyROT04tTkxTLTEkCi0gICAgIFN0cmluZyAgICAgICAgICAgICAgICB3YXJuSWQgICAgPSAib3JnLmVjbGlwc2Uud3N0Lndhcm4iOyAvLyROT04tTkxTLTEkCi0gICAgIFN0cmluZyAgICAgICAgICAgICAgICBlcnJvcklkICAgPSAib3JnLmVjbGlwc2Uud3N0LmVycm9yIjsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgYXNzZXJ0VHJ1ZSggIkRlZmF1bHQgZW51bSBub3Q6IiArIGlnbm9yZUlkLCBlbnVtSXRlbS5nZXRJZCgpLmVxdWFscyggaWdub3JlSWQgKSApOyAvLyROT04tTkxTLTEkCi0gICAgIAotICAgICBlbnVtU3RhdGUuc2V0Q3VycmVudEl0ZW0oIHdhcm5JZCApOwotICAgICBlbnVtSXRlbSA9IGVudW1TdGF0ZS5nZXRDdXJyZW50SXRlbSgpOwotICAgICAKLSAgICAgYXNzZXJ0VHJ1ZSggIlVwZGF0ZWQgZW51bSBub3Q6IiArIHdhcm5JZCwgZW51bUl0ZW0uZ2V0SWQoKS5lcXVhbHMoIHdhcm5JZCApICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgCi0gICAgIHBsYXRmb3JtLmRpc2NhcmRDaGFuZ2VzKCk7Ci0gICAgIGVudW1JdGVtID0gZW51bVN0YXRlLmdldEN1cnJlbnRJdGVtKCk7Ci0gICAgIAotICAgICBhc3NlcnRUcnVlKCAiRGlzY2FyZCBlbnVtIG5vdDoiICsgaWdub3JlSWQsIGVudW1JdGVtLmdldElkKCkuZXF1YWxzKCBpZ25vcmVJZCApICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgCi0gICAgIGVudW1TdGF0ZS5zZXRDdXJyZW50SXRlbSggZXJyb3JJZCApOwotICAgICBlbnVtSXRlbSA9IGVudW1TdGF0ZS5nZXRDdXJyZW50SXRlbSgpOwotICAgICBhc3NlcnRUcnVlKCAiRXJyb3IgZW51bSBub3Q6IiArIGVycm9ySWQsIGVudW1JdGVtLmdldElkKCkuZXF1YWxzKCBlcnJvcklkICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgcGxhdGZvcm0uY29tbWl0Q2hhbmdlcygpOwotICAgICBlbnVtSXRlbSA9IGVudW1TdGF0ZS5nZXRDdXJyZW50SXRlbSgpOwotICAgICBhc3NlcnRUcnVlKCAiRXJyb3IgZW51bSBub3Q6IiArIGVycm9ySWQsIGVudW1JdGVtLmdldElkKCkuZXF1YWxzKCBlcnJvcklkICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgSUVjbGlwc2VQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZmVyZW5jZXMgPSBuZXcgSW5zdGFuY2VTY29wZSgpLmdldE5vZGUoIFNlcnZpY2VQb2xpY3lBY3RpdmF0b3IuUExVR0lOX0lEICk7Ci0gICAgIAotICAgICB0cnkKLSAgICAgewotICAgICAgIFN0cmluZ1tdICAgICAgICAgICAga2V5cyAgICAgICAgICAgICAgID0gcHJvamVjdFByZWZlcmVuY2VzLmtleXMoKTsKLSAgICAgCi0gICAgICAgZm9yKCBTdHJpbmcga2V5IDoga2V5cyApCi0gICAgICAgewotICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiS2V5PSIgKyBrZXkgKyAiIHZhbHVlPSIgKyBwcm9qZWN0UHJlZmVyZW5jZXMuZ2V0KCBrZXksICIiICkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgICAgIH0KLSAgICAgfQotICAgICBjYXRjaCggRXhjZXB0aW9uIGV4YyApCi0gICAgIHsKLSAgICAgICBhc3NlcnRUcnVlKCAiRXhjZXB0aW9uIHRocm93biIgKyBleGMuZ2V0TWVzc2FnZSgpLCBmYWxzZSApOyAvLyROT04tTkxTLTEkCi0gICAgIH0KLSAgIH0KLSAgIAotICAgcHVibGljIHZvaWQgdGVzdFVuaXF1ZUlkcygpCi0gICB7Ci0gICAgIFNlcnZpY2VQb2xpY3lQbGF0Zm9ybSBwbGF0Zm9ybSAgPSBTZXJ2aWNlUG9saWN5UGxhdGZvcm0uZ2V0SW5zdGFuY2UoKTsKLSAgICAgSVNlcnZpY2VQb2xpY3kgICAgICAgIHBvbGljeSAgICA9IHBsYXRmb3JtLmNyZWF0ZVNlcnZpY2VQb2xpY3koIG51bGwsICJzb21laWQiLCBudWxsLCBudWxsICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgCi0gICAgIGFzc2VydFRydWUoIHBvbGljeS5nZXRJZCgpLmVxdWFscyggInNvbWVpZCIgKSApOyAvLyROT04tTkxTLTEkCi0gICAgIAotICAgICBwb2xpY3kgPSBwbGF0Zm9ybS5jcmVhdGVTZXJ2aWNlUG9saWN5KCBudWxsLCAic29tZWlkIiwgbnVsbCwgbnVsbCApOyAvLyROT04tTkxTLTEkCi0gICAgIGFzc2VydFRydWUoIHBvbGljeS5nZXRJZCgpLmVxdWFscyggInNvbWVpZDEiICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgcG9saWN5ID0gcGxhdGZvcm0uY3JlYXRlU2VydmljZVBvbGljeSggbnVsbCwgInNvbWVpZCIsIG51bGwsIG51bGwgKTsgLy8kTk9OLU5MUy0xJAotICAgICBhc3NlcnRUcnVlKCBwb2xpY3kuZ2V0SWQoKS5lcXVhbHMoICJzb21laWQyIiApICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgCi0gICAgIHBvbGljeSA9IHBsYXRmb3JtLmNyZWF0ZVNlcnZpY2VQb2xpY3koIG51bGwsICJzb21laWQxIiwgbnVsbCwgbnVsbCApOyAvLyROT04tTkxTLTEkCi0gICAgIGFzc2VydFRydWUoIHBvbGljeS5nZXRJZCgpLmVxdWFscyggInNvbWVpZDMiICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgcG9saWN5ID0gcGxhdGZvcm0uY3JlYXRlU2VydmljZVBvbGljeSggbnVsbCwgInNvbWU1NWlkNSIsIG51bGwsIG51bGwgKTsgLy8kTk9OLU5MUy0xJAotICAgICBhc3NlcnRUcnVlKCBwb2xpY3kuZ2V0SWQoKS5lcXVhbHMoICJzb21lNTVpZDUiICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgcG9saWN5ID0gcGxhdGZvcm0uY3JlYXRlU2VydmljZVBvbGljeSggbnVsbCwgInNvbWU1NWlkNSIsIG51bGwsIG51bGwgKTsgLy8kTk9OLU5MUy0xJAotICAgICBhc3NlcnRUcnVlKCBwb2xpY3kuZ2V0SWQoKS5lcXVhbHMoICJzb21lNTVpZDEiICkgKTsgLy8kTk9OLU5MUy0xJAotICAgfQotIAotICAgCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJyZXN0cmljdGlvbiIpIC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHZvaWQgdGVzdE9sZFdTSUNvbnRleHQoKQotICAgewotICAgICBTZXJ2aWNlUG9saWN5UGxhdGZvcm0gICAgcGxhdGZvcm0gICAgPSBTZXJ2aWNlUG9saWN5UGxhdGZvcm0uZ2V0SW5zdGFuY2UoKTsKLSAgICAgSVNlcnZpY2VQb2xpY3kgICAgICAgICAgIGFwUG9saWN5ICAgID0gcGxhdGZvcm0uZ2V0U2VydmljZVBvbGljeSggIm9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS51aS5zZXJ2aWNlcG9scy53c2lwcm9maWxlY29tcC53c2lhcCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJUG9saWN5U3RhdGVFbnVtICAgICAgICAgYXBTdGF0ZSAgICAgPSBhcFBvbGljeS5nZXRQb2xpY3lTdGF0ZUVudW0oKTsKLSAgICAgSVNlcnZpY2VQb2xpY3kgICAgICAgICAgIHNzYnBQb2xpY3kgID0gcGxhdGZvcm0uZ2V0U2VydmljZVBvbGljeSggIm9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS51aS5zZXJ2aWNlcG9scy53c2lwcm9maWxlY29tcC53c2lzc2JwIiApOyAvLyROT04tTkxTLTEkCi0gICAgIFBlcnNpc3RlbnRXU0lBUENvbnRleHQgICBhcENvbnRleHQgICA9IG5ldyBQZXJzaXN0ZW50V1NJQVBDb250ZXh0KCk7Ci0gICAgIFBlcnNpc3RlbnRXU0lTU0JQQ29udGV4dCBzc2JwQ29udGV4dCA9IG5ldyBQZXJzaXN0ZW50V1NJU1NCUENvbnRleHQoKTsKLSAgICAgSVdvcmtzcGFjZVJvb3QgICAgICAgICAgIHJvb3QgICAgICAgID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLSAgICAgSVByb2plY3QgICAgICAgICAgICAgICAgIHByb2plY3QgICAgID0gcm9vdC5nZXRQcm9qZWN0KCJUZXN0UHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0gICAgIFN0cmluZyAgICAgICAgICAgICAgICAgICBpdGVtICAgICAgICA9IG51bGw7Ci0gICAgIAotICAgICB0cnkKLSAgICAgewotICAgICAgIHByb2plY3QuY3JlYXRlKG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICB9Ci0gICAgIGNhdGNoKCBDb3JlRXhjZXB0aW9uIGV4YyApCi0gICAgIHsKLSAgICAgICBhc3NlcnRUcnVlKCAiQ29yZSBleGNlcHRpb246IiArIGV4Yy5nZXRNZXNzYWdlKCksIGZhbHNlICk7ICAgLy8kTk9OLU5MUy0xJAotICAgICB9Ci0gICAgIAotICAgICBJUG9saWN5U3RhdGVFbnVtICBhcFByb2pTdGF0ZSAgID0gYXBQb2xpY3kuZ2V0UG9saWN5U3RhdGVFbnVtKCBwcm9qZWN0ICk7Ci0gICAgIElQb2xpY3lTdGF0ZUVudW0gIHNzYnBQcm9qU3RhdGUgPSBzc2JwUG9saWN5LmdldFBvbGljeVN0YXRlRW51bSggcHJvamVjdCApOwotICAgICAKLSAgICAgLy8gRW5zdXJlIHRoYXQgcHJvamVjdCBwcmVmZXJlbmNlcyBhcmUgZ290dGVuIGZyb20gdGhlIHdvcmtzcGFjZQotICAgICBhcFN0YXRlLnNldEN1cnJlbnRJdGVtKCAib3JnLmVjbGlwc2Uud3N0LnN1Zy5pZ25vcmUiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgcGxhdGZvcm0uY29tbWl0Q2hhbmdlcygpOwotICAgICBhcFByb2pTdGF0ZS5zZXRDdXJyZW50SXRlbSggIm9yZy5lY2xpcHNlLndzdC5zdWcuc3VnZ2VzdCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBpdGVtID0gYXBQcm9qU3RhdGUuZ2V0Q3VycmVudEl0ZW0oKS5nZXRJZCgpOwotICAgICBhc3NlcnRUcnVlKCAiQXAgdmFsdWUgbm90IGlnbm9yZSwgYnV0IGdvdCAiICsgaXRlbSwgaXRlbS5lcXVhbHMoIm9yZy5lY2xpcHNlLndzdC5zdWcuaWdub3JlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgCi0gICAgIGFwU3RhdGUuc2V0Q3VycmVudEl0ZW0oICJvcmcuZWNsaXBzZS53c3Quc3VnLnJlcXVpcmUiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgcGxhdGZvcm0uY29tbWl0Q2hhbmdlcygpOwotICAgICBhcFByb2pTdGF0ZS5zZXRDdXJyZW50SXRlbSggIm9yZy5lY2xpcHNlLndzdC5zdWcuaWdub3JlIiApOyAvLyROT04tTkxTLTEkCi0gICAgIGl0ZW0gPSBhcFByb2pTdGF0ZS5nZXRDdXJyZW50SXRlbSgpLmdldElkKCk7Ci0gICAgIGFzc2VydFRydWUoICJBcCB2YWx1ZSBub3QgcmVxdWlyZSwgYnV0IGdvdCAiICsgaXRlbSwgaXRlbS5lcXVhbHMoIm9yZy5lY2xpcHNlLndzdC5zdWcucmVxdWlyZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgIAotICAgICBwbGF0Zm9ybS5zZXRQcm9qZWN0UHJlZmVyZW5jZXNFbmFibGVkKCBwcm9qZWN0ICwgdHJ1ZSApOwotICAgICBpdGVtID0gYXBQcm9qU3RhdGUuZ2V0Q3VycmVudEl0ZW0oKS5nZXRJZCgpOwotICAgICBhc3NlcnRUcnVlKCAiQXAgdmFsdWUgbm90IGluZ29yZSwgYnV0IGdvdCAiICsgaXRlbSwgaXRlbS5lcXVhbHMoIm9yZy5lY2xpcHNlLndzdC5zdWcuaWdub3JlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgCi0gICAgIHBsYXRmb3JtLmNvbW1pdENoYW5nZXMoIHByb2plY3QgKTsKLSAgICAgaXRlbSA9IGFwUHJvalN0YXRlLmdldEN1cnJlbnRJdGVtKCkuZ2V0SWQoKTsKLSAgICAgYXNzZXJ0VHJ1ZSggIkFwIHZhbHVlIG5vdCBpbmdvcmUsIGJ1dCBnb3QgIiArIGl0ZW0sIGl0ZW0uZXF1YWxzKCJvcmcuZWNsaXBzZS53c3Quc3VnLmlnbm9yZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgIAotICAgICBTdHJpbmcgYXBDb250ZXh0VmFsdWUgPSBhcENvbnRleHQuZ2V0UHJvamVjdFdTSUNvbXBsaWFuY2UoIHByb2plY3QgKTsKLSAgICAgYXNzZXJ0VHJ1ZSggIkFwIGNvbnRleHQgbm90IGlnbm9yZSwgYnV0ICIgKyBhcENvbnRleHRWYWx1ZSwgYXBDb250ZXh0VmFsdWUuZXF1YWxzKCBQZXJzaXN0ZW50V1NJQ29udGV4dC5JR05PUkVfTk9OX1dTSSApICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgCi0gICAgIGFwU3RhdGUuc2V0Q3VycmVudEl0ZW0oICJvcmcuZWNsaXBzZS53c3Quc3VnLnN1Z2dlc3QiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgcGxhdGZvcm0uY29tbWl0Q2hhbmdlcygpOwotICAgICBhcENvbnRleHRWYWx1ZSA9IGFwQ29udGV4dC5nZXRQcm9qZWN0V1NJQ29tcGxpYW5jZSggcHJvamVjdCApOwotICAgICBhc3NlcnRUcnVlKCAiQXAgY29udGV4dCBub3QgaWdub3JlLCBidXQgIiArIGFwQ29udGV4dFZhbHVlLCBhcENvbnRleHRWYWx1ZS5lcXVhbHMoIFBlcnNpc3RlbnRXU0lDb250ZXh0LklHTk9SRV9OT05fV1NJICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgcGxhdGZvcm0uc2V0UHJvamVjdFByZWZlcmVuY2VzRW5hYmxlZCggcHJvamVjdCwgZmFsc2UgKTsKLSAgICAgYXBDb250ZXh0VmFsdWUgPSBhcENvbnRleHQuZ2V0UHJvamVjdFdTSUNvbXBsaWFuY2UoIHByb2plY3QgKTsKLSAgICAgYXNzZXJ0VHJ1ZSggIkFwIGNvbnRleHQgbm90IGlnbm9yZSwgYnV0ICIgKyBhcENvbnRleHRWYWx1ZSwgYXBDb250ZXh0VmFsdWUuZXF1YWxzKCBQZXJzaXN0ZW50V1NJQ29udGV4dC5XQVJOX05PTl9XU0kgKSApOyAvLyROT04tTkxTLTEkCi0gICAgIAotICAgICBhcFByb2pTdGF0ZS5zZXRDdXJyZW50SXRlbSggIm9yZy5lY2xpcHNlLndzdC5zdWcucmVxdWlyZSIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBwbGF0Zm9ybS5jb21taXRDaGFuZ2VzKCBwcm9qZWN0ICk7Ci0gICAgIGFwQ29udGV4dFZhbHVlID0gYXBDb250ZXh0LmdldFByb2plY3RXU0lDb21wbGlhbmNlKCBwcm9qZWN0ICk7Ci0gICAgIGFzc2VydFRydWUoICJBcCBjb250ZXh0IG5vdCBzdWdnZXN0LCBidXQgIiArIGFwQ29udGV4dFZhbHVlLCBhcENvbnRleHRWYWx1ZS5lcXVhbHMoIFBlcnNpc3RlbnRXU0lDb250ZXh0LldBUk5fTk9OX1dTSSApICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgCi0gICAgIHBsYXRmb3JtLnNldFByb2plY3RQcmVmZXJlbmNlc0VuYWJsZWQoIHByb2plY3QsIHRydWUgKTsKLSAgICAgYXBDb250ZXh0VmFsdWUgPSBhcENvbnRleHQuZ2V0UHJvamVjdFdTSUNvbXBsaWFuY2UoIHByb2plY3QgKTsKLSAgICAgYXNzZXJ0VHJ1ZSggIkFwIGNvbnRleHQgbm90IHJlcXVpcmUsIGJ1dCAiICsgYXBDb250ZXh0VmFsdWUsIGFwQ29udGV4dFZhbHVlLmVxdWFscyggUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgc3NicFByb2pTdGF0ZS5zZXRDdXJyZW50SXRlbSggIm9yZy5lY2xpcHNlLndzdC5zdWcuc3VnZ2VzdCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgU3RyaW5nIHNzYnBDb250ZXh0VmFsdWUgPSBzc2JwQ29udGV4dC5nZXRQcm9qZWN0V1NJQ29tcGxpYW5jZSggcHJvamVjdCApOwotICAgICAKLSAgICAgYXNzZXJ0VHJ1ZSggIkFwIGNvbnRleHQgbm90IHJlcXVpcmUsIGJ1dCAiICsgYXBDb250ZXh0VmFsdWUsIGFwQ29udGV4dFZhbHVlLmVxdWFscyggUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICBhc3NlcnRUcnVlKCAiU1NCUCBjb250ZXh0IG5vdCBzdWdnZXN0LCBidXQgIiArIHNzYnBDb250ZXh0VmFsdWUsIHNzYnBDb250ZXh0VmFsdWUuZXF1YWxzKCBQZXJzaXN0ZW50V1NJQ29udGV4dC5XQVJOX05PTl9XU0kgKSApOyAvLyROT04tTkxTLTEkCi0gICAgIAotICAgICBzc2JwUHJvalN0YXRlLnNldEN1cnJlbnRJdGVtKCAib3JnLmVjbGlwc2Uud3N0LnN1Zy5yZXF1aXJlIiApOyAvLyROT04tTkxTLTEkCi0gICAgIAotICAgICBzc2JwQ29udGV4dFZhbHVlID0gc3NicENvbnRleHQuZ2V0UHJvamVjdFdTSUNvbXBsaWFuY2UoIHByb2plY3QgKTsKLSAgICAgYXNzZXJ0VHJ1ZSggIkFwIGNvbnRleHQgbm90IHJlcXVpcmUsIGJ1dCAiICsgYXBDb250ZXh0VmFsdWUsIGFwQ29udGV4dFZhbHVlLmVxdWFscyggUGVyc2lzdGVudFdTSUNvbnRleHQuU1RPUF9OT05fV1NJICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICBhc3NlcnRUcnVlKCAiU1NCUCBjb250ZXh0IG5vdCByZXF1aXJlLCBidXQgIiArIHNzYnBDb250ZXh0VmFsdWUsIHNzYnBDb250ZXh0VmFsdWUuZXF1YWxzKCBQZXJzaXN0ZW50V1NJQ29udGV4dC5TVE9QX05PTl9XU0kgKSApOyAvLyROT04tTkxTLTEkCi0gICAgIAotICAgfQotICAgCi0gICBwdWJsaWMgdm9pZCB0ZXN0TXV0YWJsZSgpCi0gICB7Ci0gICAgIFNlcnZpY2VQb2xpY3lQbGF0Zm9ybSAgICBwbGF0Zm9ybSAgICA9IFNlcnZpY2VQb2xpY3lQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpOwotICAgICBJU2VydmljZVBvbGljeSAgICAgICAgICAgYXBQb2xpY3kgICAgPSBwbGF0Zm9ybS5nZXRTZXJ2aWNlUG9saWN5KCAib3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnVpLnNlcnZpY2Vwb2xzLndzaXByb2ZpbGVjb21wLndzaWFwIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElTZXJ2aWNlUG9saWN5ICAgICAgICAgICBzc2JwUG9saWN5ICA9IHBsYXRmb3JtLmdldFNlcnZpY2VQb2xpY3koICJvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudWkuc2VydmljZXBvbHMud3NpcHJvZmlsZWNvbXAud3Npc3NicCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJU2VydmljZVBvbGljeSAgICAgICAgICAgd3NpUG9saWN5ICAgPSBwbGF0Zm9ybS5nZXRTZXJ2aWNlUG9saWN5KCAib3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnVpLnNlcnZpY2Vwb2xzLndzaXByb2ZpbGVjb21wIiApOyAvLyROT04tTkxTLTEkCi0gICAgIAotICAgICBhc3NlcnRUcnVlKCAiUm9vdCB3c2kgcG9saWN5IGlzIG11dGFibGUiLCAhd3NpUG9saWN5LmdldFBvbGljeVN0YXRlKCkuaXNNdXRhYmxlKCkgKTsgLy8kTk9OLU5MUy0xJAotICAgICBhc3NlcnRUcnVlKCAiQXAgcG9saWN5IGlzIG5vdCBtdXRhYmxlIiwgYXBQb2xpY3kuZ2V0UG9saWN5U3RhdGUoKS5pc011dGFibGUoKSApOyAvLyROT04tTkxTLTEkCi0gICAgIGFzc2VydFRydWUoICJTU0JQIHBvbGljeSBpcyBub3QgbXV0YWJsZSIsIHNzYnBQb2xpY3kuZ2V0UG9saWN5U3RhdGUoKS5pc011dGFibGUoKSApOyAvLyROT04tTkxTLTEkCi0gICB9Ci0gICAKLSAgIHB1YmxpYyB2b2lkIHRlc3RDaGlsZENoYW5nZUxpc3RlbmVycygpCi0gICB7Ci0gICAgIFNlcnZpY2VQb2xpY3lQbGF0Zm9ybSBwbGF0Zm9ybSA9IFNlcnZpY2VQb2xpY3lQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpOwotICAgICBDaGlsZENoYW5nZUxpc3RlbmVyICAgbGlzdGVuZXIgPSBuZXcgQ2hpbGRDaGFuZ2VMaXN0ZW5lcigpOwotICAgICAKLSAgICAgcGxhdGZvcm0uYWRkQ2hpbGRDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lciwgZmFsc2UgKTsKLSAgICAgbGlzdGVuZXIuY2hpbGRFdmVudE9jY3VyZWQgPSBmYWxzZTsKLSAgICAgbGlzdGVuZXIuaXNBZGRlZCA9IGZhbHNlOwotICAgICAKLSAgICAgSVNlcnZpY2VQb2xpY3kgcGFyZW50ID0gcGxhdGZvcm0uY3JlYXRlU2VydmljZVBvbGljeSggbnVsbCwgInBhcmVudF9pZDEiLCBudWxsLCBudWxsICk7Ci0gICAgIAotICAgICBhc3NlcnRUcnVlKCAiTGlzdGVuZXIgbm90IGNhbGxlZCIsIGxpc3RlbmVyLmNoaWxkRXZlbnRPY2N1cmVkICk7Ci0gICAgIGFzc2VydFRydWUoICJMaXN0ZW5lciBub3QgYWRkZWQiLCBsaXN0ZW5lci5pc0FkZGVkICk7Ci0gICAgIAotICAgICBsaXN0ZW5lci5jaGlsZEV2ZW50T2NjdXJlZCA9IGZhbHNlOyAgIAotICAgICBsaXN0ZW5lci5pc0FkZGVkID0gZmFsc2U7Ci0gICAgIElTZXJ2aWNlUG9saWN5IGNoaWxkMSA9IHBsYXRmb3JtLmNyZWF0ZVNlcnZpY2VQb2xpY3koIHBhcmVudCwgInBhcmVudF9pZDEiLCBudWxsLCBudWxsICk7Ci0gICAgIAotICAgICBhc3NlcnRUcnVlKCAiTGlzdGVuZXIgbm90IGNhbGxlZCIsIGxpc3RlbmVyLmNoaWxkRXZlbnRPY2N1cmVkICk7Ci0gICAgIGFzc2VydFRydWUoICJMaXN0ZW5lciBub3QgYWRkZWQiLCBsaXN0ZW5lci5pc0FkZGVkICk7Ci0gICAgIAotICAgICBsaXN0ZW5lci5jaGlsZEV2ZW50T2NjdXJlZCA9IGZhbHNlOyAgIAotICAgICBsaXN0ZW5lci5pc0FkZGVkID0gZmFsc2U7Ci0gICAgIGxpc3RlbmVyLmNvdW50ICAgPSAwOwotICAgICBJU2VydmljZVBvbGljeSBjaGlsZDIgPSBwbGF0Zm9ybS5jcmVhdGVTZXJ2aWNlUG9saWN5KCBjaGlsZDEsICJwYXJlbnRfaWQxIiwgbnVsbCwgbnVsbCApOwotICAgICBJU2VydmljZVBvbGljeSBjaGlsZDMgPSBwbGF0Zm9ybS5jcmVhdGVTZXJ2aWNlUG9saWN5KCBjaGlsZDIsICJwYXJlbnRfaWQxIiwgbnVsbCwgbnVsbCApOwotICAgICAKLSAgICAgYXNzZXJ0VHJ1ZSggIkxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lci5jaGlsZEV2ZW50T2NjdXJlZCApOwotICAgICBhc3NlcnRUcnVlKCAiTGlzdGVuZXIgbm90IGFkZGVkIiwgbGlzdGVuZXIuaXNBZGRlZCApOwotICAgICBhc3NlcnRUcnVlKCAiTGlzdGVuZXIgY291bnQgbm90IDIiLCBsaXN0ZW5lci5jb3VudCA9PSAyICk7Ci0gICAgIAotICAgICBsaXN0ZW5lci5jaGlsZEV2ZW50T2NjdXJlZCA9IGZhbHNlOyAgIAotICAgICBsaXN0ZW5lci5pc0FkZGVkID0gdHJ1ZTsKLSAgICAgbGlzdGVuZXIuY291bnQgICA9IDA7Ci0gICAgIAotICAgICBjaGlsZDIucmVtb3ZlQ2hpbGQoIGNoaWxkMyApOwotICAgICAKLSAgICAgYXNzZXJ0VHJ1ZSggIkxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lci5jaGlsZEV2ZW50T2NjdXJlZCApOwotICAgICBhc3NlcnRUcnVlKCAiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCAhbGlzdGVuZXIuaXNBZGRlZCApOwotICAgICBhc3NlcnRUcnVlKCAiTGlzdGVuZXIgY291bnQgbm90IDEiLCBsaXN0ZW5lci5jb3VudCA9PSAxICk7Ci0gICAgIAotICAgICBsaXN0ZW5lci5jaGlsZEV2ZW50T2NjdXJlZCA9IGZhbHNlOyAgIAotICAgICBsaXN0ZW5lci5pc0FkZGVkID0gdHJ1ZTsKLSAgICAgbGlzdGVuZXIuY291bnQgICA9IDA7Ci0gICAgIAotICAgICAvLyBTaG91bGQgcmVtb3ZlIHBhcmVudCwgY2hpbGQxLCBhbmQgY2hpbGQyCi0gICAgIHBsYXRmb3JtLnJlbW92ZVNlcnZpY2VQb2xpY3koIHBhcmVudCApOwotICAgICAKLSAgICAgYXNzZXJ0VHJ1ZSggIkxpc3RlbmVyIG5vdCBjYWxsZWQiLCBsaXN0ZW5lci5jaGlsZEV2ZW50T2NjdXJlZCApOwotICAgICBhc3NlcnRUcnVlKCAiTGlzdGVuZXIgbm90IHJlbW92ZWQiLCAhbGlzdGVuZXIuaXNBZGRlZCApOwotICAgICBhc3NlcnRUcnVlKCAiTGlzdGVuZXIgY291bnQgbm90IDMiLCBsaXN0ZW5lci5jb3VudCA9PSAzICk7Ci0gICAgIAotICAgICBwbGF0Zm9ybS5yZW1vdmVDaGlsZENoYW5nZUxpc3RlbmVyKCBsaXN0ZW5lciwgZmFsc2UgKTsKLSAgICAgCi0gICAgIGxpc3RlbmVyLmNoaWxkRXZlbnRPY2N1cmVkID0gZmFsc2U7ICAgCi0gICAgIGxpc3RlbmVyLmlzQWRkZWQgPSB0cnVlOwotICAgICBsaXN0ZW5lci5jb3VudCAgID0gMDsKLSAgICAgCi0gICAgIHBhcmVudCA9IHBsYXRmb3JtLmNyZWF0ZVNlcnZpY2VQb2xpY3koIG51bGwsICJwYXJlbnRfaWQxIiwgbnVsbCwgbnVsbCApOwotICAgICBjaGlsZDEgPSBwbGF0Zm9ybS5jcmVhdGVTZXJ2aWNlUG9saWN5KCBwYXJlbnQsICJwYXJlbnRfaWQxIiwgbnVsbCwgbnVsbCApOwotICAgICAKLSAgICAgYXNzZXJ0VHJ1ZSggIkxpc3RlbmVyIGNhbGxlZCIsICFsaXN0ZW5lci5jaGlsZEV2ZW50T2NjdXJlZCApOwotICAgICBhc3NlcnRUcnVlKCAiTGlzdGVuZXIgaXNhZGRlZCBjaGFuZ2VkIiwgbGlzdGVuZXIuaXNBZGRlZCApOwotICAgICBhc3NlcnRUcnVlKCAiTGlzdGVuZXIgY291bnQgbm90IDAiLCBsaXN0ZW5lci5jb3VudCA9PSAwICk7Ci0gICB9Ci0gICAKLSAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZSgpCi0gICB7Ci0gICAgIFNlcnZpY2VQb2xpY3lQbGF0Zm9ybSBwbGF0Zm9ybSA9IFNlcnZpY2VQb2xpY3lQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpOwotICAgICBJU2VydmljZVBvbGljeSAgICAgICAgaWQyICAgICAgPSBwbGF0Zm9ybS5nZXRTZXJ2aWNlUG9saWN5KCAiaWQyIiApOwotICAgICBTdHJpbmcgICAgICAgICAgICAgICAgdmFsdWUgICAgPSBpZDIuZ2V0UG9saWN5U3RhdGUoKS5nZXRWYWx1ZSggImlkMl9rZXkiICk7Ci0gICAgIAotICAgICBhc3NlcnRUcnVlKCAiRXhwZWN0ZWQgc3RhdGUgdmFsdWUgdG8gYmUgaWQyX3ZhbHVlLiIsIHZhbHVlLmVxdWFscyggImlkMl92YWx1ZSIgKSApOwotICAgfQotICAgCi0gICBwcml2YXRlIGNsYXNzIENoaWxkQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUG9saWN5Q2hpbGRDaGFuZ2VMaXN0ZW5lcgotICAgewotICAgICBwdWJsaWMgYm9vbGVhbiBjaGlsZEV2ZW50T2NjdXJlZCA9IGZhbHNlOwotICAgICBwdWJsaWMgYm9vbGVhbiBpc0FkZGVkID0gZmFsc2U7Ci0gICAgIHB1YmxpYyBpbnQgICAgIGNvdW50ID0gMDs7Ci0gICAgIAotICAgICBwdWJsaWMgdm9pZCBjaGlsZENoYW5nZShMaXN0PElTZXJ2aWNlUG9saWN5PiBjaGlsZExpc3QsIExpc3Q8Qm9vbGVhbj4gYWRkZWRMaXN0KQotICAgICB7Ci0gICAgICAgY2hpbGRFdmVudE9jY3VyZWQgPSB0cnVlOwotICAgICAgIGlzQWRkZWQgPSBhZGRlZExpc3QuZ2V0KDApOwotICAgICAgIGNvdW50Kys7Ci0gICAgIH0KLSAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L3NyYy9vcmcvZWNsaXBzZS93c3Qvd3Mvc2VydmljZS9wb2xpY3kvdGVzdC9NYWluVUlUZXN0ZXIuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L3NyYy9vcmcvZWNsaXBzZS93c3Qvd3Mvc2VydmljZS9wb2xpY3kvdGVzdC9NYWluVUlUZXN0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JhZTU1OS4uMDAwMDAwMAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3NlcnZpY2UvcG9saWN5L3Rlc3QvTWFpblVJVGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcxMDI0ICAgMTk2OTk3IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LklEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS5JU2VydmljZVBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kuU2VydmljZVBvbGljeVBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS51aS5JUG9saWN5T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS51aS5JUXVpY2tGaXhBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnVpLklRdWlja0ZpeEFjdGlvbkluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnVpLlNlcnZpY2VQb2xpY3lQbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS51aS51dGlscy5BY3Rpdml0eVV0aWxzOwotCi1wdWJsaWMgY2xhc3MgTWFpblVJVGVzdGVyIGV4dGVuZHMgVGVzdENhc2UKLXsgIAotICAgCi0gICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaW9ucygpCi0gICB7Ci0gICAgIFNlcnZpY2VQb2xpY3lQbGF0Zm9ybVVJIHBsYXRmb3JtVUkgICA9IFNlcnZpY2VQb2xpY3lQbGF0Zm9ybVVJLmdldEluc3RhbmNlKCk7Ci0gICAgIExpc3Q8SVBvbGljeU9wZXJhdGlvbj4gIG9wZXJhdGlvbnMgICA9IHBsYXRmb3JtVUkuZ2V0QWxsT3BlcmF0aW9ucygpOwotICAgICAKLSAgICAgZm9yKCBJUG9saWN5T3BlcmF0aW9uIG9wZXJhdGlvbiA6IG9wZXJhdGlvbnMgKQotICAgICB7Ci0gICAgICAgZGlzcGxheU9wZXJhdGlvbiggb3BlcmF0aW9uICk7Ci0gICAgIH0gIAotICAgfQotICAgCi0gICBwdWJsaWMgdm9pZCB0ZXN0T3BlcmF0aW9uQ2FjaGUoKQotICAgewotICAgICBTZXJ2aWNlUG9saWN5UGxhdGZvcm0gICBwbGF0Zm9ybSAgID0gU2VydmljZVBvbGljeVBsYXRmb3JtLmdldEluc3RhbmNlKCk7Ci0gICAgIFNlcnZpY2VQb2xpY3lQbGF0Zm9ybVVJIHBsYXRmb3JtVUkgPSBTZXJ2aWNlUG9saWN5UGxhdGZvcm1VSS5nZXRJbnN0YW5jZSgpOwotICAgICBJU2VydmljZVBvbGljeSAgICAgICAgICBpZDEgICAgICAgID0gcGxhdGZvcm0uZ2V0U2VydmljZVBvbGljeSggImlkMSIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJU2VydmljZVBvbGljeSAgICAgICAgICBpZDIgICAgICAgID0gcGxhdGZvcm0uZ2V0U2VydmljZVBvbGljeSggImlkMiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJU2VydmljZVBvbGljeSAgICAgICAgICBpZDMgICAgICAgID0gcGxhdGZvcm0uZ2V0U2VydmljZVBvbGljeSggImlkMyIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJU2VydmljZVBvbGljeSAgICAgICAgICBpZDQgICAgICAgID0gcGxhdGZvcm0uZ2V0U2VydmljZVBvbGljeSggImlkNCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJUG9saWN5T3BlcmF0aW9uICAgICAgICBvcDFfaWQyICAgID0gcGxhdGZvcm1VSS5nZXRPcGVyYXRpb24oIGlkMiwgInNlcnZpY2UudWkub3BlcmF0aW9uMSIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJUG9saWN5T3BlcmF0aW9uICAgICAgICBvcDFfaWQzICAgID0gcGxhdGZvcm1VSS5nZXRPcGVyYXRpb24oIGlkMywgInNlcnZpY2UudWkub3BlcmF0aW9uMSIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJUG9saWN5T3BlcmF0aW9uICAgICAgICBvcDJfaWQxICAgID0gcGxhdGZvcm1VSS5nZXRPcGVyYXRpb24oIGlkMSwgInNlcnZpY2UudWkub3BlcmF0aW9uMiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJUG9saWN5T3BlcmF0aW9uICAgICAgICBvcDJfaWQyICAgID0gcGxhdGZvcm1VSS5nZXRPcGVyYXRpb24oIGlkMiwgInNlcnZpY2UudWkub3BlcmF0aW9uMiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJUG9saWN5T3BlcmF0aW9uICAgICAgICBvcDJfaWQzICAgID0gcGxhdGZvcm1VSS5nZXRPcGVyYXRpb24oIGlkMywgInNlcnZpY2UudWkub3BlcmF0aW9uMiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJUG9saWN5T3BlcmF0aW9uICAgICAgICBvcDJfaWQ0ICAgID0gcGxhdGZvcm1VSS5nZXRPcGVyYXRpb24oIGlkNCwgInNlcnZpY2UudWkub3BlcmF0aW9uMiIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJUG9saWN5T3BlcmF0aW9uICAgICAgICBvcDNfaWQ0ICAgID0gcGxhdGZvcm1VSS5nZXRPcGVyYXRpb24oIGlkNCwgInNlcnZpY2UudWkub3BlcmF0aW9uMyIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJUG9saWN5T3BlcmF0aW9uICAgICAgICBvcDRfaWQxICAgID0gcGxhdGZvcm1VSS5nZXRPcGVyYXRpb24oIGlkMSwgInNlcnZpY2UudWkub3BlcmF0aW9uNCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJUG9saWN5T3BlcmF0aW9uICAgICAgICBvcDRfaWQyICAgID0gcGxhdGZvcm1VSS5nZXRPcGVyYXRpb24oIGlkMiwgInNlcnZpY2UudWkub3BlcmF0aW9uNCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJUG9saWN5T3BlcmF0aW9uICAgICAgICBvcDRfaWQzICAgID0gcGxhdGZvcm1VSS5nZXRPcGVyYXRpb24oIGlkMywgInNlcnZpY2UudWkub3BlcmF0aW9uNCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgTGlzdDxJUG9saWN5T3BlcmF0aW9uPiBsaXN0MSA9IHBsYXRmb3JtVUkuZ2V0T3BlcmF0aW9ucyggaWQxLCB0cnVlICk7Ci0gICAgIExpc3Q8SVBvbGljeU9wZXJhdGlvbj4gbGlzdDIgPSBwbGF0Zm9ybVVJLmdldE9wZXJhdGlvbnMoIGlkMiwgdHJ1ZSApOwotICAgICBMaXN0PElQb2xpY3lPcGVyYXRpb24+IGxpc3QzID0gcGxhdGZvcm1VSS5nZXRPcGVyYXRpb25zKCBpZDMsIHRydWUgKTsKLSAgICAgTGlzdDxJUG9saWN5T3BlcmF0aW9uPiBsaXN0NCA9IHBsYXRmb3JtVUkuZ2V0T3BlcmF0aW9ucyggaWQ0LCB0cnVlICk7Ci0gICAgIAotICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJcbkRpc3BsYXkgbGlzdHMiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgZGlzcGxheUxpc3QoICJMaXN0MSIsIGxpc3QxICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgZGlzcGxheUxpc3QoICJMaXN0MiIsIGxpc3QyICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgZGlzcGxheUxpc3QoICJMaXN0MyIsIGxpc3QzICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgZGlzcGxheUxpc3QoICJMaXN0NCIsIGxpc3Q0ICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgCi0gICAgIGNoZWNrQ29udGVudHMoICJMaXN0MSIsIGxpc3QxLCBuZXcgSVBvbGljeU9wZXJhdGlvbltdeyBvcDJfaWQxLCBvcDRfaWQxIH0gKTsgLy8kTk9OLU5MUy0xJAotICAgICBjaGVja0NvbnRlbnRzKCAiTGlzdDIiLCBsaXN0MiwgbmV3IElQb2xpY3lPcGVyYXRpb25bXXsgb3AxX2lkMiwgb3AyX2lkMiwgb3A0X2lkMiB9ICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgY2hlY2tDb250ZW50cyggIkxpc3QzIiwgbGlzdDMsIG5ldyBJUG9saWN5T3BlcmF0aW9uW117IG9wMV9pZDMsIG9wMl9pZDMsIG9wNF9pZDMgfSApOyAvLyROT04tTkxTLTEkCi0gICAgIGNoZWNrQ29udGVudHMoICJMaXN0NCIsIGxpc3Q0LCBuZXcgSVBvbGljeU9wZXJhdGlvbltdeyBvcDJfaWQ0LCBvcDNfaWQ0IH0gKTsgLy8kTk9OLU5MUy0xJAotICAgfQotICAgCi0gICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlZE9wZXJhdGlvbnMoKQotICAgewotICAgICBTZXJ2aWNlUG9saWN5UGxhdGZvcm0gICBwbGF0Zm9ybSAgICA9IFNlcnZpY2VQb2xpY3lQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpOwotICAgICBTZXJ2aWNlUG9saWN5UGxhdGZvcm1VSSBwbGF0Zm9ybVVJICA9IFNlcnZpY2VQb2xpY3lQbGF0Zm9ybVVJLmdldEluc3RhbmNlKCk7Ci0gICAgIElTZXJ2aWNlUG9saWN5ICAgICAgICAgIGlkMSAgICAgICAgID0gcGxhdGZvcm0uZ2V0U2VydmljZVBvbGljeSggImlkMSIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJU2VydmljZVBvbGljeSAgICAgICAgICBpZDIgICAgICAgICA9IHBsYXRmb3JtLmdldFNlcnZpY2VQb2xpY3koICJpZDIiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgSVNlcnZpY2VQb2xpY3kgICAgICAgICAgaWQzICAgICAgICAgPSBwbGF0Zm9ybS5nZXRTZXJ2aWNlUG9saWN5KCAiaWQzIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElTZXJ2aWNlUG9saWN5ICAgICAgICAgIGlkNCAgICAgICAgID0gcGxhdGZvcm0uZ2V0U2VydmljZVBvbGljeSggImlkNCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBMaXN0PElTZXJ2aWNlUG9saWN5PiAgICBwb2xpY3lMaXN0MSA9IG5ldyBWZWN0b3I8SVNlcnZpY2VQb2xpY3k+KCk7Ci0gICAgIExpc3Q8SVNlcnZpY2VQb2xpY3k+ICAgIHBvbGljeUxpc3QyID0gbmV3IFZlY3RvcjxJU2VydmljZVBvbGljeT4oKTsKLSAgICAgSVBvbGljeU9wZXJhdGlvbiAgICAgICAgb3AxICAgICAgICAgPSBwbGF0Zm9ybVVJLmdldE9wZXJhdGlvbiggaWQ0LCAic2VydmljZS51aS5vcGVyYXRpb24zIiApOyAvLyROT04tTkxTLTEkCi0gICAgIAotICAgICBwb2xpY3lMaXN0MS5hZGQoIGlkMSApOwotICAgICBwb2xpY3lMaXN0MS5hZGQoIGlkMiApOwotICAgICBwb2xpY3lMaXN0MS5hZGQoIGlkMyApOwotICAgICBwb2xpY3lMaXN0MS5hZGQoIGlkNCApOwotICAgICBwb2xpY3lMaXN0Mi5hZGQoIGlkNCApOwotICAgICAKLSAgICAgYXNzZXJ0VHJ1ZSggIkV4cGVjdGVkIG9wZXJhdGlvbiB0byBub3QgYmUgZW5hYmxlZCIsICFvcDEuaXNFbmFibGVkKCBwb2xpY3lMaXN0MSApICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgYXNzZXJ0VHJ1ZSggIkV4cGVjdGVkIG9wZXJhdGlvbiB0byBiZSBlbmFibGVkIiwgb3AxLmlzRW5hYmxlZCggcG9saWN5TGlzdDIgKSApOyAvLyROT04tTkxTLTEkCi0gICB9Ci0gICAKLSAgIHB1YmxpYyB2b2lkIHRlc3RRdWlja0ZpeEFjdGlvbnMoKQotICAgewotICAgICBTZXJ2aWNlUG9saWN5UGxhdGZvcm0gICAgICBwbGF0Zm9ybSAgICA9IFNlcnZpY2VQb2xpY3lQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpOwotICAgICBTZXJ2aWNlUG9saWN5UGxhdGZvcm1VSSAgICBwbGF0Zm9ybVVJICA9IFNlcnZpY2VQb2xpY3lQbGF0Zm9ybVVJLmdldEluc3RhbmNlKCk7Ci0gICAgIElTZXJ2aWNlUG9saWN5ICAgICAgICAgICAgIGlkMSAgICAgICAgID0gcGxhdGZvcm0uZ2V0U2VydmljZVBvbGljeSggImlkMSIgKTsgLy8kTk9OLU5MUy0xJAotICAgICBJU3RhdHVzICAgICAgICAgICAgICAgICAgICBzdGF0dXMxICAgICA9IG5ldyBTdGF0dXMoIElTdGF0dXMuRVJST1IsICJvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdCIsIDEsICJzb21lIGVycm9yIiwgbnVsbCApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgSVN0YXR1cyAgICAgICAgICAgICAgICAgICAgc3RhdHVzMiAgICAgPSBuZXcgU3RhdHVzKCBJU3RhdHVzLkVSUk9SLCAib3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3QiLCAyLCAic29tZSBlcnJvciIsIG51bGwgKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgIExpc3Q8SVF1aWNrRml4QWN0aW9uSW5mbz4gIGZpeExpc3QxICAgID0gcGxhdGZvcm1VSS5nZXRRdWlja0ZpeGVzKCBzdGF0dXMxICk7Ci0gICAgIExpc3Q8SVF1aWNrRml4QWN0aW9uSW5mbz4gIGZpeExpc3QyICAgID0gcGxhdGZvcm1VSS5nZXRRdWlja0ZpeGVzKCBzdGF0dXMyICk7Ci0gICAgIAotICAgICBhc3NlcnRUcnVlKCAiRXhwZWN0aW5nIHR3byBxdWljayBmaXhlcyIsIGZpeExpc3QxLnNpemUoKSA9PSAyICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgYXNzZXJ0VHJ1ZSggIkV4cGVjdGlvbiBvbmUgcXVpY2sgZml4IiwgZml4TGlzdDIuc2l6ZSgpID09IDEgKTsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgZm9yKCBJUXVpY2tGaXhBY3Rpb25JbmZvIGFjdGlvbkluZm8gOiBmaXhMaXN0MSApCi0gICAgIHsKLSAgICAgICBJUXVpY2tGaXhBY3Rpb24gYWN0aW9uID0gYWN0aW9uSW5mby5nZXRBY3Rpb24oKTsKLSAgICAgICBpZDEuc2V0U3RhdHVzKCBzdGF0dXMxICk7Ci0gICAgICAgCi0gICAgICAgYXNzZXJ0VHJ1ZSggIlN0YXR1cyBpcyBub3QgT0siLCAhaWQxLmdldFN0YXR1cygpLmlzT0soKSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgYWN0aW9uLmFjdGlvbiggaWQxICk7Ci0gICAgICAgYXNzZXJ0VHJ1ZSggIlN0YXR1cyBpcyBPayAiLCBpZDEuZ2V0U3RhdHVzKCkuaXNPSygpICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgfQotICAgICAKLSAgICAgZm9yKCBJUXVpY2tGaXhBY3Rpb25JbmZvIGFjdGlvbkluZm8gOiBmaXhMaXN0MiApCi0gICAgIHsKLSAgICAgICBJUXVpY2tGaXhBY3Rpb24gYWN0aW9uID0gYWN0aW9uSW5mby5nZXRBY3Rpb24oKTsKLSAgICAgICBpZDEuc2V0U3RhdHVzKCBzdGF0dXMyICk7Ci0gICAgICAgCi0gICAgICAgYXNzZXJ0VHJ1ZSggIlN0YXR1cyBpcyBub3QgT0siLCAhaWQxLmdldFN0YXR1cygpLmlzT0soKSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgYWN0aW9uLmFjdGlvbiggaWQxICk7Ci0gICAgICAgYXNzZXJ0VHJ1ZSggIlN0YXR1cyBpcyBPayAiLCBpZDEuZ2V0U3RhdHVzKCkuaXNPSygpICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgfQotICAgfQotICAgCi0gICBwdWJsaWMgdm9pZCB0ZXN0QWN0aXZpdGllc0ZpbHRlcigpCi0gICB7Ci0gICAgIElGaWx0ZXIgICAgICAgICAgICAgICAgICAgIGFjdGl2aXRpZXNGaWx0ZXIgPSBBY3Rpdml0eVV0aWxzLmdldEN1cnJlbnRBY3Rpdml0aWVzRmlsdGVyKCk7Ci0gICAgIFNlcnZpY2VQb2xpY3lQbGF0Zm9ybSAgICAgIHBsYXRmb3JtICAgICAgICAgPSBTZXJ2aWNlUG9saWN5UGxhdGZvcm0uZ2V0SW5zdGFuY2UoKTsKLSAgICAgTGlzdDxJU2VydmljZVBvbGljeT4gICAgICAgcG9saWN5TGlzdCAgICAgICA9IHBsYXRmb3JtLmdldFJvb3RTZXJ2aWNlUG9saWNpZXMoIGFjdGl2aXRpZXNGaWx0ZXIgKTsKLSAgICAgICAgIAotICAgICBkaXNwbGF5UG9saWNpZXMoIHBvbGljeUxpc3QgKTsKLSAgIH0KLSAgIAotICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRPcGVyYXRpb25zTGlzdCgpCi0gICB7Ci0gICAgIFNlcnZpY2VQb2xpY3lQbGF0Zm9ybSAgIHBsYXRmb3JtICAgPSBTZXJ2aWNlUG9saWN5UGxhdGZvcm0uZ2V0SW5zdGFuY2UoKTsKLSAgICAgU2VydmljZVBvbGljeVBsYXRmb3JtVUkgcGxhdGZvcm1VSSA9IFNlcnZpY2VQb2xpY3lQbGF0Zm9ybVVJLmdldEluc3RhbmNlKCk7Ci0gICAgIElTZXJ2aWNlUG9saWN5ICAgICAgICAgIGlkMSAgICAgICAgPSBwbGF0Zm9ybS5nZXRTZXJ2aWNlUG9saWN5KCAiaWQxIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElTZXJ2aWNlUG9saWN5ICAgICAgICAgIGlkMiAgICAgICAgPSBwbGF0Zm9ybS5nZXRTZXJ2aWNlUG9saWN5KCAiaWQyIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElTZXJ2aWNlUG9saWN5ICAgICAgICAgIGlkMyAgICAgICAgPSBwbGF0Zm9ybS5nZXRTZXJ2aWNlUG9saWN5KCAiaWQzIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElTZXJ2aWNlUG9saWN5ICAgICAgICAgIGlkNCAgICAgICAgPSBwbGF0Zm9ybS5nZXRTZXJ2aWNlUG9saWN5KCAiaWQ0IiApOyAvLyROT04tTkxTLTEkCi0gICAgIElQb2xpY3lPcGVyYXRpb24gICAgICAgIG9wMV9pZDIgICAgPSBwbGF0Zm9ybVVJLmdldE9wZXJhdGlvbiggaWQyLCAic2VydmljZS51aS5vcGVyYXRpb24xIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElQb2xpY3lPcGVyYXRpb24gICAgICAgIG9wMV9pZDMgICAgPSBwbGF0Zm9ybVVJLmdldE9wZXJhdGlvbiggaWQzLCAic2VydmljZS51aS5vcGVyYXRpb24xIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElQb2xpY3lPcGVyYXRpb24gICAgICAgIG9wMl9pZDEgICAgPSBwbGF0Zm9ybVVJLmdldE9wZXJhdGlvbiggaWQxLCAic2VydmljZS51aS5vcGVyYXRpb24yIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElQb2xpY3lPcGVyYXRpb24gICAgICAgIG9wMl9pZDIgICAgPSBwbGF0Zm9ybVVJLmdldE9wZXJhdGlvbiggaWQyLCAic2VydmljZS51aS5vcGVyYXRpb24yIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElQb2xpY3lPcGVyYXRpb24gICAgICAgIG9wMl9pZDMgICAgPSBwbGF0Zm9ybVVJLmdldE9wZXJhdGlvbiggaWQzLCAic2VydmljZS51aS5vcGVyYXRpb24yIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElQb2xpY3lPcGVyYXRpb24gICAgICAgIG9wMl9pZDQgICAgPSBwbGF0Zm9ybVVJLmdldE9wZXJhdGlvbiggaWQ0LCAic2VydmljZS51aS5vcGVyYXRpb24yIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElQb2xpY3lPcGVyYXRpb24gICAgICAgIG9wM19pZDQgICAgPSBwbGF0Zm9ybVVJLmdldE9wZXJhdGlvbiggaWQ0LCAic2VydmljZS51aS5vcGVyYXRpb24zIiApOyAvLyROT04tTkxTLTEkCi0gICAgIElQb2xpY3lPcGVyYXRpb24gICAgICAgIG9wNF9pZDEgICAgPSBwbGF0Zm9ybVVJLmdldE9wZXJhdGlvbiggaWQxLCAic2VydmljZS51aS5vcGVyYXRpb240IiApOyAvLyROT04tTkxTLTEkCi0gICAgIElQb2xpY3lPcGVyYXRpb24gICAgICAgIG9wNF9pZDIgICAgPSBwbGF0Zm9ybVVJLmdldE9wZXJhdGlvbiggaWQyLCAic2VydmljZS51aS5vcGVyYXRpb240IiApOyAvLyROT04tTkxTLTEkCi0gICAgIElQb2xpY3lPcGVyYXRpb24gICAgICAgIG9wNF9pZDMgICAgPSBwbGF0Zm9ybVVJLmdldE9wZXJhdGlvbiggaWQzLCAic2VydmljZS51aS5vcGVyYXRpb240IiApOyAvLyROT04tTkxTLTEkCi0gICAgIExpc3Q8SVNlcnZpY2VQb2xpY3k+ICAgIGlkTGlzdDEgICAgPSBudWxsOwotICAgICBMaXN0PElTZXJ2aWNlUG9saWN5PiAgICBpZExpc3QyICAgID0gbnVsbDsKLSAgICAgTGlzdDxJU2VydmljZVBvbGljeT4gICAgaWRMaXN0MyAgICA9IG51bGw7Ci0gICAgIExpc3Q8SVNlcnZpY2VQb2xpY3k+ICAgIGlkTGlzdDQgICAgPSBudWxsOwotICAgICAKLSAgICAgTGlzdDxMaXN0PElQb2xpY3lPcGVyYXRpb24+PiBjaGVja0xpc3QxID0gbnVsbDsKLSAgICAgTGlzdDxMaXN0PElQb2xpY3lPcGVyYXRpb24+PiBjaGVja0xpc3QyID0gbnVsbDsKLSAgICAgTGlzdDxMaXN0PElQb2xpY3lPcGVyYXRpb24+PiBjaGVja0xpc3QzID0gbnVsbDsKLSAgICAgTGlzdDxMaXN0PElQb2xpY3lPcGVyYXRpb24+PiBjaGVja0xpc3Q0ID0gbnVsbDsKLSAgICAgCi0gICAgIGNoZWNrTGlzdDEgPSBsbCggbChvcDJfaWQxKSwgbChvcDRfaWQxKSApOwotICAgICBjaGVja0xpc3QyID0gbGwoIGwob3AxX2lkMiksIGwob3AyX2lkMSwgb3AyX2lkMiksIGwob3A0X2lkMSwgb3A0X2lkMikgKTsKLSAgICAgY2hlY2tMaXN0MyA9IGxsKCBsKG9wMV9pZDIsIG9wMV9pZDMpLCBsKG9wMl9pZDEsIG9wMl9pZDIsIG9wMl9pZDMpLCBsKG9wNF9pZDEsIG9wNF9pZDIsIG9wNF9pZDMpICk7Ci0gICAgIGNoZWNrTGlzdDQgPSBsbCggbChvcDFfaWQyLCBvcDFfaWQzKSwgbChvcDJfaWQxLCBvcDJfaWQyLCBvcDJfaWQzLCBvcDJfaWQ0KSwgbChvcDNfaWQ0KSwgbChvcDRfaWQxLCBvcDRfaWQyLCBvcDRfaWQzKSApOwotICAgICAKLSAgICAgaWRMaXN0MSA9IEFycmF5cy5hc0xpc3QoIG5ldyBJU2VydmljZVBvbGljeVtdeyBpZDEgfSApOwotICAgICBpZExpc3QyID0gQXJyYXlzLmFzTGlzdCggbmV3IElTZXJ2aWNlUG9saWN5W117IGlkMSwgaWQyIH0gKTsKLSAgICAgaWRMaXN0MyA9IEFycmF5cy5hc0xpc3QoIG5ldyBJU2VydmljZVBvbGljeVtdeyBpZDEsIGlkMiwgaWQzIH0gKTsKLSAgICAgaWRMaXN0NCA9IEFycmF5cy5hc0xpc3QoIG5ldyBJU2VydmljZVBvbGljeVtdeyBpZDEsIGlkMiwgaWQzLCBpZDQgfSApOwotICAgICAKLSAgICAgTGlzdDxMaXN0PElQb2xpY3lPcGVyYXRpb24+PiBvcExpc3QxID0gcGxhdGZvcm1VSS5nZXRPcGVyYXRpb25zTGlzdCggaWRMaXN0MSwgdHJ1ZSApOwotICAgICBMaXN0PExpc3Q8SVBvbGljeU9wZXJhdGlvbj4+IG9wTGlzdDIgPSBwbGF0Zm9ybVVJLmdldE9wZXJhdGlvbnNMaXN0KCBpZExpc3QyLCB0cnVlICk7Ci0gICAgIExpc3Q8TGlzdDxJUG9saWN5T3BlcmF0aW9uPj4gb3BMaXN0MyA9IHBsYXRmb3JtVUkuZ2V0T3BlcmF0aW9uc0xpc3QoIGlkTGlzdDMsIHRydWUgKTsKLSAgICAgTGlzdDxMaXN0PElQb2xpY3lPcGVyYXRpb24+PiBvcExpc3Q0ID0gcGxhdGZvcm1VSS5nZXRPcGVyYXRpb25zTGlzdCggaWRMaXN0NCwgdHJ1ZSApOwotICAgICAKLSAgICAgdmVyaWZ5TGlzdHMoICJMaXN0MSIsIG9wTGlzdDEsIGNoZWNrTGlzdDEgKTsKLSAgICAgdmVyaWZ5TGlzdHMoICJMaXN0MiIsIG9wTGlzdDIsIGNoZWNrTGlzdDIgKTsKLSAgICAgdmVyaWZ5TGlzdHMoICJMaXN0MyIsIG9wTGlzdDMsIGNoZWNrTGlzdDMgKTsKLSAgICAgdmVyaWZ5TGlzdHMoICJMaXN0NCIsIG9wTGlzdDQsIGNoZWNrTGlzdDQgKTsKLSAgIH0KLSAgIAotICAgcHJpdmF0ZSBMaXN0PExpc3Q8SVBvbGljeU9wZXJhdGlvbj4+IGxsKCBMaXN0PElQb2xpY3lPcGVyYXRpb24+Li4uIG9wTGlzdCApCi0gICB7Ci0gICAgIHJldHVybiBBcnJheXMuYXNMaXN0KCBvcExpc3QgKTsKLSAgIH0KLSAgIAotICAgcHJpdmF0ZSBMaXN0PElQb2xpY3lPcGVyYXRpb24+IGwoIElQb2xpY3lPcGVyYXRpb24uLi4gb3BMaXN0ICkKLSAgIHsKLSAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoIG9wTGlzdCApOwotICAgfQotICAgCi0gICBwcml2YXRlIHZvaWQgdmVyaWZ5TGlzdHMoIFN0cmluZyBsaXN0TmFtZSwgTGlzdDxMaXN0PElQb2xpY3lPcGVyYXRpb24+PiBsaXN0MSwgTGlzdDxMaXN0PElQb2xpY3lPcGVyYXRpb24+PiBsaXN0MiApCi0gICB7Ci0gICAgIGFzc2VydFRydWUoIGxpc3ROYW1lICsgIiBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHNpemUuIiwgbGlzdDEuc2l6ZSgpID09IGxpc3QyLnNpemUoKSApOwotICAgICAgICAgICAgIAotICAgICBmb3IoIGludCBsaXN0SW5kZXggPSAwIDsgbGlzdEluZGV4IDwgbGlzdDEuc2l6ZSgpOyBsaXN0SW5kZXgrKyApCi0gICAgIHsKLSAgICAgICBMaXN0PElQb2xpY3lPcGVyYXRpb24+IHBvbGljeUxpc3QxID0gbGlzdDEuZ2V0KCBsaXN0SW5kZXggKTsKLSAgICAgICBMaXN0PElQb2xpY3lPcGVyYXRpb24+IHBvbGljeUxpc3QyID0gZmluZExpc3QoIHBvbGljeUxpc3QxLmdldCgwKS5nZXRJZCgpLCBsaXN0MiApOwotICAgICAgIAotICAgICAgIGFzc2VydFRydWUoIGxpc3ROYW1lICsgIiBuZXN0ZWQgbGlzdCBhdCBpbmRleCAiICsgbGlzdEluZGV4ICsgIiBpcyBub3QgdGhlIHNhbWUgc2l6ZS4iLCBwb2xpY3lMaXN0MS5zaXplKCkgPT0gcG9saWN5TGlzdDIuc2l6ZSgpICk7Ci0gICAgICAgCi0gICAgICAgZm9yKCBpbnQgaW5kZXggPSAwOyBpbmRleCA8IHBvbGljeUxpc3QxLnNpemUoKTsgaW5kZXgrKyApCi0gICAgICAgewotICAgICAgICAgSVBvbGljeU9wZXJhdGlvbiBvcDEgPSBwb2xpY3lMaXN0MS5nZXQoIGluZGV4ICk7Ci0gICAgICAgICAKLSAgICAgICAgIGFzc2VydFRydWUoIGxpc3ROYW1lICsgIiBvcGVyYXRpb24gbm90IGZvdW5kIiwgZmluZE9wKCBvcDEsIHBvbGljeUxpc3QyICkgKTsKLSAgICAgICB9Ci0gICAgIH0gIAotICAgfQotICAKLSAgIHByaXZhdGUgYm9vbGVhbiBmaW5kT3AoIElQb2xpY3lPcGVyYXRpb24gb3AsIExpc3Q8SVBvbGljeU9wZXJhdGlvbj4gbGlzdCApCi0gICB7Ci0gICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgIAotICAgICBmb3IoIElQb2xpY3lPcGVyYXRpb24gZm91bmRPcCA6IGxpc3QgKQotICAgICB7Ci0gICAgICAgaWYoIG9wID09IGZvdW5kT3AgKQotICAgICAgIHsKLSAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICBicmVhazsKLSAgICAgICB9Ci0gICAgIH0KLSAgICAgCi0gICAgIHJldHVybiByZXN1bHQ7Ci0gICB9Ci0gICAKLSAgIHByaXZhdGUgTGlzdDxJUG9saWN5T3BlcmF0aW9uPiBmaW5kTGlzdCggU3RyaW5nIGlkLCBMaXN0PExpc3Q8SVBvbGljeU9wZXJhdGlvbj4+IHNlYXJjaExpc3QgKQotICAgewotICAgICBmb3IoIExpc3Q8SVBvbGljeU9wZXJhdGlvbj4gcG9saWN5TGlzdCA6IHNlYXJjaExpc3QgKQotICAgICB7Ci0gICAgICAgaWYoIHBvbGljeUxpc3QuZ2V0KDApLmdldElkKCkuZXF1YWxzKCBpZCApICkKLSAgICAgICB7Ci0gICAgICAgICByZXR1cm4gcG9saWN5TGlzdDsKLSAgICAgICB9Ci0gICAgIH0KLSAgICAgCi0gICAgIGFzc2VydFRydWUoICJMaXN0IG5vdCBmb3VuZCBmb3IgaWQiICsgaWQsIGZhbHNlICk7Ci0gICAgIHJldHVybiBudWxsOwotICAgfQotICAgCi0gICBwcml2YXRlIHZvaWQgZGlzcGxheVBvbGljaWVzKCBMaXN0PElTZXJ2aWNlUG9saWN5PiBwb2xpY3lMaXN0ICkKLSAgIHsKLSAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiTGlzdGluZyBzZXJ2aWNlIHBvbGljaWVzOiIgKTsKLSAgICAgZm9yKCBJU2VydmljZVBvbGljeSBwb2xpY3kgOiBwb2xpY3lMaXN0ICkKLSAgICAgewotICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIiAgIiArIHBvbGljeS5nZXRJZCgpICk7Ci0gICAgIH0KLSAgIH0KLSAgIAotICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlMaXN0KCBTdHJpbmcgc2V0TmFtZSwgTGlzdDxJUG9saWN5T3BlcmF0aW9uPiBvcGVyYXRpb25MaXN0ICkKLSAgIHsKLSAgICAgU3lzdGVtLm91dC5wcmludCggc2V0TmFtZSArICI6ICIgKTsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgZm9yKCBJUG9saWN5T3BlcmF0aW9uIG9wZXJhdGlvbiA6IG9wZXJhdGlvbkxpc3QgKQotICAgICB7Ci0gICAgICAgU3lzdGVtLm91dC5wcmludCggb3BlcmF0aW9uLmdldElkKCkgKyAiLCIgKTsgLy8kTk9OLU5MUy0xJAotICAgICB9Ci0gICAgIAotICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICIiICk7IC8vJE5PTi1OTFMtMSQKLSAgIH0KLSAgIAotICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ29udGVudHMoIFN0cmluZyBzZXROYW1lLCBMaXN0PElQb2xpY3lPcGVyYXRpb24+IG9wZXJhdGlvblNldCwgSVBvbGljeU9wZXJhdGlvbltdIG9wZXJhdGlvbkFycmF5ICkKLSAgIHsKLSAgICAgYXNzZXJ0VHJ1ZSggIlNldCBhbmQgYXJyYXkgc2l6ZXMgZG9uJ3QgbWF0Y2ggZm9yICIgKyBzZXROYW1lICsgIi4iLCBvcGVyYXRpb25TZXQuc2l6ZSgpID09IG9wZXJhdGlvbkFycmF5Lmxlbmd0aCApOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICBmb3IoIElQb2xpY3lPcGVyYXRpb24gb3BlcmF0aW9uIDogb3BlcmF0aW9uQXJyYXkgKQotICAgICB7Ci0gICAgICAgYXNzZXJ0VHJ1ZSggc2V0TmFtZSArICIgZG9lcyBub3QgY29udGFpbiBvcGVyYXRpb24gIiArIG9wZXJhdGlvbi5nZXRJZCgpICsgIi4iLCBvcGVyYXRpb25TZXQuY29udGFpbnMoIG9wZXJhdGlvbiApICk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICB9Ci0gICB9Ci0gICAKLSAgIHByaXZhdGUgdm9pZCBkaXNwbGF5T3BlcmF0aW9uKCBJUG9saWN5T3BlcmF0aW9uIG9wZXJhdGlvbiApCi0gICB7Ci0gICAgIExpc3Q8SVNlcnZpY2VQb2xpY3k+IHplcm9Qb2xpY2llcyA9IG5ldyBWZWN0b3I8SVNlcnZpY2VQb2xpY3k+KCk7Ci0gICAgIExpc3Q8SVNlcnZpY2VQb2xpY3k+IG1hbnlQb2xpY2llcyA9IFNlcnZpY2VQb2xpY3lQbGF0Zm9ybS5nZXRJbnN0YW5jZSgpLmdldFJvb3RTZXJ2aWNlUG9saWNpZXMoIG51bGwgKTsKLSAgICAgSURlc2NyaXB0b3IgICAgICAgICAgIGRlc2NyaXB0b3IgICA9IG9wZXJhdGlvbi5nZXREZXNjcmlwdG9yKCk7Ci0gICAgIFN0cmluZyAgICAgICAgICAgICAgIHNob3J0TmFtZSAgICA9IGRlc2NyaXB0b3IuZ2V0U2hvcnROYW1lKCk7Ci0gICAgIFN0cmluZyAgICAgICAgICAgICAgIGxvbmdOYW1lICAgICA9IGRlc2NyaXB0b3IuZ2V0TG9uZ05hbWUoKTsKLSAgICAgCi0gICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIk9wZXJhdGlvbiBpZDogIiArIG9wZXJhdGlvbi5nZXRJZCgpICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiICAgICAgICAgIHNob3J0IG5hbWU6ICIgKyBzaG9ydE5hbWUgKTsgLy8kTk9OLU5MUy0xJAotICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICIgICAgICAgICAgbG9uZyBuYW1lOiAiICsgbG9uZ05hbWUgKTsgLy8kTk9OLU5MUy0xJAotICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICIgICAgICAgICAgcGF0dGVybjogIiArIG9wZXJhdGlvbi5nZXRQb2xpY3lJZFBhdHRlcm4oKSApOyAvLyROT04tTkxTLTEkCi0gICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIiAgICAgICAgICBpc0VuYWJsZWQgemVybzogIiArIG9wZXJhdGlvbi5pc0VuYWJsZWQoIHplcm9Qb2xpY2llcyApICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiICAgICAgICAgIGlzRW5hYmxlZCBtYW55OiAiICsgb3BlcmF0aW9uLmlzRW5hYmxlZCggbWFueVBvbGljaWVzICkgKTsgLy8kTk9OLU5MUy0xJAotICAgICAKLSAgICAgc3dpdGNoKCBvcGVyYXRpb24uZ2V0T3BlcmF0aW9uS2luZCgpICkKLSAgICAgewotICAgICAgIGNhc2Ugc2VsZWN0aW9uOgotICAgICAgIHsKLSAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIiAgICAgICAgICBzZWxlY3Rpb246IHRydWUiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgIGJyZWFrOyAgCi0gICAgICAgfQotICAgICAgIAotICAgICAgIGNhc2UgaWNvblNlbGVjdGlvbjoKLSAgICAgICB7Ci0gICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICIgICAgICAgICAgc2VsZWN0aW9uIGljb246IHRydWUiICk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgIGJyZWFrOyAgCi0gICAgICAgfQotICAgICAgIAotICAgICAgIGNhc2UgZW51bWVyYXRpb246Ci0gICAgICAgeyAgICAgIAotICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiICAgICAgICAgIGVudW1lcmF0aW9uIGlkOiAiICsgb3BlcmF0aW9uLmdldEVudW1lcmF0aW9uSWQoKSApOyAvLyROT04tTkxTLTEkCi0gICAgICAgICBicmVhazsgIAotICAgICAgIH0KLSAgICAgICAKLSAgICAgICBjYXNlIGNvbXBsZXg6Ci0gICAgICAgewotICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiICAgICAgICAgIGNvbXBsZXg6IHRydWUiICk7ICAvLyROT04tTkxTLTEkCi0gICAgICAgICBvcGVyYXRpb24ubGF1bmNoT3BlcmF0aW9uKCB6ZXJvUG9saWNpZXMgKTsKLSAgICAgICAgIGJyZWFrOyAgCi0gICAgICAgfQotICAgICB9Ci0gICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3NlcnZpY2UvcG9saWN5L3Rlc3QvU2VydmljZVBvbGljeXRUZXN0QWN0aXZhdG9yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3NlcnZpY2UvcG9saWN5L3Rlc3QvU2VydmljZVBvbGljeXRUZXN0QWN0aXZhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YWZjZDAuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3Qvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9zZXJ2aWNlL3BvbGljeS90ZXN0L1NlcnZpY2VQb2xpY3l0VGVzdEFjdGl2YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNyBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiB5eXl5bW1kZCBidWcgICAgICBFbWFpbCBhbmQgb3RoZXIgY29udGFjdCBpbmZvcm1hdGlvbgotICogLS0tLS0tLS0gLS0tLS0tLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIDIwMDcxMDI0ICAgMTk2OTk3IHBtb29na0BjYS5pYm0uY29tIC0gUGV0ZXIgTW9vZ2sKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RhcnR1cDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgYWN0aXZhdG9yIGNsYXNzIGNvbnRyb2xzIHRoZSBwbHVnLWluIGxpZmUgY3ljbGUKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VQb2xpY3l0VGVzdEFjdGl2YXRvciBleHRlbmRzIFBsdWdpbiBpbXBsZW1lbnRzIElTdGFydHVwIHsKLQotCS8vIFRoZSBwbHVnLWluIElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zZXJ2aWNlLnBvbGljeS50ZXN0IjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZQotCXByaXZhdGUgc3RhdGljIFNlcnZpY2VQb2xpY3l0VGVzdEFjdGl2YXRvciBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFNlcnZpY2VQb2xpY3l0VGVzdEFjdGl2YXRvcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW5zI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcGx1Z2luID0gbnVsbDsKLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaGFyZWQgaW5zdGFuY2UKLQkgKgotCSAqIEByZXR1cm4gdGhlIHNoYXJlZCBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU2VydmljZVBvbGljeXRUZXN0QWN0aXZhdG9yIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCQotICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXJyb3IoIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjICkKLSAgewotICAgIElTdGF0dXMgc3RhdHVzID0gbmV3IFN0YXR1cyggSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lELCAwLCBtZXNzYWdlLCBleGMgKTsKLSAgICAKLSAgICBnZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKHN0YXR1cyk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGVhcmx5U3RhcnR1cCgpCi0gIHsKLSAgICAvLyBETyBub3RoaW5nLiAgQWxsIHdlIHdhbnQgdG8gZG8gaXMgZ2V0IHRoZSBwbHVnaW4gbG9hZGVkIGF0IFVJIHN0YXJ0IHRpbWUuCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L3NyYy9vcmcvZWNsaXBzZS93c3Qvd3Mvc2VydmljZS9wb2xpY3kvdGVzdC9UZXN0RW5hYmxlZENsYXNzLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3NlcnZpY2UvcG9saWN5L3Rlc3QvVGVzdEVuYWJsZWRDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmI4ZDMzLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L3NyYy9vcmcvZWNsaXBzZS93c3Qvd3Mvc2VydmljZS9wb2xpY3kvdGVzdC9UZXN0RW5hYmxlZENsYXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzEwMjQgICAxOTY5OTcgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29nawotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kuSVNlcnZpY2VQb2xpY3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnVpLklFbmFibGVPcGVyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBUZXN0RW5hYmxlZENsYXNzIGltcGxlbWVudHMgSUVuYWJsZU9wZXJhdGlvbgotewotCi0gIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChMaXN0PElTZXJ2aWNlUG9saWN5PiBzZWxlY3RlZFBvbGljaWVzKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiICAgICAgICAgIElzIGVuYWJsZWQgb3BlcmF0aW9uIGNhbGxlZC4iICk7IC8vJE5PTi1OTFMtMSQKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3Qvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9zZXJ2aWNlL3BvbGljeS90ZXN0L1Rlc3RMYXVuY2hDbGFzcy5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3Qvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9zZXJ2aWNlL3BvbGljeS90ZXN0L1Rlc3RMYXVuY2hDbGFzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Nzk0NWIwLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L3NyYy9vcmcvZWNsaXBzZS93c3Qvd3Mvc2VydmljZS9wb2xpY3kvdGVzdC9UZXN0TGF1bmNoQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDcgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogeXl5eW1tZGQgYnVnICAgICAgRW1haWwgYW5kIG90aGVyIGNvbnRhY3QgaW5mb3JtYXRpb24KLSAqIC0tLS0tLS0tIC0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAyMDA3MTAyNCAgIDE5Njk5NyBwbW9vZ2tAY2EuaWJtLmNvbSAtIFBldGVyIE1vb2drCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS5JU2VydmljZVBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudWkuSUxhdW5jaE9wZXJhdGlvbjsKLQotcHVibGljIGNsYXNzIFRlc3RMYXVuY2hDbGFzcyBpbXBsZW1lbnRzIElMYXVuY2hPcGVyYXRpb24KLXsKLQotICBwdWJsaWMgdm9pZCBsYXVuY2goTGlzdDxJU2VydmljZVBvbGljeT4gc2VsZWN0ZWRQb2xpY2llcykKLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIiAgICAgICAgICBMYXVuY2ggY2xhc3MgY2FsbGVkLiIgKTsgLy8kTk9OLU5MUy0xJAotICB9ICAKLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L3NyYy9vcmcvZWNsaXBzZS93c3Qvd3Mvc2VydmljZS9wb2xpY3kvdGVzdC9hY3Rpb24xLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3NlcnZpY2UvcG9saWN5L3Rlc3QvYWN0aW9uMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGMzNGFkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L3NyYy9vcmcvZWNsaXBzZS93c3Qvd3Mvc2VydmljZS9wb2xpY3kvdGVzdC9hY3Rpb24xLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzExMjAgICAxOTY5OTcgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29naywgSW5pdGlhbCBjb2RpbmcuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS5JU2VydmljZVBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudWkuSVF1aWNrRml4QWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgYWN0aW9uMSBpbXBsZW1lbnRzIElRdWlja0ZpeEFjdGlvbgotewotCi0gIHB1YmxpYyB2b2lkIGFjdGlvbihJU2VydmljZVBvbGljeSBwb2xpY3kpCi0gIHsKLSAgICBwb2xpY3kuc2V0U3RhdHVzKCBTdGF0dXMuT0tfU1RBVFVTICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L3NyYy9vcmcvZWNsaXBzZS93c3Qvd3Mvc2VydmljZS9wb2xpY3kvdGVzdC9hY3Rpb24yLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3NlcnZpY2UvcG9saWN5L3Rlc3QvYWN0aW9uMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTNlODU4Li4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L3NyYy9vcmcvZWNsaXBzZS93c3Qvd3Mvc2VydmljZS9wb2xpY3kvdGVzdC9hY3Rpb24yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzExMjAgICAxOTY5OTcgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29naywgSW5pdGlhbCBjb2RpbmcuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS5JU2VydmljZVBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudWkuSVF1aWNrRml4QWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgYWN0aW9uMiBpbXBsZW1lbnRzIElRdWlja0ZpeEFjdGlvbgotewotCi0gIHB1YmxpYyB2b2lkIGFjdGlvbihJU2VydmljZVBvbGljeSBwb2xpY3kpCi0gIHsKLSAgICBwb2xpY3kuc2V0U3RhdHVzKCBTdGF0dXMuT0tfU1RBVFVTICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L3NyYy9vcmcvZWNsaXBzZS93c3Qvd3Mvc2VydmljZS9wb2xpY3kvdGVzdC9hY3Rpb24zLmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudGVzdC9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzL3NlcnZpY2UvcG9saWN5L3Rlc3QvYWN0aW9uMy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGQ5NzdkLi4wMDAwMDAwCi0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L3NyYy9vcmcvZWNsaXBzZS93c3Qvd3Mvc2VydmljZS9wb2xpY3kvdGVzdC9hY3Rpb24zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA3IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqIHl5eXltbWRkIGJ1ZyAgICAgIEVtYWlsIGFuZCBvdGhlciBjb250YWN0IGluZm9ybWF0aW9uCi0gKiAtLS0tLS0tLSAtLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogMjAwNzExMjAgICAxOTY5OTcgcG1vb2drQGNhLmlibS5jb20gLSBQZXRlciBNb29naywgSW5pdGlhbCBjb2RpbmcuCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS5JU2VydmljZVBvbGljeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3Muc2VydmljZS5wb2xpY3kudWkuSVF1aWNrRml4QWN0aW9uOwotCi1wdWJsaWMgY2xhc3MgYWN0aW9uMyBpbXBsZW1lbnRzIElRdWlja0ZpeEFjdGlvbgotewotCi0gIHB1YmxpYyB2b2lkIGFjdGlvbihJU2VydmljZVBvbGljeSBwb2xpY3kpCi0gIHsKLSAgICBwb2xpY3kuc2V0U3RhdHVzKCBTdGF0dXMuT0tfU1RBVFVTICk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0L3NyYy9vcmcvZWNsaXBzZS93c3Qvd3Mvc2VydmljZS9wb2xpY3kvdGVzdC9pbnRlcm5hbC9wcm9wZXJ0aWVzL0ZPT0ZpbGVQcm9wZXJ0eVRlc3Rlci5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3Qvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9zZXJ2aWNlL3BvbGljeS90ZXN0L2ludGVybmFsL3Byb3BlcnRpZXMvRk9PRmlsZVByb3BlcnR5VGVzdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ODNlYTcuLjAwMDAwMDAKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzLnNlcnZpY2UucG9saWN5LnRlc3Qvc3JjL29yZy9lY2xpcHNlL3dzdC93cy9zZXJ2aWNlL3BvbGljeS90ZXN0L2ludGVybmFsL3Byb3BlcnRpZXMvRk9PRmlsZVByb3BlcnR5VGVzdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC53cy5zZXJ2aWNlLnBvbGljeS50ZXN0LmludGVybmFsLnByb3BlcnRpZXM7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZXhwcmVzc2lvbnMuUHJvcGVydHlUZXN0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBGT09GaWxlUHJvcGVydHlUZXN0ZXIgZXh0ZW5kcyBQcm9wZXJ0eVRlc3RlcgotewotICBwdWJsaWMgYm9vbGVhbiB0ZXN0KE9iamVjdCByZWNlaXZlciwgU3RyaW5nIHByb3BlcnR5LCBPYmplY3RbXSBhcmdzLCBPYmplY3QgZXhwZWN0ZWRWYWx1ZSkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgaWYoIHJlY2VpdmVyIGluc3RhbmNlb2YgSUNvbnRhaW5lcikKLSAgICB7Ci0gICAgICByZXN1bHQgPSBoYXNGT09maWxlKCAoSUNvbnRhaW5lcikgcmVjZWl2ZXIgKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGhhc0ZPT2ZpbGUoIElDb250YWluZXIgY29udGFpbmVyICkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ICAgPSBmYWxzZTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2VbXSBjaGlsZHJlbiA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0gICAgICAKLSAgICAgIGZvciggSVJlc291cmNlIGNoaWxkIDogY2hpbGRyZW4gKQotICAgICAgewotICAgICAgICBpZiggY2hpbGQgaW5zdGFuY2VvZiBJQ29udGFpbmVyICkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGhhc0ZPT2ZpbGUoIChJQ29udGFpbmVyKSBjaGlsZCApOwotICAgICAgICAgIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoIGNoaWxkIGluc3RhbmNlb2YgSUZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gY2hpbGQuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoICJmb28iICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIElmIHdlIGZvdW5kIGEgc2luZ2xlIGZvbyBmaWxlIHdlIHdpbGwgYnJlYWsgb3V0IG9mIHRoZSBsb29wLgotICAgICAgICBpZiggcmVzdWx0ICkgYnJlYWs7Ci0gICAgICB9ICAgIAotICAgIH0KLSAgICBjYXRjaCggQ29yZUV4Y2VwdGlvbiBleGMgKQotICAgIHsKLSAgICAgIC8vIElnbm9yZSBleGNlcHRpb24gYW5kIHJldHVybiBmYWxzZS4gIAotICAgIH0KLSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCmluZGV4IDUyZjAxN2QuLmMxYTM1MjMgMTAwNjQ0Ci0tLSBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCkBAIC0yLDcgKzIsNyBAQAogQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgogQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCiBCdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0czsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwNC5xdWFsaWZpZXIKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMjA2LnF1YWxpZmllcgogQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMuV1NETFRlc3RzUGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCiBCdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvSW1wb3J0c1dpdGhOb25TdGFuZGFyZEZpbGVFeHRlbnNpb24vSW1wb3J0V2l0aE5vblN0YW5kYXJkRmlsZUV4dGVuc2lvbi53c2RsIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9JbXBvcnRzV2l0aE5vblN0YW5kYXJkRmlsZUV4dGVuc2lvbi9JbXBvcnRXaXRoTm9uU3RhbmRhcmRGaWxlRXh0ZW5zaW9uLndzZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwN2E4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvSW1wb3J0c1dpdGhOb25TdGFuZGFyZEZpbGVFeHRlbnNpb24vSW1wb3J0V2l0aE5vblN0YW5kYXJkRmlsZUV4dGVuc2lvbi53c2RsCkBAIC0wLDAgKzEsNTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8d3NkbDpkZWZpbml0aW9ucyBuYW1lPSJJbXBvcnRXaXRoTm9uU3RhbmRhcmRGaWxlRXh0ZW5zaW9uIgorCXRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9JbXBvcnRXaXRoTm9uU3RhbmRhcmRGaWxlRXh0ZW5zaW9uLyIKKwl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvSW1wb3J0V2l0aE5vblN0YW5kYXJkRmlsZUV4dGVuc2lvbi8iCisJeG1sbnM6d3NkbDA9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvSW1wb3J0V2l0aE5vblN0YW5kYXJkV1NETEZpbGVFeHRlbnNpb24vd3NkbDAvIgorCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorCXhtbG5zOnhzZDE9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvTm9uU3RhbmRhcmRTY2hlbWFGaWxlRXh0ZW5zaW9uL3hzZDAiPgorCisJPHdzZGw6aW1wb3J0CisJCW5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9JbXBvcnRXaXRoTm9uU3RhbmRhcmRXU0RMRmlsZUV4dGVuc2lvbi93c2RsMC8iCisJCWxvY2F0aW9uPSJOb25TdGFuZGFyZFdTRExGaWxlRXh0ZW5zaW9uLndzZGwwIj48L3dzZGw6aW1wb3J0PgorCQkKKwk8d3NkbDppbXBvcnQKKwkJbmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL05vblN0YW5kYXJkU2NoZW1hRmlsZUV4dGVuc2lvbi94c2QwIgorCQlsb2NhdGlvbj0iTm9uU3RhbmRhcmRTY2hlbWFGaWxlRXh0ZW5zaW9uLnhzZDEiPgorCTwvd3NkbDppbXBvcnQ+CisJPHdzZGw6dHlwZXM+CisJCTx4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisJCQl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvSW1wb3J0V2l0aE5vblN0YW5kYXJkRmlsZUV4dGVuc2lvbi8iPgorCQkJPHhzZDplbGVtZW50IG5hbWU9Ik5ld09wZXJhdGlvbiI+CisJCQkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCQkJPHhzZDpzZXF1ZW5jZT4KKworCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9ImluIiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3hzZDplbGVtZW50PgorCQkJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCQk8L3hzZDpjb21wbGV4VHlwZT4KKwkJCTwveHNkOmVsZW1lbnQ+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iTmV3T3BlcmF0aW9uUmVzcG9uc2UiPgorCQkJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQkJCTx4c2Q6c2VxdWVuY2U+CisKKwkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvdXQiIHR5cGU9InhzZDpzdHJpbmciPjwveHNkOmVsZW1lbnQ+CisJCQkJCTwveHNkOnNlcXVlbmNlPgorCQkJCTwveHNkOmNvbXBsZXhUeXBlPgorCQkJPC94c2Q6ZWxlbWVudD4KKwkJPC94c2Q6c2NoZW1hPgorCTwvd3NkbDp0eXBlcz4KKworCTx3c2RsOm1lc3NhZ2UgbmFtZT0iTmV3T3BlcmF0aW9uUmVxdWVzdCI+CisJCTx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgdHlwZT0ieHNkMTpJbXBvcnRlZFR5cGVWaWFXU0RMSW1wb3J0Ij48L3dzZGw6cGFydD4KKwk8L3dzZGw6bWVzc2FnZT4KKwk8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld09wZXJhdGlvblJlc3BvbnNlIj4KKwkJPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6TmV3T3BlcmF0aW9uUmVzcG9uc2UiPjwvd3NkbDpwYXJ0PgorCTwvd3NkbDptZXNzYWdlPgorCTx3c2RsOnBvcnRUeXBlIG5hbWU9Ik5ld1BvcnRUeXBlIj4KKwkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik5ld09wZXJhdGlvbiI+CisJCQk8d3NkbDppbnB1dCBtZXNzYWdlPSJ0bnM6TmV3T3BlcmF0aW9uUmVxdWVzdCI+PC93c2RsOmlucHV0PgorCQkJPHdzZGw6b3V0cHV0IG1lc3NhZ2U9InRuczpOZXdPcGVyYXRpb25SZXNwb25zZSI+PC93c2RsOm91dHB1dD4KKwkJPC93c2RsOm9wZXJhdGlvbj4KKwk8L3dzZGw6cG9ydFR5cGU+CisJPHdzZGw6c2VydmljZSBuYW1lPSJJbXBvcnRXaXRoTm9uU3RhbmRhcmRGaWxlRXh0ZW5zaW9uIj4KKwkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ3c2RsMDpJbXBvcnRXaXRoTm9uU3RhbmRhcmRGaWxlRXh0ZW5zaW9uU09BUCIKKwkJCW5hbWU9IkltcG9ydFdpdGhOb25TdGFuZGFyZEZpbGVFeHRlbnNpb25TT0FQIj4KKwkJCTxzb2FwOmFkZHJlc3MgbG9jYXRpb249Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvIiAvPgorCQk8L3dzZGw6cG9ydD4KKwk8L3dzZGw6c2VydmljZT4KKzwvd3NkbDpkZWZpbml0aW9ucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvSW1wb3J0c1dpdGhOb25TdGFuZGFyZEZpbGVFeHRlbnNpb24vTm9uU3RhbmRhcmRTY2hlbWFGaWxlRXh0ZW5zaW9uLnhzZDAgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL0ltcG9ydHNXaXRoTm9uU3RhbmRhcmRGaWxlRXh0ZW5zaW9uL05vblN0YW5kYXJkU2NoZW1hRmlsZUV4dGVuc2lvbi54c2QwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OWRiODMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL0ltcG9ydHNXaXRoTm9uU3RhbmRhcmRGaWxlRXh0ZW5zaW9uL05vblN0YW5kYXJkU2NoZW1hRmlsZUV4dGVuc2lvbi54c2QwCkBAIC0wLDAgKzEsMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL05vblN0YW5kYXJkU2NoZW1hRmlsZUV4dGVuc2lvbi94c2QwIiB4bWxuczp0bnM9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvTm9uU3RhbmRhcmRTY2hlbWFGaWxlRXh0ZW5zaW9uL3hzZDAiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKworICAgIDxjb21wbGV4VHlwZSBuYW1lPSJOZXdUeXBlIiB0ZXN0WFNEMD0icGFzc2VkIj4KKyAgICAJPHNlcXVlbmNlPgorICAgIAkJPGVsZW1lbnQgbmFtZT0iTmV3RWxlbWVudCIgdHlwZT0ic3RyaW5nIj48L2VsZW1lbnQ+CisgICAgCQk8ZWxlbWVudCBuYW1lPSJOZXdFbGVtZW50MSIgdHlwZT0ic3RyaW5nIj48L2VsZW1lbnQ+CisgICAgCTwvc2VxdWVuY2U+CisgICAgPC9jb21wbGV4VHlwZT4KKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9JbXBvcnRzV2l0aE5vblN0YW5kYXJkRmlsZUV4dGVuc2lvbi9Ob25TdGFuZGFyZFNjaGVtYUZpbGVFeHRlbnNpb24ueHNkMSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvSW1wb3J0c1dpdGhOb25TdGFuZGFyZEZpbGVFeHRlbnNpb24vTm9uU3RhbmRhcmRTY2hlbWFGaWxlRXh0ZW5zaW9uLnhzZDEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI1ZmQ3MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvSW1wb3J0c1dpdGhOb25TdGFuZGFyZEZpbGVFeHRlbnNpb24vTm9uU3RhbmRhcmRTY2hlbWFGaWxlRXh0ZW5zaW9uLnhzZDEKQEAgLTAsMCArMSwxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvTm9uU3RhbmRhcmRTY2hlbWFGaWxlRXh0ZW5zaW9uL3hzZDAiIHhtbG5zOnRucz0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9Ob25TdGFuZGFyZFNjaGVtYUZpbGVFeHRlbnNpb24veHNkMCIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPgorCisgICAgPGNvbXBsZXhUeXBlIG5hbWU9IkltcG9ydGVkVHlwZVZpYVdTRExJbXBvcnQiIHRlc3RYU0QxPSJwYXNzZWQiPgorICAgIAk8c2VxdWVuY2U+CisgICAgCQk8ZWxlbWVudCBuYW1lPSJOZXdFbGVtZW50IiB0eXBlPSJzdHJpbmciPjwvZWxlbWVudD4KKyAgICAJCTxlbGVtZW50IG5hbWU9Ik5ld0VsZW1lbnQxIiB0eXBlPSJzdHJpbmciPjwvZWxlbWVudD4KKyAgICAJPC9zZXF1ZW5jZT4KKyAgICA8L2NvbXBsZXhUeXBlPgorPC9zY2hlbWE+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL0ltcG9ydHNXaXRoTm9uU3RhbmRhcmRGaWxlRXh0ZW5zaW9uL05vblN0YW5kYXJkV1NETEZpbGVFeHRlbnNpb24ud3NkbDAgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL0ltcG9ydHNXaXRoTm9uU3RhbmRhcmRGaWxlRXh0ZW5zaW9uL05vblN0YW5kYXJkV1NETEZpbGVFeHRlbnNpb24ud3NkbDAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5ZTM3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NhbXBsZXMvQnVnRml4ZXMvSW1wb3J0c1dpdGhOb25TdGFuZGFyZEZpbGVFeHRlbnNpb24vTm9uU3RhbmRhcmRXU0RMRmlsZUV4dGVuc2lvbi53c2RsMApAQCAtMCwwICsxLDQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pjx3c2RsOmRlZmluaXRpb25zIG5hbWU9IkltcG9ydFdpdGhOb25TdGFuZGFyZEZpbGVFeHRlbnNpb24iIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9JbXBvcnRXaXRoTm9uU3RhbmRhcmRXU0RMRmlsZUV4dGVuc2lvbi93c2RsMC8iIHhtbG5zOnNvYXA9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIHhtbG5zOnRucz0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9JbXBvcnRXaXRoTm9uU3RhbmRhcmRXU0RMRmlsZUV4dGVuc2lvbi93c2RsMC8iIHhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIiB4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KKyAgPHdzZGw6dHlwZXM+CisgICAgPHhzZDpzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0ltcG9ydFdpdGhOb25TdGFuZGFyZFdTRExGaWxlRXh0ZW5zaW9uL3dzZGwwLyIgeG1sbnM6eHNkMD0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9Ob25TdGFuZGFyZFNjaGVtYUZpbGVFeHRlbnNpb24veHNkMCI+CisgICAgICAgICAgICA8eHNkOmltcG9ydCBzY2hlbWFMb2NhdGlvbj0iTm9uU3RhbmRhcmRTY2hlbWFGaWxlRXh0ZW5zaW9uLnhzZDAiIG5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9Ob25TdGFuZGFyZFNjaGVtYUZpbGVFeHRlbnNpb24veHNkMCI+PC94c2Q6aW1wb3J0PgorICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Ik5ld09wZXJhdGlvbiI+CisgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJpbiIgdHlwZT0ieHNkMDpOZXdUeXBlIi8+CisgICAgICAgICAgPC94c2Q6c2VxdWVuY2U+CisgICAgICAgIDwveHNkOmNvbXBsZXhUeXBlPgorICAgICAgPC94c2Q6ZWxlbWVudD4KKyAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSI+CisgICAgICAgIDx4c2Q6Y29tcGxleFR5cGU+CisgICAgICAgICAgPHhzZDpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJvdXQiIHR5cGU9InhzZDpzdHJpbmciLz4KKyAgICAgICAgICA8L3hzZDpzZXF1ZW5jZT4KKyAgICAgICAgPC94c2Q6Y29tcGxleFR5cGU+CisgICAgICA8L3hzZDplbGVtZW50PgorICAgIDwveHNkOnNjaGVtYT4KKyAgPC93c2RsOnR5cGVzPgorICA8d3NkbDptZXNzYWdlIG5hbWU9Ik5ld09wZXJhdGlvblJlcXVlc3QiPgorICAgIDx3c2RsOnBhcnQgZWxlbWVudD0idG5zOk5ld09wZXJhdGlvbiIgbmFtZT0icGFyYW1ldGVycyIvPgorICA8L3dzZGw6bWVzc2FnZT4KKyAgPHdzZGw6bWVzc2FnZSBuYW1lPSJOZXdPcGVyYXRpb25SZXNwb25zZSI+CisgICAgPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6TmV3T3BlcmF0aW9uUmVzcG9uc2UiIG5hbWU9InBhcmFtZXRlcnMiLz4KKyAgPC93c2RsOm1lc3NhZ2U+CisgIDx3c2RsOnBvcnRUeXBlIG5hbWU9IkltcG9ydFdpdGhOb25TdGFuZGFyZEZpbGVFeHRlbnNpb24iPgorICAgIDx3c2RsOm9wZXJhdGlvbiBuYW1lPSJOZXdPcGVyYXRpb24iPgorICAgICAgPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOk5ld09wZXJhdGlvblJlcXVlc3QiLz4KKyAgICAgIDx3c2RsOm91dHB1dCBtZXNzYWdlPSJ0bnM6TmV3T3BlcmF0aW9uUmVzcG9uc2UiLz4KKyAgICA8L3dzZGw6b3BlcmF0aW9uPgorICA8L3dzZGw6cG9ydFR5cGU+CisgIDx3c2RsOmJpbmRpbmcgbmFtZT0iSW1wb3J0V2l0aE5vblN0YW5kYXJkRmlsZUV4dGVuc2lvblNPQVAiIHR5cGU9InRuczpJbXBvcnRXaXRoTm9uU3RhbmRhcmRGaWxlRXh0ZW5zaW9uIj4KKyAgICA8c29hcDpiaW5kaW5nIHN0eWxlPSJkb2N1bWVudCIgdHJhbnNwb3J0PSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL2h0dHAiLz4KKyAgICA8d3NkbDpvcGVyYXRpb24gbmFtZT0iTmV3T3BlcmF0aW9uIj4KKyAgICAgIDxzb2FwOm9wZXJhdGlvbiBzb2FwQWN0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0ltcG9ydFdpdGhOb25TdGFuZGFyZFdTRExGaWxlRXh0ZW5zaW9uL3dzZGwwL05ld09wZXJhdGlvbiIvPgorICAgICAgPHdzZGw6aW5wdXQ+CisgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+CisgICAgICA8L3dzZGw6aW5wdXQ+CisgICAgICA8d3NkbDpvdXRwdXQ+CisgICAgICAgIDxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIi8+CisgICAgICA8L3dzZGw6b3V0cHV0PgorICAgIDwvd3NkbDpvcGVyYXRpb24+CisgIDwvd3NkbDpiaW5kaW5nPgorPC93c2RsOmRlZmluaXRpb25zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9SZWNvbmNpbGVzRXh0ZW5zaWJsZUVsZW1lbnRzL0V4dGVuc2libGVFbGVtZW50U2FtcGxlLndzZGwgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zYW1wbGVzL0J1Z0ZpeGVzL1JlY29uY2lsZXNFeHRlbnNpYmxlRWxlbWVudHMvRXh0ZW5zaWJsZUVsZW1lbnRTYW1wbGUud3NkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTM2MTA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc2FtcGxlcy9CdWdGaXhlcy9SZWNvbmNpbGVzRXh0ZW5zaWJsZUVsZW1lbnRzL0V4dGVuc2libGVFbGVtZW50U2FtcGxlLndzZGwKQEAgLTAsMCArMSwyMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8d3NkbDpkZWZpbml0aW9ucyB4bWxuczp3c2RsPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIKKwl4bWxuczpzb2FwPSJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL3NvYXAvIiB4bWxuczp0bnM9Imh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvQmluZGluZ0ZhdWx0U2FtcGxlLyIKKwl4bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiBuYW1lPSJCaW5kaW5nRmF1bHRTYW1wbGUiCisJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0JpbmRpbmdGYXVsdFNhbXBsZS8iPgorCTx4c2Q6YW5ub3RhdGlvbj4KKwkJPHhzZDpkb2N1bWVudGF0aW9uPgorCQkJQW5ub3RhdGlvbgorIAkJCTwveHNkOmRvY3VtZW50YXRpb24+CisJPC94c2Q6YW5ub3RhdGlvbj4KKwk8d3NkbDppbXBvcnQgbmFtZXNwYWNlPSIiIGxvY2F0aW9uPSIiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+CisJCQkJQW5ub3RhdGlvbgorIAkJCTwveHNkOmRvY3VtZW50YXRpb24+CisJCTwveHNkOmFubm90YXRpb24+CisJPC93c2RsOmltcG9ydD4KKwk8d3NkbDp0eXBlcz4KKwkJPHhzZDphbm5vdGF0aW9uPgorCQkJPHhzZDpkb2N1bWVudGF0aW9uPgorCQkJCUFubm90YXRpb24KKyAJCQk8L3hzZDpkb2N1bWVudGF0aW9uPgorCQk8L3hzZDphbm5vdGF0aW9uPgorCisJCTx4c2Q6c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9CaW5kaW5nRmF1bHRTYW1wbGUvIgorCQkJeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3BlcmF0aW9uMSI+CisJCQkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJpbiIgdHlwZT0ieHNkOnN0cmluZyIgLz4KKwkJCQkJPC94c2Q6c2VxdWVuY2U+CisJCQkJPC94c2Q6Y29tcGxleFR5cGU+CisJCQk8L3hzZDplbGVtZW50PgorCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wZXJhdGlvbjFSZXNwb25zZSI+CisJCQkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJvdXQiIHR5cGU9InhzZDpzdHJpbmciIC8+CisJCQkJCTwveHNkOnNlcXVlbmNlPgorCQkJCTwveHNkOmNvbXBsZXhUeXBlPgorCQkJPC94c2Q6ZWxlbWVudD4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcGVyYXRpb24xRmF1bHQiPgorCQkJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQkJCTx4c2Q6c2VxdWVuY2U+CisJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iZmF1bHQiIHR5cGU9InhzZDpzdHJpbmciIC8+CisJCQkJCTwveHNkOnNlcXVlbmNlPgorCQkJCTwveHNkOmNvbXBsZXhUeXBlPgorCQkJPC94c2Q6ZWxlbWVudD4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcGVyYXRpb24yIj4KKwkJCQk8eHNkOmNvbXBsZXhUeXBlPgorCQkJCQk8eHNkOnNlcXVlbmNlPgorCisJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0iaW4iIHR5cGU9InhzZDpzdHJpbmciPjwveHNkOmVsZW1lbnQ+CisJCQkJCTwveHNkOnNlcXVlbmNlPgorCQkJCTwveHNkOmNvbXBsZXhUeXBlPgorCQkJPC94c2Q6ZWxlbWVudD4KKwkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcGVyYXRpb24yUmVzcG9uc2UiPgorCQkJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQkJCTx4c2Q6c2VxdWVuY2U+CisJCQkJCQk8eHNkOmVsZW1lbnQgbmFtZT0ib3V0IiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3hzZDplbGVtZW50PgorCQkJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCQk8L3hzZDpjb21wbGV4VHlwZT4KKwkJCTwveHNkOmVsZW1lbnQ+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3BlcmF0aW9uMkZhdWx0MSI+CisJCQkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcGVyYXRpb24yRmF1bHQxIiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3hzZDplbGVtZW50PgorCQkJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCQk8L3hzZDpjb21wbGV4VHlwZT4KKwkJCTwveHNkOmVsZW1lbnQ+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3BlcmF0aW9uMkZhdWx0MiI+CisJCQkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCQkJPHhzZDpzZXF1ZW5jZT4KKwkJCQkJCTx4c2Q6ZWxlbWVudCBuYW1lPSJPcGVyYXRpb24yRmF1bHQyIiB0eXBlPSJ4c2Q6c3RyaW5nIj48L3hzZDplbGVtZW50PgorCQkJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCQk8L3hzZDpjb21wbGV4VHlwZT4KKwkJCTwveHNkOmVsZW1lbnQ+CisJCQk8eHNkOmVsZW1lbnQgbmFtZT0iT3BlcmF0aW9uMUZhdWx0MSI+CisJCQkJPHhzZDpjb21wbGV4VHlwZT4KKwkJCQkJPHhzZDpzZXF1ZW5jZT4KKworCQkJCQkJPHhzZDplbGVtZW50IG5hbWU9Ik9wZXJhdGlvbjFGYXVsdCIgdHlwZT0ieHNkOnN0cmluZyI+CisJCQkJCQk8L3hzZDplbGVtZW50PgorCQkJCQk8L3hzZDpzZXF1ZW5jZT4KKwkJCQk8L3hzZDpjb21wbGV4VHlwZT4KKwkJCTwveHNkOmVsZW1lbnQ+CisJCTwveHNkOnNjaGVtYT4KKwk8L3dzZGw6dHlwZXM+CisJPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb24xUmVxdWVzdCI+CisJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJCQlBbm5vdGF0aW9uCisgCQkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJPC94c2Q6YW5ub3RhdGlvbj4KKwkJPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6T3BlcmF0aW9uMSIgbmFtZT0icGFyYW1ldGVycyI+CisJCQk8eHNkOmFubm90YXRpb24+CisJCQkJPHhzZDpkb2N1bWVudGF0aW9uPgorCQkJCQlBbm5vdGF0aW9uCisgCQkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJCTwveHNkOmFubm90YXRpb24+CisJCTwvd3NkbDpwYXJ0PgorCTwvd3NkbDptZXNzYWdlPgorCTx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uMVJlc3BvbnNlIj4KKwkJPHdzZGw6cGFydCBlbGVtZW50PSJ0bnM6T3BlcmF0aW9uMVJlc3BvbnNlIiBuYW1lPSJwYXJhbWV0ZXJzIiAvPgorCTwvd3NkbDptZXNzYWdlPgorCTx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uMUZhdWx0Ij4KKwkJPHdzZGw6cGFydCBuYW1lPSJGYXVsdCIgZWxlbWVudD0idG5zOk9wZXJhdGlvbjFGYXVsdCIgLz4KKwk8L3dzZGw6bWVzc2FnZT4KKwk8d3NkbDptZXNzYWdlIG5hbWU9Ik9wZXJhdGlvbjJSZXF1ZXN0Ij4KKwkJPHdzZGw6cGFydCBuYW1lPSJwYXJhbWV0ZXJzIiBlbGVtZW50PSJ0bnM6T3BlcmF0aW9uMiI+PC93c2RsOnBhcnQ+CisJPC93c2RsOm1lc3NhZ2U+CisJPHdzZGw6bWVzc2FnZSBuYW1lPSJPcGVyYXRpb24yUmVzcG9uc2UiPgorCQk8d3NkbDpwYXJ0IG5hbWU9InBhcmFtZXRlcnMiIGVsZW1lbnQ9InRuczpPcGVyYXRpb24yUmVzcG9uc2UiPjwvd3NkbDpwYXJ0PgorCTwvd3NkbDptZXNzYWdlPgorCTx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uMkZhdWx0MSI+CisJCTx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOk9wZXJhdGlvbjJGYXVsdDEiPjwvd3NkbDpwYXJ0PgorCTwvd3NkbDptZXNzYWdlPgorCTx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uMkZhdWx0MiI+CisJCTx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOk9wZXJhdGlvbjJGYXVsdDIiPjwvd3NkbDpwYXJ0PgorCTwvd3NkbDptZXNzYWdlPgorCTx3c2RsOm1lc3NhZ2UgbmFtZT0iT3BlcmF0aW9uMUZhdWx0MSI+CisJCTx3c2RsOnBhcnQgbmFtZT0icGFyYW1ldGVycyIgZWxlbWVudD0idG5zOk9wZXJhdGlvbjFGYXVsdDEiPjwvd3NkbDpwYXJ0PgorCTwvd3NkbDptZXNzYWdlPgorCTx3c2RsOnBvcnRUeXBlIG5hbWU9IlNhbXBsZVBvcnQiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+CisJCQkJQW5ub3RhdGlvbgorIAkJCTwveHNkOmRvY3VtZW50YXRpb24+CisJCTwveHNkOmFubm90YXRpb24+CisKKwkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik9wZXJhdGlvbjEiPgorCQkJPHhzZDphbm5vdGF0aW9uPgorCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJCQkJQW5ub3RhdGlvbgorIAkJCTwveHNkOmRvY3VtZW50YXRpb24+CisJCQk8L3hzZDphbm5vdGF0aW9uPgorCQkJPHdzZGw6aW5wdXQgbWVzc2FnZT0idG5zOk9wZXJhdGlvbjFSZXF1ZXN0Ij4KKwkJCQk8eHNkOmFubm90YXRpb24+CisJCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJCQkJCUFubm90YXRpb24KKyAJCQk8L3hzZDpkb2N1bWVudGF0aW9uPgorCQkJCTwveHNkOmFubm90YXRpb24+CisJCQk8L3dzZGw6aW5wdXQ+CisJCQk8d3NkbDpvdXRwdXQgbWVzc2FnZT0idG5zOk9wZXJhdGlvbjFSZXNwb25zZSI+CisJCQkJPHhzZDphbm5vdGF0aW9uPgorCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+CisJCQkJCQlBbm5vdGF0aW9uCisgCQkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJCQk8L3hzZDphbm5vdGF0aW9uPgorCQkJPC93c2RsOm91dHB1dD4KKwkJCTx3c2RsOmZhdWx0IG5hbWU9ImZhdWx0IiBtZXNzYWdlPSJ0bnM6T3BlcmF0aW9uMUZhdWx0MSI+CisJCQkJPHhzZDphbm5vdGF0aW9uPgorCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+CisJCQkJCQlBbm5vdGF0aW9uCisgCQkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJCQk8L3hzZDphbm5vdGF0aW9uPgorCQkJPC93c2RsOmZhdWx0PgorCQk8L3dzZGw6b3BlcmF0aW9uPgorCTwvd3NkbDpwb3J0VHlwZT4KKwk8d3NkbDpiaW5kaW5nIG5hbWU9IlNhbXBsZVBvcnRTT0FQQmluZGluZyIgdHlwZT0idG5zOlNhbXBsZVBvcnQiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+CisJCQkJQW5ub3RhdGlvbgorIAkJCTwveHNkOmRvY3VtZW50YXRpb24+CisJCTwveHNkOmFubm90YXRpb24+CisKKwkJPHNvYXA6YmluZGluZyBzdHlsZT0iZG9jdW1lbnQiCisJCQl0cmFuc3BvcnQ9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvaHR0cCIgLz4KKwkJPHdzZGw6b3BlcmF0aW9uIG5hbWU9Ik9wZXJhdGlvbjEiPgorCQkJPHhzZDphbm5vdGF0aW9uPgorCQkJCTx4c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJCQkJQW5ub3RhdGlvbgorIAkJCQk8L3hzZDpkb2N1bWVudGF0aW9uPgorCQkJPC94c2Q6YW5ub3RhdGlvbj4KKworCQkJPHNvYXA6b3BlcmF0aW9uCisJCQkJc29hcEFjdGlvbj0iaHR0cDovL3d3dy5leGFtcGxlLm9yZy9CaW5kaW5nRmF1bHRTYW1wbGUvT3BlcmF0aW9uMSIgLz4KKwkJCTx3c2RsOmlucHV0PgorCQkJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCQkJPHhzZDpkb2N1bWVudGF0aW9uPgorCQkJCQkJQW5ub3RhdGlvbgorIAkJCQkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJCQk8L3hzZDphbm5vdGF0aW9uPgorCisJCQkJPHNvYXA6Ym9keSB1c2U9ImxpdGVyYWwiIC8+CisJCQk8L3dzZGw6aW5wdXQ+CisJCQk8d3NkbDpvdXRwdXQ+CisJCQkJPHhzZDphbm5vdGF0aW9uPgorCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+CisJCQkJCQlBbm5vdGF0aW9uCisgCQkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJCQk8L3hzZDphbm5vdGF0aW9uPgorCQkJCTxzb2FwOmJvZHkgdXNlPSJsaXRlcmFsIiAvPgorCQkJPC93c2RsOm91dHB1dD4KKwkJCTx3c2RsOmZhdWx0IG5hbWU9Ik9wZXJhdGlvbjFGYXVsdCI+CisJCQkJPHhzZDphbm5vdGF0aW9uPgorCQkJCQk8eHNkOmRvY3VtZW50YXRpb24+CisJCQkJCQlBbm5vdGF0aW9uCisgCQkJCQk8L3hzZDpkb2N1bWVudGF0aW9uPgorCQkJCTwveHNkOmFubm90YXRpb24+CisKKwkJCQk8c29hcDpmYXVsdCBuYW1lPSJPcGVyYXRpb24xRmF1bHQiIC8+CisJCQk8L3dzZGw6ZmF1bHQ+CisJCTwvd3NkbDpvcGVyYXRpb24+CisKKwk8L3dzZGw6YmluZGluZz4KKwk8d3NkbDpzZXJ2aWNlIG5hbWU9IlNhbXBsZVNlcnZpY2UiPgorCQk8eHNkOmFubm90YXRpb24+CisJCQk8eHNkOmRvY3VtZW50YXRpb24+CisJCQkJQW5ub3RhdGlvbgorIAkJCTwveHNkOmRvY3VtZW50YXRpb24+CisJCTwveHNkOmFubm90YXRpb24+CisKKwkJPHdzZGw6cG9ydCBiaW5kaW5nPSJ0bnM6U2FtcGxlUG9ydFNPQVBCaW5kaW5nIiBuYW1lPSJTYW1wbGVQb3J0Ij4KKwkJCTx4c2Q6YW5ub3RhdGlvbj4KKwkJCQk8eHNkOmRvY3VtZW50YXRpb24+CisJCQkJCUFubm90YXRpb24KKyAJCQkJPC94c2Q6ZG9jdW1lbnRhdGlvbj4KKwkJCTwveHNkOmFubm90YXRpb24+CisJCQk8c29hcDphZGRyZXNzIGxvY2F0aW9uPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnLyIgLz4KKwkJPC93c2RsOnBvcnQ+CisJPC93c2RsOnNlcnZpY2U+Cis8L3dzZGw6ZGVmaW5pdGlvbnM+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvQnVnRml4ZXNUZXN0LmphdmEgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdGVzdHMvQnVnRml4ZXNUZXN0LmphdmEKaW5kZXggYjFmZWRiYS4uNzE1ZjdkOCAxMDA2NDQKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3Rlc3RzL0J1Z0ZpeGVzVGVzdC5qYXZhCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC90ZXN0cy9CdWdGaXhlc1Rlc3QuamF2YQpAQCAtMzcsNiArMzcsNyBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkJpbmRpbmdGYXVsdDsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nSW5wdXQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuQmluZGluZ09wZXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5CaW5kaW5nT3V0cHV0OwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLkRlZmluaXRpb247CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRXh0ZW5zaWJsZUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuRmF1bHQ7CkBAIC00OSw2ICs1MCw3IEBACiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydFR5cGU7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuU2VydmljZTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5UeXBlczsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5Vbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBhY2thZ2U7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwuV1NETFBsdWdpbjsKQEAgLTY3LDYgKzY5LDcgQEAKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC5pbnRlcm5hbC51dGlsLldTRExVdGlsOwogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnRlc3RzLnV0aWwuRGVmaW5pdGlvbkxvYWRlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC51dGlsLldTRExDb25zdGFudHM7CitpbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbjsKIGltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwogaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKQEAgLTMxNCw3ICszMTcsMjMgQEAKICAgICAgIHsKICAgICAgICAgdGVzdFJlY29uY2lsZXNJbXBvcnRzV2l0aE5vTG9jYXRpb24oKTsKICAgICAgIH0KLSAgICB9KTsgICAgICAgIAorICAgIH0pOyAKKyAgICAKKyAgICBzdWl0ZS5hZGRUZXN0KG5ldyBCdWdGaXhlc1Rlc3QoIlJlY29uY2lsZXNFeHRlbnNpYmxlRWxlbWVudHMiKSAvLyROT04tTkxTLTEkCisgICAgeworICAgICAgcHJvdGVjdGVkIHZvaWQgcnVuVGVzdCgpCisgICAgICB7CisgICAgICAgIHRlc3RSZWNvbmNpbGVzRXh0ZW5zaWJsZUVsZW1lbnRzKCk7CisgICAgICB9CisgICAgfSk7CisKKyAgICBzdWl0ZS5hZGRUZXN0KG5ldyBCdWdGaXhlc1Rlc3QoIkltcG9ydHNXaXRoTm9uU3RhbmRhcmRGaWxlRXh0ZW5zaW9uIikgLy8kTk9OLU5MUy0xJAorICAgIHsKKyAgICAgIHByb3RlY3RlZCB2b2lkIHJ1blRlc3QoKQorICAgICAgeworICAgICAgICB0ZXN0SW1wb3J0c1dpdGhOb25TdGFuZGFyZEZpbGVFeHRlbnNpb24oKTsKKyAgICAgIH0KKyAgICB9KTsKIAogICAgIHJldHVybiBzdWl0ZTsKICAgfQpAQCAtMTc2NCw0ICsxNzgzLDE4OSBAQAogICAgICAgZmFpbCgpOwogICAgIH0KICAgfQorICAKKyAgLyoqCisgICAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MjM2NDA0CisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0UmVjb25jaWxlc0V4dGVuc2libGVFbGVtZW50cygpCisgIHsKKyAgICBEZWZpbml0aW9uIGRlZmluaXRpb24gPSBudWxsOworCisgICAgLy8gVGhlIHNhbXBsZSBXU0RMIGFscmVhZHkgaGFzIGFuIDxhbm5vdGF0aW9uPiBleHRlbnNpYmlsaXR5IGVsZW1lbnQgZm9yIGVhY2ggZXh0ZW5zaWJsZSBlbGVtZW50CisgICAgLy8gV2Ugd2lsbCBsb29wIHRocm91Z2ggZXZlcnkgZXh0ZW5zaWJsZSBlbGVtZW50IGFuZCByZW1vdmUgdGhlIGFubm90YXRpb24gZXh0ZW5zaWJpbGl0eSBlbGVtZW50CisgICAgLy8gYW5kIGZvcmNlIHRoZSBtb2RlbCB0byB1cGRhdGUsIHRodXMgY2FsbGluZyB0aGUgcmVjb25jaWxpYXRpb24gY29kZS4gVGhlIGV4cGVjdGVkIHJlc3VsdCBpcyB0aGF0CisgICAgLy8gdGhlIGFubm90YXRpb24gZXh0ZW5zaWJpbGl0eSBlbGVtZW50IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbW9kZWwuCisgICAgdHJ5CisgICAgeworICAgICAgZGVmaW5pdGlvbiA9IERlZmluaXRpb25Mb2FkZXIubG9hZChQTFVHSU5fQUJTT0xVVEVfUEFUSCArICJzYW1wbGVzL0J1Z0ZpeGVzL1JlY29uY2lsZXNFeHRlbnNpYmxlRWxlbWVudHMvRXh0ZW5zaWJsZUVsZW1lbnRTYW1wbGUud3NkbCIpOyAvLyROT04tTkxTLTEkCisgICAgfQorICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQorICAgIHsKKyAgICAgIGZhaWwoZS5nZXRNZXNzYWdlKCkpOworICAgIH0KKworICAgIC8vIERlZmluaXRpb24KKyAgICBlbnN1cmVFeHRlbnNpYmlsaXR5RWxlbWVudFJlbW92ZWQoZGVmaW5pdGlvbiwgMSk7CisgICAgCisgICAgLy8gSW1wb3J0CisgICAgRUxpc3QgaW1wb3J0cyA9IGRlZmluaXRpb24uZ2V0RUltcG9ydHMoKTsKKyAgICBJbXBvcnQgbXlJbXBvcnQgPSAoSW1wb3J0KSBpbXBvcnRzLmdldCgwKTsKKyAgICBlbnN1cmVFeHRlbnNpYmlsaXR5RWxlbWVudFJlbW92ZWQobXlJbXBvcnQsIDEpOworICAgIAorICAgIC8vIFR5cGU6IG9yaWdpbmFsIGlzIHR3byBiZWNhdXNlIGl0IGhhcyA8YW5ub3RhdGlvbj4gYW5kIDxzY2hlbWE+CisgICAgVHlwZXMgdHlwZXMgPSBkZWZpbml0aW9uLmdldEVUeXBlcygpOworICAgIGVuc3VyZUV4dGVuc2liaWxpdHlFbGVtZW50UmVtb3ZlZCh0eXBlcywgMik7CisgICAgCisgICAgLy8gU2VydmljZQorICAgIFNlcnZpY2Ugc2VydmljZSA9IChTZXJ2aWNlKWRlZmluaXRpb24uZ2V0RVNlcnZpY2VzKCkuZ2V0KDApOworICAgIGVuc3VyZUV4dGVuc2liaWxpdHlFbGVtZW50UmVtb3ZlZChzZXJ2aWNlLCAxKTsKKyAgICAKKyAgICAvLyBQb3J0CisgICAgb3JnLmVjbGlwc2Uud3N0LndzZGwuUG9ydCBwb3J0ID0gKG9yZy5lY2xpcHNlLndzdC53c2RsLlBvcnQpc2VydmljZS5nZXRFUG9ydHMoKS5nZXQoMCk7CisgICAgZW5zdXJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRSZW1vdmVkKHBvcnQsIDIpOworICAgIAorICAgIC8vIEJpbmRpbmc6IG9yaWdpbmFsIGlzIDIgYmVjYXVzZSBpdCBoYXMgPGFubm90YXRpb24+IGFuZCA8c29hcDpiaW5kaW5nPgorICAgIEJpbmRpbmcgYmluZGluZyA9IHBvcnQuZ2V0RUJpbmRpbmcoKTsKKyAgICBlbnN1cmVFeHRlbnNpYmlsaXR5RWxlbWVudFJlbW92ZWQoYmluZGluZywgMik7CisgICAgCisgICAgLy8gQmluZGluZyBPcGVyYXRpb246IG9yaWdpbmFsIGlzIDIgYmVjYXVzZSBpdCBoYXMgPGFubm90YXRpb24+IGFuZCA8c29hcDpvcGVyYXRpb24+CisgICAgTGlzdCBiaW5kaW5nT3BlcmF0aW9ucyA9IGJpbmRpbmcuZ2V0QmluZGluZ09wZXJhdGlvbnMoKTsKKyAgICBCaW5kaW5nT3BlcmF0aW9uIGJpbmRpbmdPcGVyYXRpb24gPSAoQmluZGluZ09wZXJhdGlvbiliaW5kaW5nT3BlcmF0aW9ucy5nZXQoMCk7CisgICAgZW5zdXJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRSZW1vdmVkKGJpbmRpbmdPcGVyYXRpb24sIDIpOyAgICAKKyAgICAKKyAgICAvLyBCaW5kaW5nIElucHV0OiBvcmlnaW5hbCBpcyAyIGJlY2F1c2UgaXQgaGFzIDxhbm5vdGF0aW9uPiBhbmQgPHNvYXA6Ym9keT4KKyAgICBCaW5kaW5nSW5wdXQgYmluZGluZ0lucHV0ID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0lucHV0KCk7CisgICAgZW5zdXJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRSZW1vdmVkKGJpbmRpbmdJbnB1dCwgMik7CisgICAgCisgICAgLy8gQmluZGluZyBPdXRwdXQ6IG9yaWdpbmFsIGlzIDIgYmVjYXVzZSBpdCBoYXMgPGFubm90YXRpb24+IGFuZCA8c29hcDpib2R5PgorICAgIEJpbmRpbmdPdXRwdXQgYmluZGluZ091dHB1dCA9IGJpbmRpbmdPcGVyYXRpb24uZ2V0RUJpbmRpbmdPdXRwdXQoKTsKKyAgICBlbnN1cmVFeHRlbnNpYmlsaXR5RWxlbWVudFJlbW92ZWQoYmluZGluZ091dHB1dCwgMik7CisgICAgCisgICAgLy8gQmluZGluZyBGYXVsdDogb3JpZ2luYWwgaXMgMiBiZWNhdXNlIGl0IGhhcyA8YW5ub3RhdGlvbj4gYW5kIDxzb2FwOmZhdWx0PiAgICAKKyAgICBFTGlzdCBiaW5kaW5nRmF1bHRzID0gYmluZGluZ09wZXJhdGlvbi5nZXRFQmluZGluZ0ZhdWx0cygpOworICAgIEJpbmRpbmdGYXVsdCBiaW5kaW5nRmF1bHQgPSAoQmluZGluZ0ZhdWx0KWJpbmRpbmdGYXVsdHMuZ2V0KDApOworICAgIGVuc3VyZUV4dGVuc2liaWxpdHlFbGVtZW50UmVtb3ZlZChiaW5kaW5nRmF1bHQsIDIpOworICAgIAorICAgIC8vIFBvcnQgVHlwZQorICAgIFBvcnRUeXBlIHBvcnRUeXBlID0gYmluZGluZy5nZXRFUG9ydFR5cGUoKTsKKyAgICBlbnN1cmVFeHRlbnNpYmlsaXR5RWxlbWVudFJlbW92ZWQocG9ydFR5cGUsIDEpOworICAgIAorICAgIC8vIE9wZXJhdGlvbgorICAgIEVMaXN0IG9wZXJhdGlvbnMgPSBwb3J0VHlwZS5nZXRFT3BlcmF0aW9ucygpOworICAgIE9wZXJhdGlvbiBvcGVyYXRpb24gPSAoT3BlcmF0aW9uKSBvcGVyYXRpb25zLmdldCgwKTsKKyAgICBlbnN1cmVFeHRlbnNpYmlsaXR5RWxlbWVudFJlbW92ZWQob3BlcmF0aW9uLCAxKTsKKyAgICAKKyAgICAvLyBPdXRwdXQKKyAgICBPdXRwdXQgb3V0cHV0ID0gb3BlcmF0aW9uLmdldEVPdXRwdXQoKTsKKyAgICBlbnN1cmVFeHRlbnNpYmlsaXR5RWxlbWVudFJlbW92ZWQob3V0cHV0LCAxKTsKKyAgICAKKyAgICAvLyBJbnB1dAorICAgIElucHV0IGlucHV0ID0gb3BlcmF0aW9uLmdldEVJbnB1dCgpOworICAgIGVuc3VyZUV4dGVuc2liaWxpdHlFbGVtZW50UmVtb3ZlZChpbnB1dCwgMSk7CisgICAgCisgICAgLy8gZmF1bHQgCisgICAgRUxpc3QgZmF1bHRzID0gb3BlcmF0aW9uLmdldEVGYXVsdHMoKTsKKyAgICBGYXVsdCBmYXVsdCA9IChGYXVsdCkgZmF1bHRzLmdldCgwKTsKKyAgICBlbnN1cmVFeHRlbnNpYmlsaXR5RWxlbWVudFJlbW92ZWQoZmF1bHQsIDEpOworICAgIAorICAgIC8vIE1lc3NhZ2UKKyAgICBNZXNzYWdlIG1lc3NhZ2UgPSBpbnB1dC5nZXRFTWVzc2FnZSgpOworICAgIGVuc3VyZUV4dGVuc2liaWxpdHlFbGVtZW50UmVtb3ZlZChtZXNzYWdlLCAxKTsKKyAgICAKKyAgICAvLyBQYXJ0CisgICAgRUxpc3QgcGFydHMgPSBtZXNzYWdlLmdldEVQYXJ0cygpOworICAgIFBhcnQgcGFydCA9IChQYXJ0KSBwYXJ0cy5nZXQoMCk7CisgICAgZW5zdXJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRSZW1vdmVkKHBhcnQsIDEpOworICB9CisgIAorICAvKioKKyAgICogUmVtb3ZlIHRoZSBmaXJzdCBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQuIFRoZSBleHBlY3RlZCByZXN1bHQgaXMgb3JpZ2luYWwgc2l6ZSB3aWxsIGRlY3JlbWVudCBieSAxCisgICAqLworICBwcml2YXRlIHZvaWQgZW5zdXJlRXh0ZW5zaWJpbGl0eUVsZW1lbnRSZW1vdmVkKEV4dGVuc2libGVFbGVtZW50IGV4dGVuc2libGVFbGVtZW50LCBpbnQgb3JpZ2luYWxTaXplKSAKKyAgeworICAgIExpc3QgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzID0gZXh0ZW5zaWJsZUVsZW1lbnQuZ2V0RXh0ZW5zaWJpbGl0eUVsZW1lbnRzKCk7CisgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsU2l6ZSwgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzLnNpemUoKSk7CisgICAgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50IHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCA9IG51bGw7CisgICAgSXRlcmF0b3IgZXh0ZW5zaWJpbGl0eUVsZW1lbnRzSXRlcmF0b3IgPSBleHRlbnNpYmlsaXR5RWxlbWVudHMuaXRlcmF0b3IoKTsKKyAgICB3aGlsZSAoZXh0ZW5zaWJpbGl0eUVsZW1lbnRzSXRlcmF0b3IuaGFzTmV4dCgpKQorICAgIHsKKyAgICAgIE9iamVjdCBvYmplY3QgPSBleHRlbnNpYmlsaXR5RWxlbWVudHNJdGVyYXRvci5uZXh0KCk7CisgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgVW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50KSAKKyAgICAgIHsKKyAgICAgICAgdW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50ID0gKFVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudCkgb2JqZWN0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodW5rbm93bkV4dGVuc2liaWxpdHlFbGVtZW50ID09IG51bGwpIAorICAgIHsKKyAgICAgIGZhaWwoIkNhbm5vdCBmaW5kIHRoZSBVbmtub3duRXh0ZW5zaWJpbGl0eUVsZW1lbnQuIik7CisgICAgfQorICAgIEVsZW1lbnQgZWxlbWVudCA9IHVua25vd25FeHRlbnNpYmlsaXR5RWxlbWVudC5nZXRFbGVtZW50KCk7CisgICAgZXh0ZW5zaWJsZUVsZW1lbnQuZ2V0RWxlbWVudCgpLnJlbW92ZUNoaWxkKGVsZW1lbnQpOworICAgIGV4dGVuc2libGVFbGVtZW50LmVsZW1lbnRDaGFuZ2VkKGV4dGVuc2libGVFbGVtZW50LmdldEVsZW1lbnQoKSk7CisgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsU2l6ZSAtIDEsIGV4dGVuc2liaWxpdHlFbGVtZW50cy5zaXplKCkpOworICB9CisgIAorICBwdWJsaWMgdm9pZCB0ZXN0SW1wb3J0c1dpdGhOb25TdGFuZGFyZEZpbGVFeHRlbnNpb24oKSAKKyAgeworICAgIFN0cmluZyBXU0RMX05TID0gImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvSW1wb3J0V2l0aE5vblN0YW5kYXJkV1NETEZpbGVFeHRlbnNpb24vd3NkbDAvIjsgLy8kTk9OLU5MUy0xJCAKKyAgICBTdHJpbmcgWFNEX05TID0gImh0dHA6Ly93d3cuZXhhbXBsZS5vcmcvTm9uU3RhbmRhcmRTY2hlbWFGaWxlRXh0ZW5zaW9uL3hzZDAiOyAvLyROT04tTkxTLTEkIAorICAgIAorICAgIHRyeQorICAgIHsKKyAgICAgIC8vIGxvYWQgYSB3c2RsIHRoYXQgaW1wb3J0cyBhbm90aGVyIFdTREwgd2l0aCBub24tc3RhbmRhcmQgZmlsZSBleHRlbnNpb24gKC53c2RsMCkgd2hpY2ggaW4gdHVybgorICAgICAgLy8gaW1wb3J0cyBhIFhTRCB3aXRoIG5vbi1zdGFuZGFyZCBmaWxlIGV4dGVuc2lvbiAoLnhzZDApCisgICAgICAvLyBJbXBvcnRXaXRoTm9uU3RhbmRhcmRGaWxlRXh0ZW5zaW9uLndzZGwgYWxzbyBpbXBvcnRzIGEgWFNEIChOb25TdGFuZGFyZFNjaGVtYUZpbGVFeHRlbnNpb24ueHNkMSkgdXNpbmcgPHdzZGw6aW1wb3J0PgorICAgICAgRGVmaW5pdGlvbiBkZWZpbml0aW9uID0gRGVmaW5pdGlvbkxvYWRlci5sb2FkKFBMVUdJTl9BQlNPTFVURV9QQVRIICsgInNhbXBsZXMvQnVnRml4ZXMvSW1wb3J0c1dpdGhOb25TdGFuZGFyZEZpbGVFeHRlbnNpb24vSW1wb3J0V2l0aE5vblN0YW5kYXJkRmlsZUV4dGVuc2lvbi53c2RsIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKKyAgICAgIAorICAgICAgLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgdHdvIHZhbGlkIDx3c2RsOmltcG9ydD5zIC0gTm9uU3RhbmRhcmRXU0RMRmlsZUV4dGVuc2lvbi53c2RsMCBhbmQgTm9uU3RhbmRhcmRTY2hlbWFGaWxlRXh0ZW5zaW9uLnhzZDEKKyAgICAgIEVMaXN0IGltcG9ydHMgPSBkZWZpbml0aW9uLmdldEVJbXBvcnRzKCk7CisgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBudW1iZXIgb2YgaW1wb3J0cyIsIDIsIGltcG9ydHMuc2l6ZSgpKTsgLy8kTk9OLU5MUy0xJAorICAgICAgCisgICAgICAKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW1wb3J0cy5zaXplKCk7IGkrKykgeworICAgICAgICBJbXBvcnQgbXlJbXBvcnQgPSAoSW1wb3J0KSBpbXBvcnRzLmdldChpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5jb3JyZWN0IGltcG9ydGVkIG5hbWVzcGFjZSIsIFdTRExfTlMuZXF1YWxzKG15SW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpKSB8fCBYU0RfTlMuZXF1YWxzKG15SW1wb3J0LmdldE5hbWVzcGFjZVVSSSgpKSk7IC8vJE5PTi1OTFMtMSQgCisgICAgICAgIGlmIChXU0RMX05TLmVxdWFscyhteUltcG9ydC5nZXROYW1lc3BhY2VVUkkoKSkpIHsKKyAgICAgICAvLyBXU0RMIGltcG9ydDogbWFrZSBzdXJlIHRoZSBiaW5kaW5nIGluIHRoZSBpbXBvcnRlZCBOb25TdGFuZGFyZFdTRExGaWxlRXh0ZW5zaW9uLndzZGwwIGlzIHJlc29sdmVkCisgICAgICAgICAgRGVmaW5pdGlvbiBpbXBvcnRlZERlZmluaXRpb24gPSBteUltcG9ydC5nZXRFRGVmaW5pdGlvbigpOyAKKyAgICAgICAgICBhc3NlcnROb3ROdWxsKGltcG9ydGVkRGVmaW5pdGlvbik7CisgICAgICAgICAgTWFwIGJpbmRpbmdzID0gaW1wb3J0ZWREZWZpbml0aW9uLmdldEJpbmRpbmdzKCk7CisgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbnVtYmVyIG9mIGJpbmRpbmcgZWxlbWVudHMgaW4gaW1wb3J0ZWQgV1NETCIsIDEsIGJpbmRpbmdzLnNpemUoKSk7ICAvLyROT04tTkxTLTEkCisgICAgICAgICAgCisgICAgICAgICAgLy8gR28gdG8gdGhlIHJlc29sdmVkICJOZXdUeXBlIiBjb21wbGV4IHR5cGUgZWxlbWVudCBhbmQgcmVhZHMgaXRzIHRlc3RYU0QwIGF0dHJpYnV0ZSwgYW5kIHZlcmlmeSBpdCdzIGFjY2Vzc2libGUuIAorICAgICAgICAgIExpc3Qgc2NoZW1hcyA9IGltcG9ydGVkRGVmaW5pdGlvbi5nZXRFVHlwZXMoKS5nZXRTY2hlbWFzKCk7CisgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNjaGVtYXMuc2l6ZSgpKTsKKyAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gKFhTRFNjaGVtYSlzY2hlbWFzLmdldCgwKTsKKyAgICAgICAgICBFTGlzdCB0eXBlcyA9IHNjaGVtYS5nZXRUeXBlRGVmaW5pdGlvbnMoKTsKKyAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBudW1iZXIgb2YgdHlwZXMgZGVmaW5pdGlvbnMgaW4gdGhlIGlubGluZSBzY2hlbWEgb2YgdGhlIGltcG9ydGVkIFdTREwiLCAxLCB0eXBlcy5zaXplKCkpOyAgLy8kTk9OLU5MUy0xJAorICAgICAgICAgIE9iamVjdCB0eXBlID0gdHlwZXMuZ2V0KDApOworICAgICAgICAgIGFzc2VydFRydWUoIk5vdCBjb21wbGV4IHR5cGUiLCB0eXBlIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKTsKKyAgICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY29tcGxleFR5cGVEZWZpbml0aW9uID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgdHlwZTsKKyAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluY29ycmVjdCBuYW1lIGZvciB0aGUgQ29tcGxleFR5cGUgaW1wb3J0ZWQgZnJvbSBOb25TdGFuZGFyZFNjaGVtYUZpbGVFeHRlbnNpb24ueHNkMCIsICJOZXdUeXBlIiwgY29tcGxleFR5cGVEZWZpbml0aW9uLmdldE5hbWUoKSk7ICAvLyROT04tTkxTLTEkICROT04tTkxTLTIkCisgICAgICAgICAgU3RyaW5nIHRlc3RBdHRyaWJ1dGUgPSBjb21wbGV4VHlwZURlZmluaXRpb24uZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZSgidGVzdFhTRDAiKTsgIAorICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHRlc3QgYXR0cmlidXRlIGZvciB0aGUgQ29tcGxleFR5cGUgaW1wb3J0ZWQgZnJvbSBOb25TdGFuZGFyZFNjaGVtYUZpbGVFeHRlbnNpb24ueHNkMCIsICJwYXNzZWQiLCB0ZXN0QXR0cmlidXRlKTsgLy8kTk9OLU5MUy0xJCAkTk9OLU5MUy0yJAorICAgICAgICB9IGVsc2UgeworICAgICAgIC8vIHNjaGVtYSBpbXBvcnQ6IG1ha2Ugc3VyZSB0aGUgY29tcGxleCB0eXBlIGluIHRoZSBpbXBvcnRlZCBOb25TdGFuZGFyZFNjaGVtYUZpbGVFeHRlbnNpb24ueHNkMSBpcyByZXNvbHZlZAorICAgICAgICAgIC8vIEdvIHRvIHRoZSByZXNvbHZlZCAiSW1wb3J0ZWRUeXBlVmlhV1NETEltcG9ydCIgY29tcGxleCB0eXBlIGVsZW1lbnQgYW5kIHJlYWRzIGl0cyB0ZXN0WFNEMSBhdHRyaWJ1dGUsIGFuZCB2ZXJpZnkgaXQncyBhY2Nlc3NpYmxlLgorICAgICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBteUltcG9ydC5nZXRFU2NoZW1hKCk7CisgICAgICAgICAgRUxpc3QgdHlwZXMgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCk7CisgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmNvcnJlY3QgbnVtYmVyIG9mIHR5cGVzIGRlZmluaXRpb25zIGluIGltcG9ydGVkIFhTRCIsIDEsIHR5cGVzLnNpemUoKSk7ICAvLyROT04tTkxTLTEkCisgICAgICAgICAgCisgICAgICAgICAgT2JqZWN0IHR5cGUgPSB0eXBlcy5nZXQoMCk7CisgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm90IGNvbXBsZXggdHlwZSIsIHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pOworICAgICAgICAgIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbiBjb21wbGV4VHlwZURlZmluaXRpb24gPSAoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB0eXBlOworICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IG5hbWUgZm9yIHRoZSBDb21wbGV4VHlwZSBpbXBvcnRlZCBmcm9tIE5vblN0YW5kYXJkU2NoZW1hRmlsZUV4dGVuc2lvbi54c2QxIiwgIkltcG9ydGVkVHlwZVZpYVdTRExJbXBvcnQiLCBjb21wbGV4VHlwZURlZmluaXRpb24uZ2V0TmFtZSgpKTsgIC8vJE5PTi1OTFMtMSQgJE5PTi1OTFMtMiQKKyAgICAgICAgICBTdHJpbmcgdGVzdEF0dHJpYnV0ZSA9IGNvbXBsZXhUeXBlRGVmaW5pdGlvbi5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJ0ZXN0WFNEMSIpOyAgLy8kTk9OLU5MUy0xJAorICAgICAgICAgIGFzc2VydEVxdWFscygiSW5jb3JyZWN0IHRlc3QgYXR0cmlidXRlIGZvciB0aGUgQ29tcGxleFR5cGUgaW1wb3J0ZWQgZnJvbSBOb25TdGFuZGFyZFNjaGVtYUZpbGVFeHRlbnNpb24ueHNkMSIsICJwYXNzZWQiLCB0ZXN0QXR0cmlidXRlKTsgIC8vJE5PTi1OTFMtMSQgJE5PTi1OTFMtMiQKKyAgICAgICAgfQorICAgICAgfSAKKyAgICB9CisgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQorICAgIHsKKyAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICBmYWlsKCk7CisgICAgfSAgICAgIAorICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLy5jbGFzc3BhdGggYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzLy5jbGFzc3BhdGgKaW5kZXggMDk5OTA4ZS4uN2Q2ZDAwZiAxMDA2NDQKLS0tIGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy8uY2xhc3NwYXRoCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvLmNsYXNzcGF0aApAQCAtNCw2ICs0LDcgQEAKIAk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIvb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmRlYnVnLnVpLmxhdW5jaGVyLlN0YW5kYXJkVk1UeXBlL0oyU0UtMS40Ij4KIAkJPGFjY2Vzc3J1bGVzPgogCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2FwYWNoZS94ZXJjZXMvKioiLz4KKwkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49ImphdmF4L3htbC9uYW1lc3BhY2UvUU5hbWUiLz4KIAkJPC9hY2Nlc3NydWxlcz4KIAk8L2NsYXNzcGF0aGVudHJ5PgogCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyI+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9NRVRBLUlORi9NQU5JRkVTVC5NRgppbmRleCA2NDI5OTBjLi45OTMyMmNmIDEwMDY0NAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKQEAgLTEsOCArMSw4IEBACiBNYW5pZmVzdC1WZXJzaW9uOiAxLjAKIEJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKIEJ1bmRsZS1OYW1lOiAlX1BMVUdJTl9OQU1FCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwMworQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cztzaW5nbGV0b246PXRydWUKK0J1bmRsZS1WZXJzaW9uOiAxLjAuMjA0CiBCdW5kbGUtQ2xhc3NQYXRoOiB3c2RsdmFsaWRhdGV0ZXN0cy5qYXIKIEJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMuaW50ZXJuYWwuV1NETFZhbGlkYXRvclRlc3RzUGx1Z2luCiBCdW5kbGUtVmVuZG9yOiAlX1BST1ZJREVSX05BTUUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvYnVpbGQucHJvcGVydGllcyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvYnVpbGQucHJvcGVydGllcwppbmRleCAxYzlhNjg5Li5iNzE5ZGY2IDEwMDY0NAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL2J1aWxkLnByb3BlcnRpZXMKKysrIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9idWlsZC5wcm9wZXJ0aWVzCkBAIC0xNSw1ICsxNSw2IEBACiAgICAgICAgICAgICAgICB0ZXN0LnhtbCxcCiAgICAgICAgICAgICAgICBNRVRBLUlORi8sXAogICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcworICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAorICAgICAgICAgICAgICAgcGx1Z2luLnhtbAogc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9wbHVnaW4ueG1sIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9wbHVnaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZTdjNmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3BsdWdpbi54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjQiPz4KKzxwbHVnaW4+CisgICA8ZXh0ZW5zaW9uCisgICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi53c2RsMTF2YWxpZGF0b3IiPgorICAgICAgPHZhbGlkYXRvcgorICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMuaW50ZXJuYWwuU2ltcGxlRXh0ZW5zaW9uc1ZhbGlkYXRvciIKKyAgICAgICAgICAgIG5hbWVzcGFjZT0iaHR0cDovL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvRXh0ZW5zaW9ucyI+CisgICAgICA8L3ZhbGlkYXRvcj4KKyAgIDwvZXh0ZW5zaW9uPgorICAgPGV4dGVuc2lvbgorICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5jYXRhbG9nQ29udHJpYnV0aW9ucyI+CisgICAgICA8Y2F0YWxvZ0NvbnRyaWJ1dGlvbj4KKyAgICAgICAgIDx1cmkKKyAgICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL0V4dGVuc2lvbnMiCisgICAgICAgICAgICAgICB1cmk9InRlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0V4dGVuc2libGVFbGVtZW50cy9FeHRlbnNpb25zLnhzZCI+CisgICAgICAgICA8L3VyaT4KKyAgICAgIDwvY2F0YWxvZ0NvbnRyaWJ1dGlvbj4KKyAgIDwvZXh0ZW5zaW9uPgorPC9wbHVnaW4+CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3RleHQvV1NETFZhbGlkYXRlVGVzdC5qYXZhIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi9pbnRlcm5hbC91aS90ZXh0L1dTRExWYWxpZGF0ZVRlc3QuamF2YQppbmRleCBiNjQ1OGYyLi5mZDk3ZTU0IDEwMDY0NAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL2ludGVybmFsL3VpL3RleHQvV1NETFZhbGlkYXRlVGVzdC5qYXZhCisrKyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vaW50ZXJuYWwvdWkvdGV4dC9XU0RMVmFsaWRhdGVUZXN0LmphdmEKQEAgLTEsNSArMSw1IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQ29weXJpZ2h0IChjKSAyMDA2LCAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwogICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCiAgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdApAQCAtMTcsNiArMTcsOCBAQAogaW1wb3J0IG9yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24uaW50ZXJuYWwuSVZhbGlkYXRpb25SZXBvcnQ7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0aW9uTWVzc2FnZUltcGw7CiBpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLldTRExWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC5lY2xpcHNlLlVSSVJlc29sdmVyV3JhcHBlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuSUxvZ2dlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuTG9nZ2VyRmFjdG9yeTsKIGltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLmxvZ2dpbmcuU3RhbmRhcmRMb2dnZXI7CkBAIC0zMyw2ICszNSw5IEBACiAJewogCQlzdXBlci5zZXRVcCgpOwogCQl2YWxpZGF0ZSA9IG5ldyBXU0RMVmFsaWRhdGVXcmFwcGVyKCk7CisJCVdTRExWYWxpZGF0b3Igd3NkbFZhbGlkYXRvciA9IHZhbGlkYXRlLmdldFdTRExWYWxpZGF0b3IoKTsKKwkJVVJJUmVzb2x2ZXJXcmFwcGVyIHJlc29sdmVyID0gbmV3IFVSSVJlc29sdmVyV3JhcHBlcigpOworCQl3c2RsVmFsaWRhdG9yLmFkZFVSSVJlc29sdmVyKHJlc29sdmVyKTsKIAl9CiAKIAkvKiAobm9uLUphdmFkb2MpCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL3Rlc3RzL2ludGVybmFsL1NpbXBsZUV4dGVuc2lvbnNWYWxpZGF0b3IuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vdGVzdHMvaW50ZXJuYWwvU2ltcGxlRXh0ZW5zaW9uc1ZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NDkxYmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL3Rlc3RzL2ludGVybmFsL1NpbXBsZUV4dGVuc2lvbnNWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQ29weXJpZ2h0IChjKSAyMDA5IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscworICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCisgKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKKyAqIAorICogQ29udHJpYnV0b3JzOgorICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3BhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy5pbnRlcm5hbDsKKworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53c2RsLmV4dGVuc2lvbnMuRWxlbWVudEV4dGVuc2libGU7CitpbXBvcnQgamF2YXgud3NkbC5leHRlbnNpb25zLkV4dGVuc2liaWxpdHlFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLmludGVybmFsLndzZGwxMS5JV1NETDExVmFsaWRhdGlvbkluZm87CitpbXBvcnQgb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi5pbnRlcm5hbC53c2RsMTEuSVdTREwxMVZhbGlkYXRvcjsKKworCisvKioKKyAqIEFuIGV4dGVuc2lvbnMgdmFsaWRhdG9yIHVzZWQgdG8gdGVzdCB0aGF0IGEgcmVnaXN0ZXJlZCBleHRlbnNpb25zIAorICogdmFsaWRhdG9yIGlzIGNhbGxlZCBieSB0aGUgbWFpbiBXU0RMIDEuMSB2YWxpZGF0b3Igd2hlbiB2YWxpZGF0aW5nCisgKiBkZWZpbml0aW9ucyBsZXZlbCBleHRlbnNpYmlsaXR5IGVsZW1lbnRzLgorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlRXh0ZW5zaW9uc1ZhbGlkYXRvciBpbXBsZW1lbnRzIElXU0RMMTFWYWxpZGF0b3IKK3sKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlNfVVJJID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL0V4dGVuc2lvbnMiOyAvLyROT04tTkxTLTEkCisKKyAgcHVibGljIHZvaWQgdmFsaWRhdGUoT2JqZWN0IGVsZW1lbnQsIExpc3QgcGFyZW50cywgSVdTREwxMVZhbGlkYXRpb25JbmZvIHZhbEluZm8pCisgIHsKKyAgICBFeHRlbnNpYmlsaXR5RWxlbWVudCBleHRlbnNpYmlsaXR5RWxlbWVudCA9IChFeHRlbnNpYmlsaXR5RWxlbWVudCllbGVtZW50OworICAgIFFOYW1lIGVsZW1lbnRUeXBlID0gZXh0ZW5zaWJpbGl0eUVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKTsKKyAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gZWxlbWVudFR5cGUuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgCisgICAgaWYgKHBhcmVudHMuaXNFbXB0eSgpIHx8ICEocGFyZW50cy5nZXQoMCkgaW5zdGFuY2VvZiBFbGVtZW50RXh0ZW5zaWJsZSkpCisgICAgeworICAgICAgdmFsSW5mby5hZGRXYXJuaW5nKCJUaGUgY3VycmVudCBwYXJlbnQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBleHRlbnNpYmlsaXR5IGVsZW1lbnRzLiIsIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCisgICAgfQorICAgIAorICAgIGlmIChOU19VUkkuZXF1YWxzKG5hbWVzcGFjZVVSSSkpCisgICAgeworICAgICAgdmFsSW5mby5hZGRXYXJuaW5nKCJUaGUgdGVzdCBleHRlbnNpb25zIHZhbGlkYXRvciBnb3QgY2FsbGVkLiIsIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICB2YWxJbmZvLmFkZEVycm9yKCJCYWQgZXh0ZW5zaWJpbGl0eSBlbGVtZW50IG5hbWVzcGFjZS4iLCBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAorICAgIH0KKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vdGVzdHMvaW50ZXJuYWwvV1NETFRlc3QuamF2YSBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC93c2RsL3ZhbGlkYXRpb24vdGVzdHMvaW50ZXJuYWwvV1NETFRlc3QuamF2YQppbmRleCBkZTllN2UyLi5jMjMwYmE2IDEwMDY0NAotLS0gYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvd3NkbC92YWxpZGF0aW9uL3Rlc3RzL2ludGVybmFsL1dTRExUZXN0LmphdmEKKysrIGIvdGVzdHMvb3JnLmVjbGlwc2Uud3N0LndzZGwudmFsaWRhdGlvbi50ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3dzZGwvdmFsaWRhdGlvbi90ZXN0cy9pbnRlcm5hbC9XU0RMVGVzdC5qYXZhCkBAIC02NzcsNCArNjc3LDE3IEBACiAgICAgCiAgICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOwogICB9CisKKyAgLyoqCisgICAqIFRlc3QgL1dTREwvRXh0ZW5zaWJsZUVsZW1lbnRzL0V4dGVuc2libGVEZWZpbml0aW9ucy53c2RsCisgICAqLworICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaWJsZURlZmluaXRpb25zKCkKKyAgeworICAgIFN0cmluZyB0ZXN0bmFtZSA9ICJFeHRlbnNpYmxlRGVmaW5pdGlvbnMiOworICAgIFN0cmluZyB0ZXN0ZmlsZSA9IEZJTEVfUFJPVE9DT0wgKyBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIFNBTVBMRVNfRElSICsgV1NETF9ESVIgKyAiRXh0ZW5zaWJsZUVsZW1lbnRzLyIgKyB0ZXN0bmFtZSArICIud3NkbCI7CisgICAgU3RyaW5nIGxvZ2xvY2F0aW9uID0gUExVR0lOX0FCU09MVVRFX1BBVEggKyBHRU5FUkFURURfUkVTVUxUU19ESVIgKyBXU0RMX0RJUiArICJFeHRlbnNpYmxlRWxlbWVudHMvIiArIHRlc3RuYW1lICsgIi53c2RsLWxvZyI7CisgICAgU3RyaW5nIGlkZWFsbG9nbG9jYXRpb24gPSBQTFVHSU5fQUJTT0xVVEVfUEFUSCArIElERUFMX1JFU1VMVFNfRElSICsgV1NETF9ESVIgKyAiRXh0ZW5zaWJsZUVsZW1lbnRzLyIgKyB0ZXN0bmFtZSArICIud3NkbC1sb2ciOworCisgICAgcnVuVGVzdCh0ZXN0ZmlsZSwgbG9nbG9jYXRpb24sIGlkZWFsbG9nbG9jYXRpb24pOworICB9CiB9CmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvRXh0ZW5zaWJsZUVsZW1lbnRzL0V4dGVuc2libGVEZWZpbml0aW9ucy53c2RsLWxvZyBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9pZGVhbFJlc3VsdHMvV1NETC9FeHRlbnNpYmxlRWxlbWVudHMvRXh0ZW5zaWJsZURlZmluaXRpb25zLndzZGwtbG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOGU5NWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvaWRlYWxSZXN1bHRzL1dTREwvRXh0ZW5zaWJsZUVsZW1lbnRzL0V4dGVuc2libGVEZWZpbml0aW9ucy53c2RsLWxvZwpAQCAtMCwwICsxLDggQEAKK251bWJlciBvZiBlcnJvcnMgICAgICA6IDAKK251bWJlciBvZiB3YXJuaW5ncyAgICA6IDEKKworLS0tLS0tLS0tLS0tZXJyb3IgbGlzdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyhub25lKQorLS0tLS0tLS0tLS0td2FybmluZyBsaXN0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZSB0ZXN0IGV4dGVuc2lvbnMgdmFsaWRhdG9yIGdvdCBjYWxsZWQuIFs4LCA0MF0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0V4dGVuc2libGVFbGVtZW50cy9FeHRlbnNpYmxlRGVmaW5pdGlvbnMud3NkbCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvRXh0ZW5zaWJsZUVsZW1lbnRzL0V4dGVuc2libGVEZWZpbml0aW9ucy53c2RsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YzJmZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0V4dGVuc2libGVFbGVtZW50cy9FeHRlbnNpYmxlRGVmaW5pdGlvbnMud3NkbApAQCAtMCwwICsxLDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8d3NkbDpkZWZpbml0aW9ucyBuYW1lPSJFeHRlbnNpYmxlRGVmaW5pdGlvbnMiCisJdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0V4dGVuc2libGVEZWZpbml0aW9ucy8iCisJeG1sbnM6dG5zPSJodHRwOi8vd3d3LmV4YW1wbGUub3JnL0V4dGVuc2libGVEZWZpbml0aW9ucy8iIAorCXhtbG5zOndzZGw9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvIgorCXhtbG5zOmV4dD0iaHR0cDovL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvRXh0ZW5zaW9ucyI+CisJPHdzZGw6ZG9jdW1lbnRhdGlvbj5UZXN0aW5nIHRoZSB2YWxpZGF0aW9uIG9mIGRlZmluaXRpb25zIGxldmVsIGV4dGVuc2liaWxpdHkgZWxlbWVudHMuPC93c2RsOmRvY3VtZW50YXRpb24+CisJPGV4dDp0ZXN0RXh0ZW5zaW9uIHRlc3RBdHRyaWJ1dGU9IjEwIj50ZXN0PC9leHQ6dGVzdEV4dGVuc2lvbj4KKzwvd3NkbDpkZWZpbml0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0V4dGVuc2libGVFbGVtZW50cy9FeHRlbnNpb25zLnhzZCBiL3Rlc3RzL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvdGVzdHJlc291cmNlcy9zYW1wbGVzL1dTREwvRXh0ZW5zaWJsZUVsZW1lbnRzL0V4dGVuc2lvbnMueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYzM3OTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL3Rlc3RyZXNvdXJjZXMvc2FtcGxlcy9XU0RML0V4dGVuc2libGVFbGVtZW50cy9FeHRlbnNpb25zLnhzZApAQCAtMCwwICsxLDE2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHhzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKwl0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9vcmcuZWNsaXBzZS53c3Qud3NkbC52YWxpZGF0aW9uLnRlc3RzL0V4dGVuc2lvbnMiIAorCXhtbG5zOnRucz0iaHR0cDovL29yZy5lY2xpcHNlLndzdC53c2RsLnZhbGlkYXRpb24udGVzdHMvRXh0ZW5zaW9ucyIKKwllbGVtZW50Rm9ybURlZmF1bHQ9InF1YWxpZmllZCI+CisKKwk8eHNkOmVsZW1lbnQgbmFtZT0idGVzdEV4dGVuc2lvbiI+CisJCTx4c2Q6Y29tcGxleFR5cGU+CisJCQk8eHNkOnNpbXBsZUNvbnRlbnQ+CisJCQkJPHhzZDpleHRlbnNpb24gYmFzZT0ieHNkOnN0cmluZyIgPgorCQkJCQk8eHNkOmF0dHJpYnV0ZSBuYW1lPSJ0ZXN0QXR0cmlidXRlIiB0eXBlPSJ4c2Q6aW50ZWdlciIgLz4KKwkJCQk8L3hzZDpleHRlbnNpb24+CisJCQk8L3hzZDpzaW1wbGVDb250ZW50PgorCQk8L3hzZDpjb21wbGV4VHlwZT4KKwk8L3hzZDplbGVtZW50PgorPC94c2Q6c2NoZW1hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK